5个io怎么控制8个led和8个按键,51单片机如何控制8个led程序
来源:整理 编辑:汇众招标 2023-07-07 12:53:41
本文目录一览
1,51单片机如何控制8个led程序
#include<reg51.h> 包含单片机专用头文件#include<intrins.h> 这个是什么俺也不知道,但这个程序不需要这个头文件void Delay10ms(unsigned int c); 自定义的延时函数声明main() 主函数 unsigned int LED; 建立一个数值型变量,变量名 LED LED=0xfe; 给这个变量赋值,0xfe 换成二进制数为 1111 1110 while(1) 主循环 P2=LED; 点亮发光管,即先点亮右边的第一个Delay10ms(50); 延时一段时间 LED=LED<<1; 点亮的发光管,向左移动一位 if (P2==0x00) 判断是否8个全部点亮了 LED=0xff; 如果全部点亮,则将全部发光管熄灭 } }} void Delay10ms(unsigned int c)延时函数主程序 unsigned char a, b;建立两个变量 a b for(;c>0;c--)循环语句,不断改变变量数值,已达到延时目的 for(b=38;b>0;b--) for(a=130;a>0;a--); } } }给你翻译了,希望能帮到你
2,单片机 8个按键分别控制对应的8个led的亮灭 程序设计
八个灯接在单片机的P1口(P0,P2,P3,P4都一样) while(1) { delay(你想要延时的时间); P1=0xff; delay(你想要延时的时间); P1=0; } 注意led最好加驱动,不然单片机会坏的。本来以为这个程序很简单的,没想到写了快三个小时。哎学艺不精啊。贴出来给你研究吧。我不想做过多的解释了,我是按我理解的你出的题目做的,可能和你的本意不是很一样,1、依次亮,依次灭:从一个灯亮到全亮,再到全灭,每次改变一个灯亮灭2、奇偶号灯间隔亮灭:隔一个灯亮一个灯亮灯时间为1s,没有灯全灭的时候3、依次闪烁、切换时间为3秒,闪烁时间为2秒,我理解的是,没三秒钟有一个灯在闪烁,其中有一秒钟是灭灯状态程序中使用了p1口与8个发光二极管相连,具体电路图你百度一下吧,还有使用了一个按键,该按键与p3.7相连,低电平为按下状态。程序如下:#include #include /*变量声明: i、j、k都是记录计时器溢出次数的变量, stat是记录当前显示状态的变量,由按键key控制 temp是状态2中保护p1口状态的变量*/ unsigned char i=0,j=0,k=0,stat=0,temp; bit flag=1; //状态1处于灭灯还是亮灯状态的变量,1为依次亮灯,0为依次亮灯 sbit key=p3^7; //按键控制 void init(); //初始化函数 void delay(unsigned int n); //延时函数 void keyscan(); //键盘扫描函数 void main() { init(); while (1) { switch (stat) { case 0: //0方案 if(i==20&&flag) { i=0; p1=p1<<1; //依次亮灯 temp=p1; if(temp==0) { flag=0; } } if(i==20&&!flag) { i=0; if(p1==0xff) { flag=1; p1=0xfe; } if(!flag) { p1=p1<<1; //依次灭灯 temp=p1; p1=temp+1; } } break; case 1: //2方案 if(i==20) { i=0; p1=~p1; //去反后亮灯状态为灭灯,p1初值取0x55或0xaa,奇偶交替亮灯 } break; case 2: //3方案 if(j==60) { p1=temp; p1=_crol_(p1,1); temp=p1; //保护p1口亮灯状态 k=0; j=0; } //闪烁部分,应该可以优化 if(k<5) { p1=0xff; } else if(k>=5&&k<10) { p1=temp; } else if(k>=10&&k<15) { p1=0xff; } else if(k>=15&&k<20) { p1=temp; } else if(k>=20&&k<25) { p1=0xff; } else if(k>=30&&k<35) { p1=temp; } else if(k>=35&&k<40) { p1=0xff; } //----------------------------------- break; } keyscan(); } } void init() { th0=0x3c; //定时器赋初值定时时间50ms tl0=0xb0; tmod=0x01; //设置定时器工作方式为方式1 ea=1; //开总中断 et0=1; //开中断允许位 tr0=1; //定时器计数 p1=0xfe; //这里假设led灯与p1口相连并且 //低电平有效 } void delay(unsigned int n) { int i,j; for (i=0;i for (j=0;j<110;j++); } void keyscan() { if(!key) { delay(10); //消抖 if(!key); //确认有键按下 stat++; if(stat==3) { stat=0; } //右键按下复位 i=0; j=0; k=0; th0=0x3c; tl0=0xb0; switch (stat) { case 0: p1=0xfe; flag=1; stat=0; break; case 1: p1=0x55; break; case 2: p1=0xfe; temp=p1; break; } //----------------------------------- while(!key) //此循环中的函数和主函数中的显示函数是同一个 //用于长按键的显示,可以去掉,去掉长按键不会正常显示,松开按键后正常 { switch (stat) { case 0: if(i==20&&flag) { i=0; p1=p1<<1; temp=p1; if(temp==0) { flag=0; } } if(i==20&&!flag) { i=0; if(p1==0xff) { flag=1; p1=0xfe; } if(!flag) { p1=p1<<1; temp=p1; p1=temp+1; } } break; case 1: if(i==20) { i=0; p1=~p1; } break; case 2: if(j==60) { p1=temp; p1=_crol_(p1,1); temp=p1; k=0; j=0; } if(k<5) { p1=0xff; } else if(k>=5&&k<10) { p1=temp; } else if(k>=10&&k<15) { p1=0xff; } else if(k>=15&&k<20) { p1=temp; } else if(k>=20&&k<25) { p1=0xff; } else if(k>=30&&k<35) { p1=temp; } else if(k>=35&&k<40) { p1=0xff; } break; } } } } void timer0() interrupt 1 { th0=0x3c; tl0=0xb0; //溢出后重新赋初值 //定时器中断时间为50ms i++; //20次中断时间为1s j++; //40次中断时间为2s k++; //60次中断时间为3s } 有什么不懂的可以百度hi我
文章TAG:
5个 怎么 控制 8个 5个io怎么控制8个led和8个按键