能实现基本功能的交通灯,用到的元件包括74HC138,74HC245D。AT89C51。自己手扣一下午的代码,解释比较详细。
首先对管脚定以进行解释,从p1.0到p2.3是对东南西北四个路口的红绿灯进行控制,在红绿灯倒计时,满足条件的情况下,实现对灯亮灭的控制。
sbit nanhong=P1^0;
sbit nanhuang=P1^1;
sbit nanlv=P1^2;
sbit beihong=P1^3;
sbit beihuang=P1^4;
sbit beilv=P1^5;
sbit donghong=P1^6;
sbit donghuang=P1^7;
sbit donglv=P2^0;
sbit xihong=P2^1;
sbit xihuang=P2^2;
sbit xilv=P2^3;
从2.4到2.4为38译码器的控制线,三根线可以区分出8种不同的状态,从而实现实现对于数码管的片选信号的控制,选择哪些进行亮灭
sbit LSA=P2^4;//38译码器
sbit LSB=P2^5;//38译码器
sbit LSC=P2^6;//38译码器
sbit flag=P2^7;//设置东西倒计时时间 K1键
sbit flag1=P3^0;//设置南北倒计时时间 K2键
sbit flag2=P3^4;//k5键。退出倒计时设置
u16 mm; //设置倒计时间,按k3键加按K4键减
mm通过外部中断对其进行数值上的加减,通过按按键3控制外部中断1对mm实现数值上的增加,同理通过按键4通过外部中断2控制mm数值上的减少,再由aaa,和bbb分别寄存东西和南北方向上倒计时的控制从实现红绿灯的亮灭。
u16 dongxi; //东西倒计时信号 这个变量为设置的东西倒计时
u16 nanbei; //南北倒计时信号
u16 xxx; //红绿灯转换标志位 由xxx来判断东西方向上的开关信号,再由yyy一起来控制通行方向
u16 yyy; //红绿灯转换标志位 通yyy是一个作用
u16 aaa; //东西方向倒计时时间设置标志位 ,暂存倒计时
u16 bbb; //南北方向倒计时时间设置标志位,暂存倒计时
void delay(u16 i)
{
while(i--);
}延时函数用于数码管的显示,数码管的显示并不是同时显示,而是依次显示只是两个管脚间的显示时间间隔很小,从而造成视觉上的差异,这是由延时函数来进行控制。
void DigDisplay(u16 i,u16 m){
switch(i) //位选,选择点亮的数码管,
{
case(0):
LSA=0;LSB=0;LSC=0; break;//显示第 0 位
case(1):
LSA=1;LSB=0;LSC=0; break;//显示第 1 位
case(2):
LSA=0;LSB=1;LSC=0; break;//显示第 2 位
case(3):
LSA=1;LSB=1;LSC=0; break;//显示第 3 位
case(4):
LSA=0;LSB=0;LSC=1; break;//显示第 4 位
case(5):
LSA=1;LSB=0;LSC=1; break;//显示第 5 位
case(6):
LSA=0;LSB=1;LSC=1; break;//显示第 6 位
case(7):
LSA=1;LSB=1;LSC=1; break;//显示第 7 位
}
P0=smgduan[m];//发送段码
delay(100000);//间隔一段时间扫描
}
此函数为数码管显示函数,对于一个数码管进行控制,有两个变量分别是片选信号和段选信号,片选信号由3根线进行控制,但需要74HC138进行驱动,这个函数可以控制相应数码管显示相应数字。
void EIRQ0(){
EA=0;
IT0=1;
EX0=1;
EA=1;
}
void EIRQ1(){
EA=0;
IT1=1;
EX1=1;
EA=1;
}
两个外部中断初始化,先关掉中断总开关,在选择触发方式,再打开中断标志位,再打开中断总开关。
void QH() interrupt 0 //外部中断 0 的中断函数
{
mm++;
}
void QH1() interrupt 2 //外部中断 0