?? 交通燈設計.txt
字號:
/*****************************************************
十字路口交通燈控制 C 程序
******************************************************/
#include <at89x52.h>
#define uchar unsigned char
#define uint unsigned int
static uchar count;
uchar a;
sbit time_show_LED2=P1^6;//Time_Show_LED2控制位
sbit time_show_LED1=P1^7;//Time_Show_LED1控制位
sbit bjeee=P2^4;
sbit ns_green=P1^0; //NS綠燈
sbit ns_yellow=P1^2; //NS黃燈
sbit nsl_green=P1^1; //NS左拐綠燈
sbit we_green=P1^3; //WE綠燈
sbit we_yellow=P1^5; //WE黃燈
sbit wel_green=P1^4; //WE左拐綠燈
sbit we_LED2=P2^3; //WE_LED2控制位
sbit we_LED1=P2^2; //WE_LED1控制位
sbit ns_LED2=P2^1; //NS_LED2控制位
sbit ns_LED1=P2^0; //NS_LED1控制位
sbit add_button=P3^5; //時間加
sbit reduces_button=P3^6;//時間減
sbit special_btton=P3^7; //交通特殊按鍵
sbit wel_jc=P3^4; //東路口違規檢測
sbit nsl_jc=P3^3; //南路口違規檢測
sbit we_jc=P2^6; //西路口違規檢測
sbit ns_jc=P2^7; //北路口違規檢測
bit flag_ns_yellow; //SN黃燈標志位
bit flag_we_yellow; //EW黃燈標志位
uchar time_we; //東西方向倒計時單元
uchar time_ns; //南北方向倒計時單元
uchar special; //特殊按鍵控制位
bit wel_jcw; //東西左拐檢測控制位
bit we_jcw; //東西檢測控制位
bit ns_jcw; //南北檢測控制位
bit nsl_jcw; //南北左拐檢測控制位
uchar we=60,ns=40,wel=20,nsl=20; //程序初始化賦值,正常模式
uchar we1=60,ns1=40,wel1=20,nsl1=20;//用于存放修改值的變量
uchar code table[]={0xC0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
/**********************初始化程序************************/
void init()
{
IT0=1; //INT0負跳變觸發
TMOD=0x21; //定時器工作于方式1
TH0=(65536-50000)/256;//定時器賦初值
TL0=(65536-50000)%256;
TH1=0xfd;
TL1=0xfd;
SCON=0x70;
PCON=0x00;
EA=1; //CPU開中斷總允許
ES=1; //開串行口中斷
ET0=1;
// ET1=1; //開定時中斷
EX0=1; //開外部INTO中斷
TR0=1;
TR1=1; //啟動定時
ns_green=1;
nsl_green=0;
ns_yellow=0;
we_yellow=0;
we_green=0;
wel_green=0;
}
/**********************延時子程序************************/
void delay(uchar a)
{
uchar i;
i=a;
while(i--){;}
}
/*****************顯示子函數**************************/
void display(void)
{
char h,l;
h=time_we/10;
l=time_we%10;
P0=table[l];
we_LED2=1;
delay(2);
we_LED2=0;
P0=table[h];
we_LED1=1;
delay(2);
we_LED1=0;
h=time_ns/10;
l=time_ns%10;
P0=table[l];
ns_LED2=1;
delay(2);
ns_LED2=0;
P0=table[h];
ns_LED1=1;
delay(2);
ns_LED1=0;
h= we1/10;
l= we1%10;
P0=table[l];
time_show_LED1=1;
delay(2);
time_show_LED1=0;
P0=table[h];
time_show_LED2=1;
delay(2);
time_show_LED2=0;
if(we_jcw==1|wel_jcw==1|ns_jcw==1|nsl_jcw==1) //報警檢測
{
bjeee=0;
}
else
{
bjeee=1;
}
}
/**********************串行口中斷服務程序************************/
void como() interrupt 4
{
EA=0; //關總中斷
if(RI)
{ a=SBUF;
if(a=='a') //時間加
{ we1+=5;
ns1+=5;
if(we1>=100)
{
we1=99;
ns1=79;
}
}
if(a=='r') //時間減
{ we1-=5;
ns1-=5;
if(we1<=40)
{
we1=40;
ns1=20;
}
}
if(a=='s') //測試按鍵是否按下,按下為特殊狀態
{
special++; //特殊按鍵控制位加1
if(special%2==1)
{ ET0=0; //定時器停止
ns_green=0; //全部亮紅燈
nsl_green=0;
we_green=0;
wel_green=0;
ns_yellow=0;
we_yellow=0;
}
if(special%2==0)ET0=1; //開定時器
}
SBUF=1; //返回1
RI=0; //清標志位
}
else if(TI)
{ TI=0; //清標志位
}
EA=1; //開總中斷
}
/**********************外部0中斷服務程序************************/
void exinto(void) interrupt 0 using 1
{
EX0=0; //關中斷
if(add_button==0) //時間加
{
we1+=5;
ns1+=5;
if(we1>=100)
{
we1=99;
ns1=79;
}
}
if(reduces_button==0) //時間減
{
we1-=5;
ns1-=5;
if(we1<=40)
{
we1=40;
ns1=20;
}
}
if(special_btton==0) //測試按鍵是否按下,按下為特殊狀態
{
special++; //特殊按鍵控制位加1
if(special%2==1)
{ ET0=0; //定時器停止
ns_green=0; //全部亮紅燈
nsl_green=0;
we_green=0;
wel_green=0;
ns_yellow=0;
we_yellow=0;
}
if(special%2==0)ET0=1; //開定時器
}
EX0=1; //開中斷
}
/**********************T0中斷服務程序*******************/
void timer0(void)interrupt 1 using 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
count++;
if(count==10)
{
if(flag_ns_yellow==1) //測試南北黃燈標志位
{ns_yellow=~ns_yellow;}
if(flag_we_yellow==1) //測試東西黃燈標志位
{we_yellow=~we_yellow;}
}
if(count==20)
{
time_we--;
time_ns--;
// SBUF=time_we;
while (TI== 0);
// SBUF=time_ns;
while (TI== 0);
if(flag_ns_yellow==1) //測試南北黃燈標志位
{ns_yellow=~ns_yellow;}
if(flag_we_yellow==1) //測試東西黃燈標志位
{we_yellow=~we_yellow;}
count=0;
}
}
/*********************主程序開始**********************/
void main(void)
{
init(); //初始化
while(1)
{
/*******S0狀態**********/
flag_we_yellow=0; //EW關黃燈顯示信號
time_we=we;
time_ns=ns;
ns_green=1; //SN通行,EW紅燈
while(time_ns>5)
{
if(we_jc==0)we_jcw=1; //違規檢測
if(wel_jc==0)wel_jcw=1;
if(nsl_jc==0)nsl_jcw=1;
display(); //顯示
}
/*******S1狀態**********/
while(time_ns>0)
{flag_ns_yellow=1; //SN開黃燈信號位 SN黃燈亮,等待左拐信號,EW紅燈
if(we_jc==0)we_jcw=1; //違規檢測
if(wel_jc==0)wel_jcw=1;
if(nsl_jc==0)nsl_jcw=1;
display();
}
if(we_jcw==1)SBUF='w'; while (TI== 0); //檢測通信
if(wel_jcw==1)SBUF='x'; while (TI== 0);
if(ns_jcw==1)SBUF='y'; while (TI== 0);
if(nsl_jcw==1)SBUF='z'; while (TI== 0);
/*******S2狀態**********/
flag_ns_yellow=0; //SN關黃燈顯示信號
time_ns=nsl;
nsl_jcw=0; //清標志位
wel_jcw=0;
we_jcw=0;
ns_green=0;
nsl_green=1;
while(time_ns>5)
{
if(we_jc==0)we_jcw=1; //SN左拐綠燈亮,EW紅燈
if(wel_jc==0)wel_jcw=1; //違規檢測
if(ns_jc==0)ns_jcw=1;
display();}
/*******S3狀態**********/
while(time_ns>0)
{flag_ns_yellow=1; //SN開黃燈信號位
if(we_jc==0)we_jcw=1;
if(wel_jc==0)wel_jcw=1;
if(ns_jc==0)ns_jcw=1;
display();}
if(we_jcw==1)SBUF='w'; while (TI== 0); //檢測通信
if(wel_jcw==1)SBUF='x'; while (TI== 0);
if(ns_jcw==1)SBUF='y'; while (TI== 0);
if(nsl_jcw==1)SBUF='z'; while (TI== 0);
/***********賦值**********/
we=we1;
ns=ns1;
wel=wel1;
nsl=nsl1;
/*******S4狀態**********/
flag_ns_yellow=0; //SN關黃燈顯示信號
time_we=ns;
time_ns=we;
ns_jcw=0; //清標志位
wel_jcw=0;
we_jcw=0;
nsl_green=0;
we_green=1;
while(time_we>5)
{ //EW通行,SN紅燈
if(ns_jc==0)ns_jcw=1; //違規檢測
if(wel_jc==0)wel_jcw=1;
if(nsl_jc==0)nsl_jcw=1;
display();}
/*******S5狀態**********/
while(time_we>0)
{flag_we_yellow=1; //EW開黃燈信號位
if(ns_jc==0)ns_jcw=1;
if(wel_jc==0)wel_jcw=1; //違規檢測
if(nsl_jc==0)nsl_jcw=1;
display();}
if(we_jcw==1)SBUF='w'; while (TI== 0); //檢測通信
if(wel_jcw==1)SBUF='x'; while (TI== 0);
if(ns_jcw==1)SBUF='y'; while (TI== 0);
if(nsl_jcw==1)SBUF='z'; while (TI== 0);
/*******S6狀態**********/
flag_we_yellow=0; //EW關黃燈顯示信號
time_we=wel;
nsl_jcw=0; //清標志位
wel_jcw=0;
ns_jcw=0;
we_green=0;
wel_green=1;
while(time_we>5)
{ //EW左拐綠燈亮,SN紅燈
if(we_jc==0)we_jcw=1;
if(ns_jc==0)ns_jcw=1; //違規檢測
if(nsl_jc==0)nsl_jcw=1;
display();}
/*******S7狀態**********/
while(time_we>0)
{flag_we_yellow=1; //EN開黃燈信號位
if(we_jc==0)we_jcw=1;
if(ns_jc==0)ns_jcw=1; //違規檢測
if(nsl_jc==0)nsl_jcw=1;
display();}
if(we_jcw==1)SBUF='w'; while (TI== 0); //檢測通信
if(wel_jcw==1)SBUF='x'; while (TI== 0);
if(ns_jcw==1)SBUF='y'; while (TI== 0);
if(nsl_jcw==1)SBUF='z'; while (TI== 0);
/***********賦值**********/
nsl_jcw=0; //清標志位
we_jcw=0;
ns_jcw=0;
wel_green=0;
ns_green=1;
we=we1;
ns=ns1;
wel=wel1;
nsl=nsl1;
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -