51单片机流水灯40种花样,开关控制LED,开始流水灯,按一下停止,再按一下继续流水灯

51单片机流水灯的三种实现方法
首先,介绍下原理。下图为主控芯片和流水灯模块的原理图。流水灯模块接在单片机的P1口,由原理图可以知道,在P1口给一个低电平即可点亮LED灯。相反,如果要LED灯熄灭,就要把P1口的电平变为高电平即可。要实现流水灯功能,我们只要将LED1~LED8依次点亮、熄灭,依始类推,8只LED变会一亮一暗的做流水灯了。
实现8个LED流水灯程序用中文表示为:P1.0低、延时、P1.0高、P1.1低、延时、P1.1高、P1.2低、延时、P1.2高、P1.3低、延时、P1.3高、P1.4低、延时、P1.4高、P1.5低、延时、P1.5高、P1.6低、延时、P1.6高、P1.7低、延时、P1.7高、返回到开始、程序结束。
听起来是不是很简单啊!那么下面我们来看下实现流水灯功能的三种常用方法!
第一种,总线方法实现流水灯。
这是一种比较笨但又最易理解的方法,采用顺序程序结构,用位指令控制P1口的每一个位输出高低电平,加上延时函数,即可控制每个LED灯的亮灭。C程序如下:
#include &reg52.h&
#define uchar unsigned char
#define uint
unsigned int
code unsigned char tmpled[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //定义八只LED灯,依次点亮八只LED灯
&pre name="code" class="cpp"& //N毫秒的延时函数delay_ms(uint ms)
for(i=i&0;i--)
for(j=114;j&0;j--);
void main(void){while (1){for(i=0;i&8;i++) //循环点亮8只LED灯{P1=tmpled[i];delay_ms(500); //延时500毫秒}}}
第二种,移位方法实现流水灯
上一种方法是逐个将P1口的LED灯点亮来实现闲的,因此程序看起来有一点复杂。下面将一种用移位的方法。采用循环程序结构编程。首先在程序开始给P1.0口送一个低电平,其它位为高。然后延时一段时间再让低电平往高位移动,这样就实现“流水”的效果了。下面来看具体程序:
#include&reg52.h&
&pre name="code" class="cpp"&#define uchar unsigned char
#define uint
unsigned int&pre name="code" class="cpp"& //N毫秒的延时函数delay_ms(uint ms)
for(i=i&0;i--)
for(j=114;j&0;j--);
void main(){uchar a,i;while(1){a=0 //点亮第一位LED灯for(i=0;i&8;i++){P1=a;a=a&&1; //左移一位a=a|0x01; //左移一位后与0x01相或,保证左移后最低位为1 delay_ms(500); }}}
第三种,库函数实现流水灯
C52 提供了
_crol_(字符循环左移);_cror_ (字符循环右移)等库函数,包含在头文件intrins.h中。接下来还是先讲一下移位的小知识点吧。
左移。C52中操作符为“&&”,每执行一次左移指令,被操作的数将最高位移入单片机PSW寄存器的CY位。CY位中原来的数丢弃,最低位补0,其他位依次向左移动一位。相信大家学过C语言都清楚吧,这里就不多说了。而函数_crol_的作用是循环左移。它会将最高位移入最低位,其他位依次向左移一位。用法:x=0xfe;x=_crol_(x,1);//循环左移移位。接下来看具体程序:
#include&reg52.h&
#include&intrins.h&
&pre name="code" class="cpp"&&pre name="code" class="cpp"&#define uchar unsigned char
#define uint
unsigned int
&pre name="code" class="cpp"&&pre name="code" class="cpp"& //N毫秒的延时函数delay_ms(uint ms)
for(i=i&0;i--)
for(j=114;j&0;j--);
void main(){a=0while(1){P1=a;a=_crol_(a,1); delay_ms(500);}}
知识点:PSW寄存器。
PSW(Program StatusWord)全称为程序状态字标志寄存器,是一个8位寄存器,位于单片机片内的特殊功能寄存器区,字节地址D0H,用来存放运算结果的一些特征,如有无进位、借位等。使用汇编编程时PSW寄存器很有用,但在利用C语言编程时,编译器会自动控制该寄存器,很少人为操作它,大家只需做简单了解即可。其每位的具体含义如图1 所示:
PWD(Program Status Word)寄存器
①CY:进位标志位,它表示运算是否有进位(或借位)。如果操作结果在最高位有进位(加法)或者借位(减法),则该位为1,否则为0。
②AC:辅助进位标志,又称半进位标志,它指两个8位数运算低四位是否有半进位,即低四位相加(或相减)是否进位(或借位),如有,则AC为1,否则为0。
③F0:由用户使用的一个状态标志位,可用软件来使它置1或清0;也可由软件来测试它,以控制程序的流向。
④RS1、RS0:4组工作寄存器区选择控制位。在汇编语言中这两位用来选择4组工作寄存器区中的哪一组为当前工作寄存区。
⑤OV:溢出标志位,反映带符号数的运算结果是否有溢出。有溢出时,此位为1,否则为0。
⑥P:奇偶标志位,反映累加器ACC内容的奇偶性,如果ACC中的运算结果有偶数个l(如B,其中有4个1),则P为0,否则P为1。
没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!用按键控制流水灯的工作,按键按下流水灯停止。【单片机吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:149,834贴子:
用按键控制流水灯的工作,按键按下流水灯停止。收藏
用按键控制流水灯的工作,按键按下流水灯停止,按键松开,流水灯重新显示,设计电路并编写相应程序.
数码家电「天猫618」抢100元大额券,先到先得!每满,大屏满减,惊爆狂欢!「天猫618」全民狂欢&嗨&购,理想生活上天猫!
有没有人帮我做一下。
楼主用的什么软件
有没有人能帮我加一个按键控制,简单的就行
没有大神能帮一下我这种渣渣么
你程序怎么写的?能翻译一下么?我看不懂额
#include&reg52.h&
//头文件#define uchar unsigned char//宏定义#define uint unsigned int//宏定义void delayms(uchar ms) //延时子函数{
while(ms--)
for(i=0;i&123;i++);}void main()//主函数{P0=0xFE;
delayms(100);//延时100ms
P0=(P0&&1)|(P0&&7);//循环移位
//#include &reg52.h& //包含头文件#include &stc.h&sbit DS;//关掉DS1302使能sbit LED0=P1^0;sbit LED1=P1^1;sbit LED2=P1^2;sbit LED3=P1^3;sbit LED4=P1^4;sbit LED5=P1^5;sbit LED6=P1^6;sbit LED7=P1^7;#define ON 0#define OFF 1void delay(float t){ unsigned int j,i; j=t*100; while(j--) {
for(i=1505;i;i--); }}void main(){
DS1302=0;while(1){
delay(0.1);
delay(0.1);
delay(0.1);
delay(0.1);
delay(0.1);
delay(0.1);
delay(0.1);
delay(0.1);
delay(0.1);
delay(0.1);
delay(0.1);
delay(0.1);
delay(0.1);
delay(0.1);
LED7=OFF;}}
登录百度帐号查看: 7411|回复: 24
求教编程思路 用独立按键控制流水灯的方向,按一下流水灯从亮的地方反向流转
& && &刚学单片机,学长布置的题,用独立按键控制流水灯的方向,按一下流水灯从亮的地方反向流转,求教思路,想了很久还没解决,谢谢好心人了
八位数码管采用共阳极接法(所有阳极接一起接Vcc,阴极接P0口)
按键分别接P2.0&&P2.1&&P2.2(低电平有效)
#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;
& && && && &&&}
RE: 求教编程思路 用独立按键控制流水灯的方向,按一下流水灯从亮的地方反向流转
我写过这样一个程序,发给你参考一下。
09:21 上传
点击文件名下载附件
33.52 KB, 下载次数: 231
本帖最后由 espopoi 于
23:24 编辑
这个程序能差不多满足要求,就有一点,精度不高,不能在按下的瞬间就从亮的地方返回,他有时候会先按原来的顺序亮一个灯,再按相反的顺序亮,希望有大神能改进,
23:21 上传
点击文件名下载附件
33.65 KB, 下载次数: 90
回帖助人的奖励!
弄清高低位就好了
我写过这样一个程序,发给你参考一下。
嗯嗯,谢谢了。
这个程序能差不多满足要求,就有一点,精度不高,不能在按下的瞬间就从亮的地方返回,他有时候会先按原来的 ...
嗯嗯,谢谢啦
加一个键盘检测程序,然后里面写左右循环
回帖助人的奖励!
这个程序能差不多满足要求,就有一点,精度不高,不能在按下的瞬间就从亮的地方返回,他有时候会先按原来的 ...
应该是采用了空循环做延时,改用定时器做延时就好了
回帖助人的奖励!
提供思路仅供参考:
1、流水灯左右循环通过循环左移、循环右移;弄个变量标志方向,每次移动判断一下是左还是右。
2、如果不用定时器和中断,那就把你的延时函数做成 循环检测按键,检测到按键就把方向变量反一下。
3、追求精确的延时用定时器方便。
4、如果用空循环等待,把按键接到中断,用中断方式读按键也行得通。
回帖助人的奖励!
#include &REG51.h& //51头文件
/*********************************************************************************************/
#define DY_PORT& & & & & & & & P1 //设置LED连接的I/O组
#define DY_SPEED& & & & 100 //设置每一个明亮级的停留时间(值域:0~65535)
/*********************************************************************************************
bit [自定义名] ; //定义一个位(位的值只能是0或1)例:bit LED
#define [代替名]& & & & [原名]&&//用代替名代替原名(可以方便修改常改或调试的值)例:#define LED P1
sbit&&[自定义名] = [系统位名] ; //自定义系统位名。例:sbit Add_Key = P3 ^ 1;
unsigned char [自定义名] ; //定义一个0~255的整数变量.例:
unsigned int [自定义名] ; //定义一个0~65535的整数变量
/*********************************************************************************************/
void delay (unsigned int a){ // 1ms延时程序
& & & & while( --a != 0){
& & & & & & & & for(i = 0; i & 600; i++);//STC单片机在外部晶振为12MHz时i值上限为600&&
& & & & }& && & & & & & & & & & & & & & & && & & & & & & & & &&&//AT89C51单片机在外部晶振为12MHz时i值上限为125
/*********************************************************************************************/
void main(void){
& & & & while(1){
& & & & & & temp=0x01;
& & & & & & for(i=0;i&8;i++){ //8个流水灯逐个闪动
& &&&& & & & & & & & DY_PORT=~
& &&&& & & & & & & & delay(DY_SPEED);& &//调用延时函数
& &&&& & & & & & & & temp&&=1;
& & & & & & }
& & & & & & & & temp=0x80;
& & & & & & & & for(i=0;i&8;i++){ //8个流水灯反向逐个闪动
& & & & & & & & & & DY_PORT=~
& & & & & & & & & & delay(DY_SPEED);& &//调用延时函数
& & & & & & & & & & temp&&=1;
& && & & & & & & & }
& & & & & & temp=0xFE;
& & & & & & & & for(i=0;i&8;i++){ //8个流水灯依次全部点亮
& &&&& & & & & & & & DY_PORT=
& &&&& & & & & & & & delay(DY_SPEED);& &//调用延时函数
& &&&& & & & & & & & temp&&=1;
& & & & & & }
& && & & & & & & & temp=0x7F;
& && & & & & & & & for(i=0;i&8;i++){ //8个流水灯依次反向全部点亮
& &&&& & & & & & & & DY_PORT=
& &&&& & & & & & & & delay(DY_SPEED);& &//调用延时函数
& &&&& & & & & & & & temp&&=1;
& & & & & & }
回帖助人的奖励!
功能顺序理清楚就行了。。。
按键做个标志,然后取反
不错的分享,值得收藏
第一,需要用一个IO口来控制按键,需要进行延时消抖,第二需要让流水灯做来回点亮构成死循环
回帖助人的奖励!
#include &reg52.h& #include &intrins.h& #define uchar unsigned char #define uint unsigned int&&void DelayMS(uint x) {&&& & & & & & & & while(x--) & & & & { & & & &&&& & & & for(i=200;i&0;i--); & & & & } }&&void Move_LED() {&&& & & & if((P1 &= 0x10)==0)& & & & P0 = _cror_(P0,1); & & & & else if((P1 &= 0x20)==0)& & & & P0 = _crol_(P0,1); & & & & else if((P1 &= 0x40)==0)& & & & P2 = _cror_(P2,1); & & & & else if((P1 &= 0x80)==0)& & & & P2 = _crol_(P2,1); }&&void main() {&&& & & & uchar Recent_Key=0 & & & & P0=0 & & & & P1=0 & & & & P2=0 & & & & while(1) & & & & { & & & &&&& & & & if(Recent_Key != P1) & & & & & & & & { & & & & & & & &&&& & & & Recent_Key=P1; & & & & & & & & & & & & Move_LED(); & & & & & & & & & & & & DelayMS(10); & & & & & & & & } & & & & } }
用独立按键控制流水灯的方向
本帖最后由 zl2168 于
17:51 编辑
实例7&&键控流水循环灯先Proteus仿真一下,确认有效。
(36.04 KB, 下载次数: 64)
17:50 上传
点击文件名下载附件
键控流水循环灯.jpg (136.4 KB, 下载次数: 59)
17:50 上传
以上摘自张志良编著《80C51单片机Proteus仿真设计实例教程》清华大学出版社ISBN 978-7-302-41682-1仿真电路和Hex文件能在清华出版社网站免费下载,程序源代码只能到书上看了。到图书馆借,或到新华书店翻阅,或到网上书店打折购买。
仿真电路和Hex文件能在清华出版社网站免费下载,程序源代码只能到书上看了。到图书馆借,或到新华书店翻阅,或到网上书店打折购买。
设置一个全局bit型变量,打开外部中断,用按键产生中断,在中断程序里吧bit型变量取反,然后在主程序里判断bit变量,1就正移动,0就反移动。这样就能实现用按键控制流水灯正反向了
回帖助人的奖励!
设置一个全局的bit变量,在外部中断函数里取反这个变量的值,在主程序判断bit是1还是0来控制流水灯正反。
不错的分享,值得收藏
八位数码管采用共阳极接法(所有阳极接一起接Vcc,阴极接P0口)
按键分别接P2.0&&P2.1&&P2.2(低电平有效 ...
请教一下,此程序要怎么改成按键按下不放执行程序,放开按键不执行程序,每次按下按键重新执行程序,谢谢
浏览过的版块
Powered by单片机IO口控制LED流水灯_百度文库
您的浏览器Javascript被禁用,需开启后体验完整功能,
赠送免券下载特权
10W篇文档免费专享
部分付费文档8折起
每天抽奖多种福利
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
单片机IO口控制LED流水灯
&&单片机IO口控制LED流水灯
阅读已结束,下载本文需要
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,同时保存到云知识,更方便管理
加入VIP
还剩3页未读,
定制HR最喜欢的简历
你可能喜欢51单片机按键中断控制流水灯_百度知道
51单片机按键中断控制流水灯
四个灯单个依次亮起并循环,当按键按下,保留当前状态并暂停,当按键再次按下时,流水灯继续由上次的状态运行下去。(用中断进行,最好用上flag标志位)
我有更好的答案
按键接在外中断脚上,外中断触发模式设为下降沿模式,即 IT0=1;或 IT1=1; ,在中断函数里调用流水灯函数或直接把代码写在中断函数里
采纳率:70%
来自团队:
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。

我要回帖

更多关于 单片机流水灯40种花样 的文章

 

随机推荐