利用单片机控制8个发光二极管,设计8个灯同时闪烁的控制程序

利用单片机控制8个发光二极管,设计8个灯同时闪烁的控制程序,第1张

方法:

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次程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zz/9438781.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-28
下一篇 2023-04-28

发表评论

登录后才能评论

评论列表(0条)

保存