51单片机——红绿灯系统

利用51单片机完成红绿灯系统

该程序是基于使用STC89C52芯片下的51开发板
首先确认两种工作状态:
①南北方向红灯60s;东西方向绿灯57s,然后黄灯三秒。
②南北方向绿灯57秒,然后黄灯3秒;东西方向红灯60s。
这两种工作状态交替进行。


该程序是主要使用定时器中断来完成的,学好定时器中断就能轻松写出这个程序


给程序标了一些简单注释,有看不懂的地方可以评论区留言。



#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit du=P2^6;
sbit we=P2^7;
sbit NS_r=P1^0;
sbit NS_y=P1^1;
sbit NS_g=P1^2;
sbit EW_r=P1^4;
sbit EW_y=P1^5;
sbit EW_g=P1^6;
uint i=60,j=57;
uchar k;
uchar code SMGdu[]= {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F};
uchar code SMGwe[]={0xfe,0xfd,0xef,0xdf};


void time0() //定时计数器0初始化
{
EA=1;
ET0=1; //配置定时器0中断
TR0=1;
TMOD=0x01;
TH0=0xed; //定时5ms
TL0=0xff;
}


void display() //扫描数码管
{
uint n1,n2,e1,e2;//NS,EW方向数码管
n1=i/10;
n2=i%10;
e1=j/10;
e2=j%10;
we = 1;//打开位选锁存器
P0 = SMGwe[k%4];
we = 0;//锁存位选数据
switch(k%4)
{
case 0:du=1;P0=SMGdu[e1];du=0;break;
case 1:du=1;P0=SMGdu[e2];du=0;break;
case 2:du=1;P0=SMGdu[n1];du=0;break;
case 3:du=1;P0=SMGdu[n2];du=0;break;
}


}
void main()
{
time0();
NS_r=0; //初始化南北方向红灯,东西方向绿灯
EW_g=0;

while(1)//两个阶段  1.南北方向红60s;东西方向绿57s,黄3s
{		          //2.东西方向红60s;南北方向绿57s,黄3s			
	if(j==0&&i==3)
	{
		EW_g=1;
		EW_y=0;
		j=3;
	}
	if(i==0&&EW_y==0)	
	{
		NS_r=1;
		NS_g=0;
		EW_y=1;
		EW_r=0;
		i=57;
		j=60;
	}
	if(i==0&&j==3)
	{
		NS_g=1;
		NS_y=0;
		i=3;
	}
	if(i==0&&NS_y==0)
	{
		NS_y=1;
		NS_r=0;
		EW_r=1;
		EW_g=0;
		i=60;
		j=57;
	}
}	 

}


void timer0() interrupt 1 //定时器0中断处理函数
{
TH0=0xed; //定时5ms
TL0=0xff;
k++;
if(k==200)
{
i–;
j–;
k=0;
}
display();
}

  • 17
    点赞
  • 61
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

月牙 ,呐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值