#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit P1_0 =P1^0; //定义P1.0
sbit P1_1 =P1^1; //定义P1.1
sbit P1_2 =P1^2; //定义P1.2
sbit P1_3 =P1^3; //定义P1.3
sbit ew_red=P0^0; //定义P0.0为东西方向红灯控制位
sbit ew_yellow=P0^1; //定义P0.1为东西方向黄灯控制位
sbit ew_green=P0^2; //定义P0.2为东西方向绿灯控制位
sbit sn_red=P0^3; //定义P0.3为南北方向红灯控制位
sbit sn_yellow=P0^4; //定义P0.4为南北方黄灯控制位
sbit sn_green=P0^5; //定义P0.5为南北方向绿灯控制位
sbit key_earth_west=P3^2; //定义P3.2东西方向通行控制按键
sbit key_sourth_north= P3^3; //定义P3.3南北方向通行控制按键
sbit all_not=P3^4; //定义P3.4为全部禁行控制位
sbit key_earth_west_add=P3^0; //定义P3.0为东西加
sbit key_earth_west_jian= P3^1; // 定义P3.1为东西减
sbit key_sourth_north_add=P3^5; // 定义P3.5为南北加
sbit key_sourth_north_jian= P3^6; // 定义P3.6为南北减
uchar code s7_table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//七段码显示0-9
uchar a,b,c,d;
uchar sou_nor_time; //南北通行时间变量定义
uchar east_weat_time; //东西通行时间变量定义
uchar time_flag; //时间标志位定义
uchar traffic_flag; //traffic_flag=0时南北通行,=1时东西通行
uchar time_multiply; //定义计时变量
void delayms(uchar z) //延时子程序
{
uchar i,j; //一个毫秒的延时
for(i=z;i>0;i--)
for(j=110;j>0;j--);
}
void display_time( ) //显示倒计时子程序
{
P1_0 =0; //P1.0输出低电平,位选使能
P1_1 =1; //P1.1输出高电平
P1_2 =1; //P1.2输出高电平
P1_3 =1; //P1.3输出高电平
P2=s7_table[a/10]; //P2端口输出显示的段码
delayms(2); //延时2毫秒
P2=0; //P2端口输出低电平
P1_0 =1; //P1.0输出高电平
P1_1 =0; //P1.1输出低电平,位选使能
P2=s7_table[b%10]; //P2端口输出显示的段码
delayms(2); //延时2毫秒
P2=0; //P2端口输出低电平
P1_1 =1; //P1.1输出高电平
P1_2 =0; //P1.2输出低电平,位选使能
P2=s7_table[(c)/10]; //P2端口输出显示的段码
delayms(2); //延时2毫秒
P2=0; //P2端口输出低电平
P1_2 =1; //P1.2输出高电平
P1_3 =0; //P1.3输出低电平,位选使能
P2=s7_table[(d)%10]; //P2端口输出显示的段码
delayms(2); //延时2毫秒
P2=0; //P2端口输出低电平
P1_3 =1; //P1.3输出高电平
}
void south_north_allow() //南北通行
{
ew_red=0; //东西红灯亮
ew_green=1; //东西绿灯灭
ew_yellow=1; //东西黄灯灭
sn_red=1; //南北红灯灭
sn_green=0; //南北绿灯亮
sn_yellow=1; //南北黄灯灭
}
void east_west_allow() //东西通行
{
ew_red=1; //东西红灯灭
ew_green=0; //东西绿灯亮
ew_yellow=1; //东西黄灯灭
sn_red=0; //南北红灯亮
sn_green=1; //南北绿灯灭
sn_yellow=1; //南北绿灯灭
}
void init0_timer0() //定时器0初始化子程序
{
TMOD=0X01; //定时器0设置为模式1
TH0=(65536-50000)/256; //TH0装载初值
TL0=(65536-50000)%256; //TL0装载初值
ET0=1; //开启定时器中断
EA=1; //开启CPU中断
TR0=1; //启动定时器T0
}
void keyscan() //键盘扫描子程序
{
if(key_sourth_north==0) //判断南北通行控制按键是否按下
{
delayms(2); //延时2毫秒
if(key_sourth_north==0) //再次判断南北通行控制按键是否按下
{
south_north_allow(); //调用南北通行子程序
while(!key_sourth_north) display_time(); //南北通行时,
//显示通行倒计时
TR0=0; //南北通行结束,关闭定时器T0
}
}
if(key_earth_west==0) //判断东西通行控制按键是否按下
{
delayms(2); //延时2毫秒
if(key_earth_west==0) //再次判断东西通行控制按键是否按下
{
east_west_allow(); //调用东西通行子程序
while(!key_earth_west) display_time(); //东西通行时,
//显示通行倒计时
TR0=0; //东西通行结束,关闭定时器T0
}
}
if(all_not==0)