?? shixun4.c
字號:
/**********************************************************************
程序名稱:ShiXun4.c
程序功能:帶緊急情況處理的十字路口交通信號燈控制
程序作者:張三
創建時間:2008-3-28
**********************************************************************/
#include <reg51.h>
#define uchar unsigned char
#define FX_Time 2 // 放行時間,單位為s
#define JG_Time 1 // 警告時間,單位為s
#define FX_Cnt FX_Time*20 // 振蕩器頻率為12MHz,基本延時單位為50ms
#define JG_Cnt JG_Time*20 // 振蕩器頻率為12MHz,基本延時單位為50ms
uchar DispX[7] = { 0x9a, 0x9e, 0xa9, 0xe9, 0x99, 0x9a, 0xa9 }; // 信號燈控制碼
uchar Counter; // 用于記錄T0中斷次數,T0每50ms中斷1次
sbit K1 = P3^5; // 雙向緊急禁行按鍵
sbit K2 = P3^6; // 東西緊急放行按鍵
sbit K3 = P3^7; // 南北緊急放行按鍵
bit FX_End; // 放行結束標志位,1結束,0等待
bit JG_End; // 警告結束標志位,1結束,0等待
bit Key; // 緊急按鍵狀態標志位,1有鍵按下,0無鍵按下
void FangXing( uchar *PTR ); // 放行函數
void JingGao( uchar *PTR ); // 警告函數
/**********************************************************************
函數名稱:Time0( void ) interrupt 1 using 2
函數功能:T0中斷服務程序。延時,基本單位為50ms,控制點有FX_Time、JG_Time兩個
函數作者:張三
創建時間:2008-3-28
**********************************************************************/
void Time0( void ) interrupt 1 using 2
{
TH0 = 0x3c; // 重裝T0初值
TL0 = 0xb0;
Counter++;
Key = !K1 || !K2 || !K3; // 緊急按鍵狀態,1有鍵按下,0無鍵按下
if( Key ){
Counter = 0x00;
if( ( K1==0)&&(K2&&K3==1) ) P1 = 0x99;
else if( (K2==0)&&(K1&&K3==1) ) P1 = 0x9a;
else if( (K3==0)&&(K1&&K2==1) ) P1 = 0xa9;
}
else{
if( Counter == FX_Cnt ) FX_End = 1;
else if( Counter ==( FX_Cnt + JG_Cnt ) ){
JG_End = 1;
Counter = 0x00;
}
}
}
/**********************************************************************
函數名稱:Init( void )
函數功能:系統初始化
函數作者:張三
創建時間:2008-3-28
**********************************************************************/
void Init( void )
{
IP = 0x01;
TMOD = 0x01; // T0以方式1工作,由TR0控制其啟停
TH0 = 0x3c; // T0初值
TL0 = 0xb0;
EA = 1; // 開中斷
EX0 = 1; // 允許X0中斷
ET0 = 1; // 允許T0中斷
TR0 = 1; // 啟動T0
FX_End = 0;
JG_End = 0;
Counter = 0x00;
}
/**********************************************************************
函數名稱:main( void )
函數功能:主函數,控制信號燈正常運行
調用函數:DelayXs( unsigned char x)
函數作者:張三
創建時間:2008-3-28
**********************************************************************/
void main( void )
{
uchar *PTR = &DispX; // 指針PTR指向數組Dispx的首地址
Init( ); // 開機信號燈全亮,用于信號燈檢測
for(;;){
if( Key ) continue;
FangXing( PTR ); // 東西方向放行
JingGao( ++PTR ); // 東西方向警告
FangXing( ++PTR ); // 南北方向放行
JingGao( ++PTR ); // 南北方向警告
PTR = &DispX;
}
}
/**********************************************************************
函數名稱:FangXing( unsigned char *PTR )
函數功能:東西方向或南北方向放行
函數作者:張三
創建時間:2008-3-28
**********************************************************************/
void FangXing( uchar *PTR )
{
while( ~FX_End ){
if(Key) break;
else P1 = *PTR;
}
FX_End = 0;
}
/**********************************************************************
函數名稱:JingGao( unsigned char *PTR )
函數功能:東西方向或南北方向警告
函數作者:張三
創建時間:2008-3-28
**********************************************************************/
void JingGao( uchar *PTR )
{
while( ~JG_End ){
if(Key) break;
else P1 = *PTR;
}
JG_End = 0;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -