⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 shixun4.c

📁 单片机C语言程序设计教程与实训源代码及图片 单片机C语言程序设计教程与实训源代码及图片
💻 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 + -