52单片机独立按键控制流水灯LED流水灯

豆丁微信公众号
君,已阅读到文档的结尾了呢~~
广告剩余8秒
文档加载中
单片机课程改革设计改革,设计,课程,单片机,课程设计,单片机课程,单片机设计
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
单片机课程改革设计
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='http://www.docin.com/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口独立按键控制流水灯、蜂鸣器
11:57:35来源: 51hei 关键字:&&&&
sbit KEY1=P2^0;
sbit KEY2=P2^1;
sbit KEY3=P2^2;
sbit KEY4=P2^3;
sbit BELL=P2^4;
sbit RED1=P1^0;
sbit YEL1=P1^1;
sbit GRE1=P1^2;
sbit RED2=P1^3;
sbit YEL2=P1^4;
sbit GRE2=P1^5;
sbit RED3=P1^6;
sbit YEL3=P1^7;
sbit GRE3=P3^0;
sbit RED4=P3^1;
sbit YEL4=P3^2;
sbit GRE4=P3^3;
#define uint unsigned int
void Delay(uint);
void Key();
void Bell(uint);
void main()
void Key()
if(KEY1==0 || KEY2==0 || KEY3==0 || KEY4==0)
& Delay(2);&&&& //20??????????&????&??????
& if(KEY1 == 0)
&& RED1=0;
&& RED2=0;
&& RED3=0;
&& RED4=0;
&& Bell(10);
& else if(KEY2 == 0)
&& YEL1=0;
&& YEL2=0;
&& YEL3=0;
&& YEL4=0;
&& Bell(10);
& else if(KEY3 == 0)
&& GRE1=0;
&& GRE2=0;
&& GRE3=0;
&& GRE4=0;
&& Bell(10);
&& RED1=0;
&& RED2=0;
&& RED3=0;
&& RED4=0;
&& YEL1=0;
&& YEL2=0;
&& YEL3=0;
&& YEL4=0;
&& GRE1=0;
&& GRE2=0;
&& GRE3=0;
&& GRE4=0;
&& Bell(10);
& Delay(50);&& //??????&0.5????????????????????????&????&??????&????
&&&& RED2=1;
void Bell(uint a)
for(b=100;b>0;b--)
& Delay(a);
& Delay(a);
void Delay(uint z)
for(x=100;x>0;x--)
& for(y=z;y>0;y--);
关键字:&&&&
编辑:什么鱼
引用地址:
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。
关注eeworld公众号快捷获取更多信息
关注eeworld服务号享受更多官方福利
相关关键词
热门关键词
大学堂最新课程
汇总了TI汽车信息娱乐系统方案、优质音频解决方案、汽车娱乐系统和仪表盘参考设计相关的文档、视频等资源
热门资源推荐
频道白皮书
何立民专栏
北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。按键控制流水灯程序
单片机&嵌入式
单片机应用
嵌入式操作系统
学习工具&教程
学习和开发单片机的必备工具
(有问必答)
(带你轻松入门)
电子元件&电路模块
当前位置: >>
>> 浏览文章
按键控制流水灯程序
&&&&& 最近有很多学弟来问我流水灯该怎么做,程序怎么写,现在在这里统一说下,很多时候没有时间让你们白跑一趟了,O(&_&)O~。
&&&&& 首先就说到单片机了,单片机对于你们来说是个新概念,可能以前都没听说过。我想说的是它不是传统意义上的集成电路,只能按照特定的焊接来能工作,而是一块类似电脑CPU的芯片,对于一块正常的单片机,只要你提供合适的工作电源(4V都5.5V左右)、复位电路 、起振电路它就可以工作了。所有的输入输出口(以P开头的)都是可以灵活配置的,可以根据你焊接的硬件电路写程序,也可以根据你写的程序焊接硬件电路。所以没有必要死板硬套。前天没事写了一下,仿真了一下还可以用。源码贴于下方供入门者参考,高手勿嘲笑,大家都是从流水灯程序写起的 (*^__^*) 嘻嘻&&
&&&&& 再就是我的51开发板不知道是谁借走了,很久没有用过51单片机了,所以下载程序的事就不要来找我了。我把编译过后的代码也贴在下面,如果硬件和我做的一样的同学又不会写程序的就直接复制下面编译过后的代码,在电脑上新建一个文本文档(.txt)命名任意,将复制后的代码粘贴于记事本上,然后重命名,将&.txt&改为&.hex&,保存,然后通过下载器下载到单片机里面去就可以用了。
&&&&& 不会的多去 看一下教程。以下仅供参考,不得一味模仿&&&&&&&
/***************************************************************************************************************
晶振频率12Mhz
八位数码管采用共阳极接法(所有阳极接一起接Vcc,阴极接P0口)
按键分别接P2.0& P2.1& P2.2(低电平有效)
编译软件采用keil 4
*******************************************************************************************************************************************************/
#include &reg52.h&
#define uint unsigned int
#define uchar unsigned char
sbit key1 =P2^0; //按键1
sbit key2 =P2^1; //按键2
sbit key3 =P2^2; //按键3
uchar flag1=0,flag2=0,flag3=0;
void delay_ms(uint z)
&&&& uint i,j;
&&&& for(i=0;i&z;i++)
&&&& for(j=0;j&110;j++);
void O_to_E() //1,3,5,7与2,4,6,8交替闪烁
&&&& P0=0X
&&&& delay_ms(200);
&&&& P0=~0X
&&&& delay_ms(200);
void key_scan()&&& //键盘扫描
&&&& if(!key1)
&&&&&&&&& delay_ms(10); //延时消抖
&&&&&&&&& if(!key1)
&&&&&&&&& flag1=1;
&&&& if(!key2)
&&&&&&&&& delay_ms(10); //延时消抖
&&&&&&&&& if(!key2)
&&&&&&&&&& flag2=1;
&&&&&&&& }
&&&& if(!key3)
&&&&&&&&& delay_ms(10); //延时消抖
&&&&&&&&& if(!key3)
&&&&&&&&&& flag3=1;
void main()
&&&& while(1)
&&&&&&&&&&& key_scan();
&&&&&&&&&&& if(flag1)&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& //按键一按下?&&&&&&&&&&&&&&&
&&&&&&&&&&& {
&&&&&&&&&&&&&&&&&& for(i=0;i&8;i++)&&&&&&&&&&& //从左至右亮,每次一盏&&&&&&&&&&&
&&&&&&&&&&&&&&&&&& {
&&&&&&&&&&&&&&&&&&&&&&&&&&& P0=~(0x80&&i);
&&&&&&&&&&&&&&&&&&&&&&&&&&& delay_ms(100);
&&&&&&&&&&&&&&&&&&&&&&&&&&& key_scan();&&&&&&&&&&&&&&&& //按键扫描&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&& if(flag2||flag3){flag1=0;}&&&&&&& //如果有其它按键按下响应其它按键
&&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&& }
&&&&&&&&&&&& if(flag2)&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& //按键一按下?&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&& {
&&&&&&&&&&&&&&&&&&& for(i=0;i&8;i++)&&&&&&&&&&&& //从右至左亮,每次一盏&
&&&&&&&&&&&&&&&&&& {
&&&&&&&&&&&&&&&&&&&&&&&&&&& P0=~(0x01&&i);
&&&&&&&&&&&&&&&&&&&&&&&&&&& delay_ms(100);
&&&&&&&&&&&&&&&&&&&&&&&&&&& key_scan();
&&&&&&&&&&&&&&&&&&&&&&&&&&& if(flag1||flag3){flag2=0;}
&&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&& }
&&&&&&&&&&&&& if(flag3)
&&&&&&&&&&&& {
&&&&&&&&&&&&&&&&&& O_to_E();&&&&&&&&&&&&&&&&&&&&&&&&&&&& //奇偶交替闪烁
&&&&&&&&&&&&&&&&&& key_scan();
&&&&&&&&&&&&&&&&&& if(flag1||flag2)flag3=0;
&&&&&&&&&&&&& }
/***********************************************************************************************************************
编译过后的文件
注意:复制下面的代码(注意不要包含本句,注意不要改变格式)
:FDFCC3ED9FEC9E5015E4FBFA0BBB000E
:0FAEB646E4A70F50DBD
:0A00F400F4F20127FE
:AAA10912D6
:FE1200FEEF
:02C313D8FC
:01A3D8FCDB
:04E50A09B908E3E50AD5
:BFEE60A344
:F50A809E0B
:0CFE4F6D8FDAFF
:8FE493A3F8E493AF278
:DFFFC333F2
:60BCA3FF543F30E509541FFEE493B6
:010ECF54C025E060A840B8E493A37D
:10006F00FAE493A3F8E493A3C8C582C8CAC583CAA8
:A3C8C582C8CAC583CADFE9DEE780BE60
结束(注意不要包含本句及上面的※号,注意不要改变格式!)
【】【】【】【】
上一篇:下一篇:
CopyRight @
单片机教程网 51hei.com , All Rights Reserved单片机之路—独立按键操作
我的图书馆
单片机之路—独立按键操作
1、概述我们在使用家用电器时经常需要通过按键给电器输入指令,让电器执行动作。比如电磁炉的开关、电饭煲定时时间设定等等。今天我们来讲一下单片机怎么识别按键操作指令的。我们知道单片机只能识别高低电平,对于51单片机来说,0V为低电平,5V为高电平。按键就相当于一个开关,按下时导通,按键弹开时断开。2、硬件电路分析我们来看一下按键和单片机的接口电路图:独立按键与单片机接口我们直接把单片机P3.2引脚和P3.3引脚接到按键的一端,按键的另外一端接地。因为单片机的P3引脚是接有上拉电阻的,所以可以这样接。如果是P0口不能这样接。3、程序编写在开始写程序之前,我们需要了解一个实际应用的中知识点,按键在按下和释放的时候并不是我们想象的是一个理想的方波脉冲,实际是在电平跳变的时候是有产生抖动的,这些抖动会导致单片机采集按键状态时出现误判的情况。从实际波形我们可以看到在按键实际波形的中间有一段稳定的波形,我们可以采集这段波形进行判断。也就是说在程序处理中,我们检测到按键按下后延时3~5ms再次检测按键是否处于按下状态。按键实际波形和理想波形我们在上次流水灯的程序基础上进行编写,实现触碰P3.2引脚的KEY1流水灯间隔亮灭,触碰P3.3引脚的KEY2流水灯从低位往高位依次点亮。我们先把两个按键引脚定义一下sbit KEY1 P3^2sbit KEY2 P3^3接下来我们写一个按键扫描函数unsigned char KeyScan(void){static unsigned char keynum = 0;if(KEY1 == 0){delay_ms(3);if(KEY1 == 0){keynum = 1;}}else if(KEY2 == 0){delay_ms(3);if(KEY2 == 0){keynum = 2;}}}在这函数的处理中我们判断当KEY1按下时,我们返回1,当KEY2按下时,我们返回2,其他的情况返回0。需要注意的是,因为我们使用的是触碰按键,也就是按下放开之后按键的状态就自动恢复了,但是我们需要单片机保持住按键按下的状态,因此我们需要通过变量去记录按键的状态,所以在按键扫描函数中定义了一个静态局部变量,静态局部变量就是函数退出后,变量的数值还保持,但是变量的作用范围仅在定义的函数内。我们还需要修改一下主函数,需要在主函数中判断按键的状态并且让流水灯做出相应的动作。void main(){for(;;){if(KeyScan() == 1){//闪烁花式LedDisplay(0xAA);delay_ms(500);LedDisplay(0x55);delay_ms(500);}else if(KeyScan() == 2){//移位花式dat = 0x01;for(i=0;i{LedDisplay(~dat);delay_ms(500);dat = dat}}else{LedDisplay(0x00);delay_ms(500);}}}在主函数中判断按键执行的状态,如果KEY1被触碰,则单片机执行流水花式,如果KEY2被触碰,则单片机执行移位花式。把程序下载进去,我们会发现,按键触碰一下有可能出现流水灯花式不会切换的情况,需要长按才行。原因为主程序是循环在执行的,如果当前程序正在执行流水程序,需要等到程序执行完流水程序后才能判断按键状态。目前按键的功能是可以实现了,下一次文章中给大家讲解怎么解决按键检测不灵的问题。
TA的最新馆藏
喜欢该文的人也喜欢

我要回帖

更多关于 单片机按键控制流水灯 的文章

 

随机推荐