|
电路原理图
源程序如下
//基于51单片机的交通灯设计,黄灯亮起时会闪烁
//并发出警报,提醒行人或车辆快速通过
//定时准确,误差小,便于调节时间长短
#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
sbit NB=P1^0; //南北走向黄灯报警器控制端口
sbit DX=P1^1; //东西走向黄灯报警器控制端口
//简易毫秒延时函数
void delay( uint n)
{
uint i;
uchar j;
for(i=0;i<n;i++)
for(j=0;j<114;j++);
}
void main()
{
uchar a=0,b=0,BIAOZHI=3;
//定时器初始化
EA=1; //开总中断
ET0=1; //开定时器0中断
TMOD=0x01; //设置定时/计数器方式为16位定时模式
TH0 = 0x4b;
TL0 = 0xfc;//0x4bfc 定时50ms
TR0=1; //启动定时器
while(1)
{
if(TF0 == 1)//判断T1是否溢出
{ //定时器溢出后重赋处置
TH0 = 0x4b;
TL0 = 0xfc;//0x4bfc 定时50ms
TF0 = 0;//清零便于下次判断
a++;//50毫秒计数加1
if(a==20) {a=0;b--;}//a=20;说明一秒时间到
}
if(b==0)
{
switch(BIAOZHI)
{
case 0:
BIAOZHI=1;b=3; break; //南北黄灯时长
case 1:
BIAOZHI=2;b=10; break;//南北红灯时长
case 2:
BIAOZHI=3;b=3; break; //南北绿灯时长
case 3: BIAOZHI=0;b=10; break; //东西黄灯时长
}
}
switch(BIAOZHI)
{
case 0:
P0=0X33; break;
case 1: if(a%4==1) //黄灯闪烁 每隔200 毫秒闪烁一次
{P0=0X35; NB=0;}
if(a%4==0)
{P0=0x37; NB=1;}
break;
case 2:
P0=0X1E; break;
case 3: if(a%4==1) //黄灯闪烁 每隔200 毫秒闪烁一次
{P0=0X2e;DX=0;}
if(a%4==0)
{P0=0x3e;DX=1;}
break;
}
}
|
|