基于Atmega16的GPIO实验(以流水灯为例)
一、实验目的
1. 掌握AVR单片机开发平台的搭建方法。
2. 掌握GPIO的编程方法。
二、实验内容
1. 验证课堂例题
编译下载运行课堂例题——“LED流水灯”和“按键控制LED亮灭”,查看运行结果。
2. 设计程序
参考上述例题的编程思路,在图1-1所示电路中实现“按键控制流水灯样式”的程序编写与调试。
具体要求如下:
(1)初始状态下,所有LED灯点亮;
(2)K1为启/停键,按下后控制LED流水灯按照当前指定样式运行或停止;
(3)K2为流水灯样式选择键,分两种样式,默认为样式1。每次按下K2当前样式立即转变。
样式1:每次仅一个LED熄灭,熄灭LED从L0至L7转移,如此循环运行。
样式2:每次仅一个LED熄灭,熄灭LED从L7至L0转移,如此循环运行。
在设计报告中,需进行总体设计思路描述,给出所涉及到的主程序、中断程序、关键功能子函数的流程图和设计代码。描述程序调试结果及出现的问题。
图1-1 实验电路图
3. 实验结果
(1)描述所设计程序(“按键控制流水灯样式”)的总体设计思路
在不使用中断的前提下,为了实现LED的两种流水效果,按题目要求,两个按键,可以呈现(开,开)(开,关)(关,开)(关,关)四种状态,两种流水模式分别对应两种状态,暂停情况对应剩余两种状态,通过扫描按键状态的变化来确定下一时刻的工作模式,检测到按键变化时跳出当前状态进入下一轮扫描来达到题目要求。
- 根据所设计的程序顶层结构,对主函数、中断函数、关键功能子函数的设计思路进行简单描述,并给出各函数的流程图
程序主要分为:主函数,初始化函数,流水模式函数,暂停函数,按键扫描函数,状态查询函数。
在IO口初始化函数中,将PORTB口全部设设置为输出模式来控制流水灯的亮灭;将PA2设置为输出模式来控制三极管的开关;将PD2,3设置为输入模式并使能上拉电阻,配合按键来实现状态转换。
在流水模式函数中,通过for循环搭配左移和右移命令实现正向流水以及反向流水。
在暂停函数中,通过按键状态进入死循环,直至按键状态再次发生变化时跳出死循环以此实现暂停的目的。
在判断函数中,通过扫描两个按键的标志位的变化,以此判断按键所对应的状态。(开,开)状态3;(开,关)状态2;(关,关)状态0;(关,开)状态1;
图1-2-2 判断函数流程图
在主函数中,首先调用初始化函数并将PA口全部置于低电平即满足于题目要求默认全亮;之后判断按键1是否按下,按下后进入流水模式;之后开始扫描按键状态,通过状态确定运行模式,即:状态2正向流水;状态3反向流水;状态1暂停;状态0暂停;且每次按键发生变化时跳出当前模式并重新扫描。
主函数流程图如下图所示
图1-2-3 实验流程图
实验代码:
#include <iom16v.h>
#include <macros.h>
#define uchar unsigned char
#define uint unsigned intunsigned int flag1=0; //定义按键状态标志位1
unsigned int flag2=0; //定义按键模式标志位2
unsigned int i,state; //定义计数变量和模式变量void delay(unsigned int ms) //定义延时函数
{unsigned int p,q;for(p=0;p<ms;p++){for(q=0;q<1141;q++);if(PIND!=0xff)break;}
} void Init(void) //IO初始化函数
{ DDRA|=BIT(2); //PA2设置为输出PORTA&=~BIT(2); //PA2输出低电平导通三极管DDRB=0xFF; //PB设置为输出模式DDRD = 0x00; //配置PD输入模式PORTD = 0xFF; //配置PD上拉电阻
}void LED_1(void) //流水模式1:每次仅一个LED熄灭,熄灭LED从L0至L7转移,如此循环运行
{uchar i,temp;DDRB=0xFF;temp=0x01;for(i=0;i<8;i++){PORTB=temp;temp<<=1;delay(30); //每次流水延时时间if(PIND==0B11111110)break; //检测按键1:如果按下则跳出循环if(PIND==0B11111101)break; //检测按键2:如果按下则跳出循环}
}void LED_2(void) //流水模式2:每次仅一个LED熄灭,熄灭LED从L7至L0转移,如此循环运行
{uchar i,temp;DDRB=0xFF;temp=0x80;for(i=0;i<8;i++){PORTB=temp;temp>>=1;delay(30); //每次流水延时时间if(PIND==0B11111110)break; //检测按键1:如果按下则跳出循环if(PIND==0B11111101)break; //检测按键2:如果按下则跳出循环 }}void suspend(void) //定义暂停函数
{while(flag1==0) //当开关1为打开状态时,死循环以暂停{if(PIND==0B11111110)break; //当开关1再次按下时跳出循环}
}void key_scan1(void) //定义按键1扫描函数
{if(PIND==0B11111110) //检测按键1是否被按下{ delay(10); //延时消抖 flag1=~flag1 ; //按键1标志位取反}while(PIND==0B11111110); //判断按键1松开
}void key_scan2(void) //定义按键1扫描函数
{if(PIND==0B11111101) //检测按键1是否被按下{ delay(10); //延时消抖flag2=~flag2; //按键2标志位取反}while(PIND==0B11111101); //判断按键1松开
}void key_state(void) //判断状态函数
{key_scan1(); //扫描按键1key_scan2(); //扫描按键2if(flag1==0){ if(flag2==0) state=0; //如果两个按键标志位分别为0,0,则为模式0elsestate=1; //如果两个按键标志位分别为0,1,则为模式1}else { if(flag2==0)state=2; //如果两个按键标志位分别为1,0,则为模式2elsestate=3; //如果两个按键标志位分别为1,1,则为模式1}
}void main(void) //主函数
{ Init(); //执行初始化程序while(flag1==0) //当按键1未被按下,即初始状态,按键1被按下时,进入主循环{ PORTB=0x00; //低电平,点亮所有LEDkey_scan1(); //扫描按键1key_scan2(); //扫描按键2}while(1) //主循环 {key_state(); //判断下一时刻状态模式if(state==0) //如果为模式0,即开关1被断开suspend(); //调用暂停函数else if(state==1) //如果为模式1,即开关1被断开suspend(); //调用暂停函数else if(state==2) //如果为模式2,即开关1被闭合,且开关2断开LED_1(); //调用流水模式1,即每次仅一个LED熄灭,熄灭LED从L0至L7转移,如此循环运行else //如果为模式2,即开关1被闭合,且开关2闭合LED_2(); //调用流水模式2,即每次仅一个LED熄灭,熄灭LED从L7至L0转移,如此循环运行}
}
基于Atmega16的GPIO实验(以流水灯为例)相关推荐
- 【STM32 嵌入式课程实验】实验二 流水灯控制
实验二 流水灯控制 2.1 系统功能 使用STM32板载的八个LED灯,实现流水灯功能. 2.2系统组成 由STM32开发板及板上的LED灯组成,STM32为STM32F103RB芯片的NANO版本, ...
- c语言流水灯仿真程序设计框图,基于单片机c语言控制的流水灯程序设计及prtes仿真图.docx...
基于单片机c语言控制的流水灯程序设计及prtes仿真图 89c51与8个发光二极管相连流水控制 一.不同花样的控制源程序代码: /*#include #define uchar unsigned ch ...
- 从左到右的流水灯单片机课程设计实验报告c语言版,流水灯_单片机课程设计-实验-LED流水灯.doc...
实验 LED流水灯 P0口作输出口,经74LS244驱动,接8只发光二极管LED0-LED7.当单片机的引脚输出为低电平时发光二极管点亮,为高电平时息灭.编写程序,使8个发光二极管循环点亮,时间间隔约 ...
- ARM实验1 —— 流水灯实验
实验内容: 编写GPIO模块程序,实现对FS_4412平台的上的led2,led3,led4 ,led5,的流水灯实现. 实验目的: 熟悉开发环境的使用. 掌握Exynos 4412处理器GPIO功能 ...
- 51单片机 | 点亮第一个LED | LED 闪烁实验 | LED流水灯实验
文章目录 一.51单片机GPIO介绍 1.GPIO概念 2.GPIO 结构框图与工作原理 2.1 P0端口 2.2 P1端口 2.3 P2端口 2.4 P3端口 2.5 要点 二.LED简介 三.硬件 ...
- 基于Verilog-HDL实现会呼吸的流水灯
本文之前写的结合基于Verilog实现呼吸灯以及至芯很久之前的视频,在腾讯课堂,免费的.实现了会呼吸的流水灯(纯粹感觉挺好玩的,工程以及实现的思路 关注公众号:果冻空间 回复:others-002 即 ...
- 使用CCS调试CC3200芯片GPIO接口应用----流水灯程序
GPIO引脚说明 CC3200芯片共有四组引脚A0-A4,每一组GPIO有8个端口,一共32个端口.因为CC3200芯片使用了引脚复用技术,每一个引脚基本都有7.8种功能,所以32个引脚就包含了非常多 ...
- 【造物笔记】基于51单片机的心形流水灯
记录一下首个独立完成的小项目(虽然没有什么技术含量) 硬件方面:入门级的单片机点灯电路 软件方面:主要利用了c语言的位操作 整个项目的下载链接放在了文章最后 一.成品展示 正面 反面 二.元器件清单 ...
- 基于汇编和C语言STM32流水灯依次闪烁
目录 一.初始化 1.地址映射和寄存器映射 1.1 总线基地址 1.2 外设基地址 1.3 外设寄存器地址 1.4接线 1.4.1 将串口USB转TTL线与stm32核心板连接如图所示 1.4.2 并 ...
最新文章
- Windows 10下 Visual Studio Code (VSCode) 和 TypeScript 入门
- python学习笔记(十)——迭代器和生成器(外加import功能)
- python(matplotlib2)——legend图例,Annotation图片注解
- SQL Server返回当前实例系统日期和时间的函数
- python对数字进行简单的可逆加密_Python实现简单的可逆加密程序实例
- 网站SEO域名、URL路径优化
- Robotium测试报告的生成方法(下)
- 文件大小图形化软件 SpaceSniffer(转载)
- 如何从zabbix数据库中获取每日流量最大值
- [高频电子线路]-避免从第一章开始懵逼
- Mac M1安装pycharm专业版,幼儿教学
- Android Studio设置关闭当前页面的快捷键ctrl+w
- CCCF精选 | 李德毅:机器如何像人一样认知——机器的生命观
- Python3.7中,Django配置MySql数据库
- 夏日“轻”凉小贴士,华为FreeBuds 4全给你
- slf4j无法写入日志文件问题
- 兄弟2260激光打印机硒鼓灯常亮
- [游戏技术]求生之路服务器参数配置
- Tomcat启动报A child container failed during start问题解决
- js-只能输入数字(正则)