方法:
1:设定一个变量i,可以从0到3循环的变化
2:检测一个经过消抖处理的按键,按一下,i+1
3:当i值为各个值时,执行相应的花样。
流水灯参考程序
#include
#include
#define uchar unsigned char
uchar j,temp;
void delay(unsigned int ms)
{
uchar t;
while(ms--)
for(t=0;t<123;t++);
}
void main()
{
P1=0xff;
delay(500);
temp=0xfe; //有点怪,led接在P23~P26
for(j=0;j<4;j++)
{
P1=temp;
delay(500);
temp=_crol_(temp,1);
}
P1=0xff;
while(1);
}
#include <reg52h> //包括一个52标准内核的头文件
#define uchar unsigned char
/主函数/
void timer0();
void main() // 主程序
{
TMOD=0x01; //定时器0工作方式1
EA=1;
ET0=1; //定时器0中断
TR0=1; //启动定时器0
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
while(1); //程序循环
}
/定时器0中断/
void timer0() interrupt 1
{
uchar t;//定义变量
TF0=0;//定时器清0
t++; //中断一次累加1
if(t==20) //预置值,溢出20次就是1秒钟,晶振12MHZ
{
t=0;
P3=~P3; //反转LED灯的亮灭
}
}
//
单片机交通灯控制系统通常由红、黄、绿三个LED灯组成。交通灯控制分三种状态:红灯亮,黄灯亮和绿灯亮。当红灯亮时,意味着交通应该停止,行人可以通过斑马线;当黄灯亮时,意味着交通要停止并做出准备;当绿灯亮时,意味着交通可以通过道路。在交通灯从黄灯状态往下面转换时,需要进行三次黄灯闪烁。黄灯闪烁3次是为了提醒驾驶者,做出准备,交通灯即将显示红灯。对于单片机,通过控制程序TIMER来实现测时,控制红、黄、绿三个LED灯的状态,实现交通灯的控制。
led的闪烁是通过一定频率的开关led实现的。如果开关频率太快,人类是看不出来是在闪烁,所以开关频率要低一些,比较高的切换频率可以用来控制led亮度(PWM),或者用来做数码管显示。
实现方式主要有两种方式:
(1)使用代码循环做为延时来控制led开关频率:
eg:
#define HIGH 1
#define LOW 0
#define LED P11//假设为51单片机
void delay_nms(unsigned int n_ms)
{
while(n_ms--)
{
delay_1ms();//延时一毫米函数,可以根据具体单片机自己定义
}
}
void main()
{
for(;;)
{
LED = HIGH;
delay_nms(500);
LED = LOW;
delay_nms(500);
}
}
(2)使用定时器来控制led开关频率:
eg:
#define HIGH 1
#define LOW 0
#define LED P11
unsigned char f_500ms = 0;
void timer0() interrupt 1 //假设为10ms定时
{
//xxxx
f_500ms++;
}
void main()
{
for(;;)
{
if(f_500ms < 100)//1秒(10ms 50 = 1000ms = 1s)
{
if(f_500ms < 50)
{
LED = HIGH;
}
else
{
LED = LOW;
}
}
else
{
f_500ms = 0;
}
}
}
两种方式都可以,但在实际使用中尽量不要使用循环延时,因为使用循环延时在延时过程中,单片机除了中断的响应,不能再做任何事情了,而使用定时器,程序只需要通过判断时间变量就可以实现同样的效果,不会占用太多时间,所以单片机能够做更多的事情,实现实时性的要求,这是嵌入式开发中需要重视的。
主要程序如下:
flag是用来记忆按键状态,按下key3,flag置1,程序中检测到flag是1才闪烁,松手后LED仍然闪烁,同时下一轮还可以检测另外两个按键
while(1)
{
if(key1==0)//判断按键是否按下
{
Delay1ms(10);//延时消抖
if(key1==0)
{
while(key1==0);//等待按键抬起
LED=1;
flag=0;
}
}
if(key2==0)//判断按键是否按下
{
Delay1ms(10);//延时消抖
if(key2==0)
{
while(key2==0);//等待按键抬起
LED=0;
flag=0;
}
}
if(key3==0)//判断按键是否按下及是否在走时
{
Delay1ms(10);//延时消抖
if(key3==0)
{
while(key3==0);//等待按键抬起
flag=1;
}
if(flag==1)
{
LED=!LED;
Delay1ms(200);
}
}
我看楼上写的程序不怎么好,而且不容易懂,不是单片机c语言吧,于是自作主张的自己又写了一个,是51单片机的,12MHz晶振。我猜你现在用的是51吧?
#include
#define
uchar
unsigned
char
sbit
Led=P1^0;
uchar
counter;
void
timer1()
interrupt
3
using
1
{
TH1=-50000/256;
TL1=-50000%256;
counter=counter+1;
}
void
main()
{
counter=0;
TMOD=0x50;
TH1=-50000/256;
TL1=-50000%256;
//定时50ms,16位定时器
EA=1;
TR1=1;
while(1)
{
if(counter==20)
{
counter=0;
Led=~Led;
//led灯闪烁
}
}
}
楼主觉得可以的话,一定要给满意噢,若有什么不满意的地方,请继续追问。对啊,中断里面的程序一定要短,中断嘛,本来就是要告诉单片机该做什么的了。
你用的什么单片机?
看你说的应该是跑马灯,给你一个最常见的,51单片机,跑马灯C程序。
若有需要可以给你更多,本人硬件开发工程师。
望采纳。
例,这是一个51单片机的跑马灯C程序,已经在PROTEUS软件上仿真通过
#include<reg51h>
void delay(int);
void main()
{
int i;
P0=0x01;
delay(500);
while(1)
{
for(i=0;i<7;i++)
{
P0<<=1;
delay(500);
}
P0=0x01;
delay(500);
}
}
void delay(intx)
{
int i,j;
for(i=x;i>0l;i--)
for(j=110;j>0;j--);
}
:
#include<reg51h>
void delay(int);
void main()
{
int i;
P0=0x01;
delay(500);
while(1)
{
for(i=0;i<7;i++)
{
P0<<=1;
delay(500);
}
P0=0x01;
delay(500);
}
}
void delay(intx)
{
int i,j;
for(i=x;i>0l;i--)
for(j=110;j>0;j--);
}
以上就是关于利用单片机控制8个发光二极管,设计8个灯同时闪烁的控制程序全部的内容,包括:利用单片机控制8个发光二极管,设计8个灯同时闪烁的控制程序、求51单片机定时LED闪烁程序代码、单片机交通灯黄灯闪烁3次程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)