📄 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 + -