一、实验目的

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的两种流水效果,按题目要求,两个按键,可以呈现(开,开)(开,关)(关,开)(关,关)四种状态,两种流水模式分别对应两种状态,暂停情况对应剩余两种状态,通过扫描按键状态的变化来确定下一时刻的工作模式,检测到按键变化时跳出当前状态进入下一轮扫描来达到题目要求。

  1. 根据所设计的程序顶层结构,对主函数、中断函数、关键功能子函数的设计思路进行简单描述,并给出各函数的流程图

程序主要分为:主函数,初始化函数,流水模式函数,暂停函数,按键扫描函数,状态查询函数。

在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实验(以流水灯为例)相关推荐

  1. 【STM32 嵌入式课程实验】实验二 流水灯控制

    实验二 流水灯控制 2.1 系统功能 使用STM32板载的八个LED灯,实现流水灯功能. 2.2系统组成 由STM32开发板及板上的LED灯组成,STM32为STM32F103RB芯片的NANO版本, ...

  2. c语言流水灯仿真程序设计框图,基于单片机c语言控制的流水灯程序设计及prtes仿真图.docx...

    基于单片机c语言控制的流水灯程序设计及prtes仿真图 89c51与8个发光二极管相连流水控制 一.不同花样的控制源程序代码: /*#include #define uchar unsigned ch ...

  3. 从左到右的流水灯单片机课程设计实验报告c语言版,流水灯_单片机课程设计-实验-LED流水灯.doc...

    实验 LED流水灯 P0口作输出口,经74LS244驱动,接8只发光二极管LED0-LED7.当单片机的引脚输出为低电平时发光二极管点亮,为高电平时息灭.编写程序,使8个发光二极管循环点亮,时间间隔约 ...

  4. ARM实验1 —— 流水灯实验

    实验内容: 编写GPIO模块程序,实现对FS_4412平台的上的led2,led3,led4 ,led5,的流水灯实现. 实验目的: 熟悉开发环境的使用. 掌握Exynos 4412处理器GPIO功能 ...

  5. 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简介 三.硬件 ...

  6. 基于Verilog-HDL实现会呼吸的流水灯

    本文之前写的结合基于Verilog实现呼吸灯以及至芯很久之前的视频,在腾讯课堂,免费的.实现了会呼吸的流水灯(纯粹感觉挺好玩的,工程以及实现的思路 关注公众号:果冻空间 回复:others-002 即 ...

  7. 使用CCS调试CC3200芯片GPIO接口应用----流水灯程序

    GPIO引脚说明 CC3200芯片共有四组引脚A0-A4,每一组GPIO有8个端口,一共32个端口.因为CC3200芯片使用了引脚复用技术,每一个引脚基本都有7.8种功能,所以32个引脚就包含了非常多 ...

  8. 【造物笔记】基于51单片机的心形流水灯

    记录一下首个独立完成的小项目(虽然没有什么技术含量) 硬件方面:入门级的单片机点灯电路 软件方面:主要利用了c语言的位操作 整个项目的下载链接放在了文章最后 一.成品展示 正面 反面 二.元器件清单 ...

  9. 基于汇编和C语言STM32流水灯依次闪烁

    目录 一.初始化 1.地址映射和寄存器映射 1.1 总线基地址 1.2 外设基地址 1.3 外设寄存器地址 1.4接线 1.4.1 将串口USB转TTL线与stm32核心板连接如图所示 1.4.2 并 ...

最新文章

  1. Windows 10下 Visual Studio Code (VSCode) 和 TypeScript 入门
  2. python学习笔记(十)——迭代器和生成器(外加import功能)
  3. python(matplotlib2)——legend图例,Annotation图片注解
  4. SQL Server返回当前实例系统日期和时间的函数
  5. python对数字进行简单的可逆加密_Python实现简单的可逆加密程序实例
  6. 网站SEO域名、URL路径优化
  7. Robotium测试报告的生成方法(下)
  8. 文件大小图形化软件 SpaceSniffer(转载)
  9. 如何从zabbix数据库中获取每日流量最大值
  10. [高频电子线路]-避免从第一章开始懵逼
  11. Mac M1安装pycharm专业版,幼儿教学
  12. Android Studio设置关闭当前页面的快捷键ctrl+w
  13. CCCF精选 | 李德毅:机器如何像人一样认知——机器的生命观
  14. Python3.7中,Django配置MySql数据库
  15. 夏日“轻”凉小贴士,华为FreeBuds 4全给你
  16. slf4j无法写入日志文件问题
  17. 兄弟2260激光打印机硒鼓灯常亮
  18. [游戏技术]求生之路服务器参数配置
  19. Tomcat启动报A child container failed during start问题解决
  20. js-只能输入数字(正则)

热门文章

  1. python培训大概要学多久
  2. <论文阅读> 基于 Warping 理论的高精度光流估计 (计算机视觉 - ECCV 2004)
  3. APS中生产计划排程基本原理以及具体步骤介绍
  4. Mac系统如何锁屏?(两种方法)
  5. .Net Core 微服务使用Polly实现熔断、降级、超时、重试
  6. C语言二维数组形参问题
  7. 1.用Python写了一个进销存管理的软件~需求分析界面设计数据库设计技术路线选择~
  8. opencv从内存缓冲区中读取图像数据
  9. finally的作用
  10. (C语言)练习3——压岁钱