?? ?
字號:
//程序:ex4_4.c
//功能:交通燈控制程序
#include <REG51.H>
unsigned char t0,t1; //定義全局變量,用來保存延時時間循環次數
//函數名:delay0_5s1
//函數功能:用T1的方式1編制0.5秒延時程序,假定系統采用12MHz晶振,定
// 時器1、工作方式1定時50ms,再循環10次即可定時到0.5秒
//形式參數:無
//返回值:無
void delay0_5s1()
{
for(t0=0;t0<0x0a;t0++) // 采用全局變量t0作為循環控制變量
{
TH1=0x3c; // 設置定時器初值
TL1=0xb0;
TR1=1; // 啟動T1
while(!TF1); // 查詢計數是否溢出,即定時50ms時間到,TF1=1
TF1=0; // 50ms定時時間到,將定時器溢出標志位TF1清零
}
}
//函數名:delay_t1
//函數功能:實現0.5秒~128秒延時
//形式參數:unsigned char t;
// 延時時間為0.5秒×t
//返回值:無
void delay_t1(unsigned char t)
{
for(t1=0;t1<t;t1++) // 采用全局變量t0作為循環控制變量
delay0_5s1();
}
//函數:int_0
//函數功能:外部中斷0中斷函數,緊急情況處理,當CPU響應外部中斷0的中斷請求時,
// 自動執行該函數,實現兩個方向紅燈同時亮10秒
//形式參數:無
//返回值:無
void int_0() interrupt 0 // 緊急情況中斷
{
unsigned char i,j,k,l,m;
i=P1; // 保護現場,暫存P1口、t0、t1、TH1、TH0
j=t0;
k=t1;
l=TH1;
m=TH0;
P1=0xdb; // 兩個方向都是紅燈
delay_t1(20); // 延時10秒
P1=i; // 恢復現場,恢復進入中斷前P1口、t0、t1、TH1、TH0
t0=j;
t1=k;
TH1=l;
TH0=m;
}
//函數:int_1
//函數功能:外部中斷1中斷函數,特殊情況處理,當CPU響應外部中斷1的中斷請求時,
// 自動執行該函數,實現A道放行5秒
//形式參數:無
//返回值:無
void int_1() interrupt 2 // 特殊情況中斷
{
unsigned char i,j,k,l,m;
EA=0; //關中斷
i=P1; // 保護現場,暫存P1口、t0、t1、TH1、TH0
j=t0;
k=t1;
l=TH1;
m=TH0;
EA=1; // 開中斷
P1=0xf3; // A道放行
delay_t1(10); // 延時5秒
EA=0; // 關中斷
P1=i; // 恢復現場,恢復進入中斷前P1口、t0、t1、TH1、TH0
t0=j;
t1=k;
TH1=l;
TH0=m;
EA=1; //開中斷
}
void main() //主函數
{
unsigned char k;
TMOD=0x10; // T1工作在方式1
EA=1; // 開放總中斷允許位
EX0=1; // 開外部中斷0中斷允許位
IT0=1; // 設置外部中斷0為下降沿觸發
EX1=1; // 開外部中斷1中斷允許位
IT1=1; // 設置外部中斷1為下降沿觸發
while(1) {
P1=0xf3; // A綠燈,B紅燈,延時5秒
delay_t1(10);
for(k=0;k<3;k++){ // A綠燈閃爍3次
P1=0xf3;
delay0_5s1(); // 延時0.5秒
P1=0xfb;
delay0_5s1(); // 延時0.5秒
}
P1=0xeb; // A黃燈,B紅燈,延時2秒
delay_t1(4);
P1=0xde; // A紅燈,B綠燈,延時5秒
delay_t1(10);
for(k=0;k<3;k++) // B綠燈閃爍3次
{
P1=0xde;
delay0_5s1(); // 延時0.5秒
P1=0xdf;
delay0_5s1(); // 延時0.5秒
}
P1=0xdd; // A紅燈,B黃燈,延時2秒
delay_t1(4);
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -