资源描述
交通灯程序:
//晶振:12M
/*************************变量的定义:
show_val_sn,show_val_ew: 显示的值0-59
state_val_sn,state_val_ew: 状态值 南北方向0-绿灯亮;1-黄灯亮;2-红灯亮
T1_cnt: 定时器计数溢出数
cnt_sn,cnt_ew: 倒计时的数值
init_sn[3],init_ew[3] 倒计时
led_seg_code:数码管7段码*************************/
#include "reg51.h"
sbit SN_green=P3^2 ;//南北方向绿灯
sbit SN_yellow=P3^1 ;//南北方向黄灯
sbit SN_red=P3^0 ;//南北方向红灯
sbit EW_green=P3^5 ;//东西方向绿灯
sbit EW_yellow=P3^4 ;//东西方向黄灯
sbit EW_red=P3^3 ;//东西方向红灯
unsigned char data cnt_sn,cnt_ew;
unsigned int data T0_cnt;
unsigned char data state_val_sn,state_val_ew;
char code led_seg_code[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
char code init_sn[3]={24,4,29};
char code init_ew[3]={29,24,4};
//------------------------
void delay(unsigned int x)//延时
{
unsigned int i,j;
for(i=x;i>0;i--)
for(j=110;j>0;j--);
}
//------------------------
void led_show(unsigned int u,unsigned int v)
{ unsigned char i;
i=u%10; //暂存个位
P0=led_seg_code[i];
P2=0xbf;
delay(5); //延时
P0=0;//数码管灯灭
i=u%100/10; //暂存十位
P0=led_seg_code[i];
P2=0x7f;
delay(5); //延时
P0=0;
i=v%10; //暂存个位
P0=led_seg_code[i];
P2=0xfe;
delay(5); //延时
P0=0;
i=v%100/10; //暂存十位
P0=led_seg_code[i];
P2=0xfd;
delay(5); //延时
P0=0;
}
//-------------------------
void timer0() interrupt 1 //T1中断
{
TH0 = 0x3c; // 设置定时器初值(定时50ms)
TL0 = 0xb0;
T0_cnt++;
if(T0_cnt==20) //如果计数>3999, 计时1s
{ T0_cnt=0;
if (cnt_sn!=0) //南北方向计时
{ cnt_sn--; }
else
{ state_val_sn++;
if (state_val_sn>2) state_val_sn=0;
cnt_sn=init_sn[state_val_sn];
switch (state_val_sn) //根据状态值,刷新各信号灯的状态
{ case 0: SN_green=0 ;//南北方向绿灯
SN_yellow=1 ;//南北方向黄灯
SN_red=1 ;//南北方向红灯
break;
case 1:
SN_green=1 ;//南北方向绿灯
SN_red=1 ;//南北方向红灯
SN_yellow=~SN_yellow ;//南北方向黄灯
break;
case 2:SN_green=1 ;//南北方向绿灯
SN_yellow=1 ;//南北方向黄灯
SN_red=0 ;//南北方向红灯
break;
}
}
if (cnt_ew!=0) //东西方向计时
{ cnt_ew--; }
else
{ state_val_ew++;
if (state_val_ew>2) state_val_ew=0;
cnt_ew=init_ew[state_val_ew];
switch (state_val_ew) //根据状态值,刷新各信号灯的状态
{ case 0: EW_green=1 ;//东西方向绿灯
EW_yellow=1;//东西方向黄灯
EW_red=0 ;//东西方向红灯
break;
case 1: EW_green=0 ;//东西方向绿灯
EW_yellow=1 ;//东西方向黄灯
EW_red=1 ;//东西方向红灯
break;
case 2: EW_green=1 ;//东西方向绿灯
EW_yellow=0 ;//东西方向黄灯
EW_red=1 ;//东西方向红灯
break;
}
}
}
}
//-------------------------
main()
{//初始化各变量
cnt_sn=init_sn[0];
cnt_ew=init_ew[0];
T0_cnt=0;
state_val_sn=0; //启动后,默认工作在序号为1的状态
state_val_ew=0;
//初始化各灯的状态
SN_green=0 ;//南北方向绿灯亮
SN_yellow=1 ;//南北方向黄灯灭
SN_red=1 ;//南北方向红灯灭
EW_green=1 ;//东西方向绿灯灭
EW_yellow=1;//东西方向黄灯灭
EW_red=0 ;//东西方向红灯亮
//初始化51的寄存器
TMOD=0x01;//用T1计时 8位自动装载定时模式
TH0 = 0x3c; // 设置定时器初值(定时50ms)
TL0 = 0xb0;
EA=1; //开中断
ET0=1;
TR0=1; //开定时器T1
while(1)
{
led_show(cnt_sn,cnt_ew);
if(state_val_sn==1)
{
unsigned char m;
for(m=0;m<=2;m++)
{
SN_yellow=~SN_yellow ;//南北方向黄灯
}
}
if(state_val_ew==2)
{
unsigned char n;
for(n=0;n<=2;n++)
{
EW_yellow=~EW_yellow ;//东西方向黄灯
}
}
}
}
电路图:
图1
展开阅读全文