#include
#define uchar unsigned char #define uint unsigned int
bit Flag_SN_Yellow; //SN黄灯标志位 bit Flag_EW_Yellow;//EW黄灯标志位 uchar Time_EW;//东西方向倒计时单元 uchar Time_SN;//南北方向倒计时单元
uchar EW=15,SN=10,EWL=19,SNL=19; //程序初始化赋值,正常模式 uchar EW1=60,SN1=40,EWL1=19,SNL1=19;//用于存放修改值的变量
ucharFlag_Moden=1; //模式变量 1正常模式 2 禁止南北通东西 3 禁止东西通南北 4 禁止东西南北 5 夜间模式 ucharFlag_key=0; uchar code table[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//1~~~~9段选码 sbit HC164_Data =P0^0; sbit HC164_Clk =P0^1; sbitEW_green =P0^2; sbitEW_yellow =P0^3; sbitEW_red =P0^4; sbitSN_red =P0^5; sbitSN_green =P0^7; sbitSN_yellow =P0^6;
sbitSN_RXD_red =P2^7; sbitSN_RXD_green =P2^6; sbitEW_RXD_red =P2^5; sbitEW_RXD_green =P2^4; sbit FMQ = P1^0; sbit key1 = P3^3; sbit key2 = P3^4; sbit key3 = P3^5;
sbit WEI1 =P2^3; // 东西数码管第一位 sbit WEI2 =P2^2; // 东西数码管第二位 sbit WEI3 =P2^1; // 南北数码管第一位 sbit WEI4 =P2^0; // 南北数码管第二位 //ucharew=40;sn=35; //函数 delay(uchar z) //功能能 延时 void Delay(uchar z) {
uchara,b;
for(a=z;a>0;a--)
for(b=200;b>0;b--); }
void HC_164_Set_byte(ucharduan) {
uchar i;
for(i=0;i<8;i++){
HC164_Data =duan& 0x80; HC164_Clk =0; HC164_Clk =1; duan =duan<<1; } }
void display_smg(ucharwei,ucharnum) {
switch(wei){
case 1: WEI1=0;WEI2=1;WEI3=1;WEI4=1;HC_164_Set_byte(table[num]);break; case 2: WEI1=1;WEI2=0;WEI3=1;WEI4=1;HC_164_Set_byte(table[num]);break; case 3: WEI1=1;WEI2=1;WEI3=0;WEI4=1;HC_164_Set_byte(table[num]);break; case 4: WEI1=1;WEI2=1;WEI3=1;WEI4=0;HC_164_Set_byte(table[num]);break; default: break; } }
void Display(void) {
ucharh,l;
h=Time_EW/10; l=Time_EW;
display_smg(1,h); Delay(8);
display_smg(2,l); Delay(8);
h=Time_SN/10; l=Time_SN;
display_smg(3,h); Delay(8);
display_smg(4,l); Delay(8); }
void Key() {
if(key1==0){ Delay(10);
if(key1==0){ while(!key1);
Flag_key++;
if(Flag_key==1) { Flag_Moden=2; }
if(Flag_key==2) { Flag_Moden=3; }
if(Flag_key==3) { Flag_Moden=4; }
if(Flag_key==4) { Flag_Moden=5; FMQ=1; TR0=1; }
if(Flag_key==5) {
Flag_EW_Yellow=0; //SN关黄灯信号位 Flag_SN_Yellow=0; //SN关黄灯信号位 FMQ=1;
Flag_Moden=1; TR0=1;//启动定时 Flag_key=0; } } }
if(key2==0){ while(!key2); Flag_Moden=2; }
if(key3==0){ while(!key3); Flag_Moden=3; } }
void timer0(void)interrupt 1 using 1 {
static uchar count;
TH0=(65536-50000)/256; TL0=(65536-50000)%6; count++;
if(count==10) {
if(Flag_SN_Yellow==1) //测试南北黄灯标志位 {SN_yellow=~SN_yellow;}
if(Flag_EW_Yellow==1) //测试东西黄灯标志位 {EW_yellow=~EW_yellow;} }
if(count==20) {
if(Flag_Moden==1){ Time_EW--; Time_SN--; }
if(Flag_SN_Yellow==1)//测试南北黄灯标志位 {SN_yellow=~SN_yellow;}
if(Flag_EW_Yellow==1)//测试东西黄灯标志位 {EW_yellow=~EW_yellow;} count=0; } }
//模式1
void Zc_moshi() {
//*******S0状态********** EW_RXD_red=0; //EW人行道禁止 EW_RXD_green=1;//EW人行道禁止 SN_RXD_red=1; //EW人行道通行
SN_RXD_green=0;//SN人行道通行
Flag_EW_Yellow=0; //EW关黄灯显示信号 Flag_SN_Yellow=0; //SN关黄灯显示信号 Time_EW=EW; //EW=45;SN=40; Time_SN=SN;
SN_green =0; //SN通行,EW红灯 SN_red =1; EW_red =0; EW_green =1;
while(Time_EW>5){
if(key1==0 || key2==0||key3==0) {
//Flag_Moden=1; TR0=0;//启动定时 break; }
Display(); }
SN_yellow=0; //SN黄灯亮开始闪烁5秒 SN_green =1; //灭
//*******S1状态********** Time_SN=5;
while(Time_EW<=5){
if(key1==0 || key2==0||key3==0) {
//Flag_Moden=1; TR0=0;//启动定时 break; }
Flag_SN_Yellow=1; //SN开黄灯信号位 Display(); }
//*******S2状态**********
Flag_SN_Yellow=0; //SN关黄灯显示信号 SN_yellow=1;
EW_RXD_red=1; //EW人行道通行 SN_RXD_green=1;//SN人行道禁止 EW_RXD_green=0; //EW人行道通行 SN_RXD_red=0;//SN人行道禁止 Time_EW=SN; //EW=45;SN=40; Time_SN=EW;
SN_green=1;//南北绿灯禁止 东西通行 SN_red=0; //亮 EW_red=1;
EW_green=0; //亮 while(Time_SN>5){
if(key1==0 || key2==0||key3==0) {
//Flag_Moden=1; TR0=0;//启动定时 break;