51单片机控制8个led灯依次闪烁报告(51单片机闪烁一个led灯)
要求用51单片机控制8个LED亮灭的原理图+程序+解说?
本来以为这个程序很简单的,没想到写了快三个小时。哎学艺不精啊。贴出来给你研究吧。我不想做过多的解释了,我是按我理解的你出的题目做的,可能和你的本意不是很一样,
1、依次亮,依次灭:从一个灯亮到全亮,再到全灭,每次改变一个灯亮灭
2、奇偶号灯间隔亮灭:隔一个灯亮一个灯亮灯时间为1s,没有灯全灭的时候
3、依次闪烁、切换时间为3秒,闪烁时间为2秒,我理解的是,没三秒钟有一个灯在闪烁,其中有一秒钟是灭灯状态
程序中使用了P1口与8个发光二极管相连,具体电路图你百度一下吧,还有使用了一个按键,该按键与P3.7相连,低电平为按下状态。
程序如下:
#include reg52.h
#include intrins.h
/*变量声明:
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==20flag)
{
i=0;
P1=P11; //依次亮灯
temp=P1;
if(temp==0)
{
flag=0;
}
}
if(i==20!flag)
{
i=0;
if(P1==0xff)
{
flag=1;
P1=0xfe;
}
if(!flag)
{
P1=P11; //依次灭灯
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(k5)
{
P1=0xff;
}
else if(k=5k10)
{
P1=temp;
}
else if(k=10k15)
{
P1=0xff;
}
else if(k=15k20)
{
P1=temp;
}
else if(k=20k25)
{
P1=0xff;
}
else if(k=30k35)
{
P1=temp;
}
else if(k=35k40)
{
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;iN;i++);
for (j=0;j110;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==20flag)
{
i=0;
P1=P11;
temp=P1;
if(temp==0)
{
flag=0;
}
}
if(i==20!flag)
{
i=0;
if(P1==0xff)
{
flag=1;
P1=0xfe;
}
if(!flag)
{
P1=P11;
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(k5)
{
P1=0xff;
}
else if(k=5k10)
{
P1=temp;
}
else if(k=10k15)
{
P1=0xff;
}
else if(k=15k20)
{
P1=temp;
}
else if(k=20k25)
{
P1=0xff;
}
else if(k=30k35)
{
P1=temp;
}
else if(k=35k40)
{
P1=0xff;
}
break;
}
}
}
}
void timer0() interrupt 1
{
TH0=0x3c;
TL0=0xB0; //溢出后重新赋初值
//定时器中断时间为50ms
i++; //20次中断时间为1s
j++; //40次中断时间为2s
k++; //60次中断时间为3s
}
有什么不懂的可以百度Hi我
单片机C51编程,要求实现8盏LED灯的闪烁,这样写可以实现吗?渣渣求助大佬,谢谢啦
主程序应该有两个延时,而且还要有主循环语句,否则只执行一遍。
void main()
{
while(1)
{
P1=0xff;
delay(500);
P1=0x00;
delay(500);
}
}
这个效果是8个灯,同时亮,同时灭的。
单片机 8个LED灯随机闪烁怎么做?
1、首先在电脑中新建项目:Keil uVision4 51单片机LED闪烁编程,如下图所示。
2、然后设计单片机端口与LED灯相连,如下图所示,输入代码。
3、接着创建延迟函数,如下图所示,输入以下代码。
4、然后创建C语言主函数,如下图所示,输入以下代码。
5、接着输入对输出取反,最后调用延迟函数,如下图所示就完成了。
51单片机8个led向左循环依次点亮,按一下开关后往右循环一次后继续向左循环
#includereg51.h
#includeintrins.h
#define uchar unsigned char
uchar time=0,num,led=0xfe;
bit flag=0;
sbit key=P2^0;
void t0isr() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
time++;
if(time=10)
{
time=0;
if(flag==0)
{
P0=led;
led=_crol_(led,1);
}
else
{
P0=led;
led=_cror_(led,1);
num++;
if(num8)flag=0;
}
}
}
main()
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TR0=1;
ET0=1;
EA=1;
while(1)
{
if(key==0)
{
while(key==0);
flag=1;
num=0;
}
}
}
单片机控制8个灯依次亮,全亮了,再依次灭的c语言流程图,顺便加上解释,不然看不懂
1、创建项目,如图所示。
2、创建延迟函数。
3、创建C语言主函数。设计unsigned char k=0;变量。
4、添加循环效果。
5、点亮灯,通过k++,改变效果。
6、添加延迟效果,单片机就可以控制8个灯依次亮,全亮了,然后再依次灭。
利用单片机控制8个发光二极管,实现8个灯同时闪烁的控制程序
以51位例,使用P1的八个IO口控制。
先定义:
sbit
LED0=P1^0;
sbit
LED1=P1^1;
........
以此类推,定义八个。
然后在主循环中:
LED0=0;
延时一段时间;
LED0=1;
就可以看到闪烁了。
51单片机控制8个led灯依次闪烁报告的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于51单片机闪烁一个led灯、51单片机控制8个led灯依次闪烁报告的信息别忘了在本站进行查找喔。微信号:ymsc_2016
相关文章
发表评论
评论列表
- 这篇文章还没有收到评论,赶紧来抢沙发吧~