📄 main.c
字号:
/***************************************/
/* 十字路口交通灯控制系统 */
/* 开发语言:C51 */
/* 编译器:keil C51 V7.06 */
/***************************************/
/*采用线选法寻址8255A */
/*PA Address 7FFCH */
/*PB Address 7FFDH */
/*PC Address 7FFEH */
/*Control Address 7FFFH */
/*晶振: 12M */
/*单片机:AT89s51 */
/***************************************/
#include "at89x51.h"
#include "absacc.h"
#define KEY XBYTE [0x7FFC]
#define LED XBYTE [0x7FFD]
#define Control XBYTE [0x7FFF]
#define R_ON_G_ON 0x2e//东西方向红灯亮 南北方向绿灯亮
#define R_ON_G_OFF 0x3e//东西方向红灯亮 南北方向绿灯灭
#define R_ON_Y_ON 0x1e//东西方向红灯亮 南北方向黄灯亮
#define G_ON_R_ON 0x35//东西方向绿灯亮 南北方向红灯亮
#define G_OFF_R_ON 0x37//东西方向绿灯灭 南北方向红灯亮
#define Y_ON_R_ON 0x33//东西方向黄灯亮 南北方向红灯亮
unsigned char data second;
unsigned char data msecond;
unsigned char data caution;
bit complete;
/****************************************************************/
/*******************************/
/* 定时器初始化 */
/* 输入:无 */
/* 输出:无 */
/*******************************/
void init_t(void)
{
TMOD=0X21; //定时器0工作在方式1 10ms产生一次中断
TH0=0xd8;
TL0=0xf0;
EA=1;
ET0=1;
}
/****************************************************************/
/***************************************/
void init_8255A(void)
{Control=0x98; //PA口工作于方式0 输入
//PB口工作于方式0 输出
//PC7-4输入 PC3-0 输出
}
/****************************************************************/
/*******************************/
/* 键盘检测延迟函数 */
/* 输入:无 */
/* 输出:无 */
/*******************************/
void key_delay(void)
{unsigned int i;
i=1000;
while(--i);
}
/****************************************************************/
/*******************************/
/* 键盘检测函数 */
/* 输入:无 */
/* 输出:键盘检测值 */
/*******************************/
unsigned char key_detect(void)
{unsigned char key;
key=KEY;
key_delay(); //延迟约20MS 消除按键抖动
if((key==KEY)&&(key==0xFE))
return 0x01; //若两次按键值相同 且 PA0为0 为有效按键 返回 0x01
else return 0x00; //否则还回 0x00
}
/***************************************************************************************/
/*******************************/
/* 主函数 */
/* 输入:无 */
/* 输出:无 */
/*******************************/
/***************************************/
main()
{ init_8255A(); //8255初始化
init_t(); //定时器初始化 定时器未开启
while(1)
{switch( key_detect()) //键盘检测
{
case 0x00:LED=0xFF;TR0=0;break; //检测函数为 0x00 开关断开 关闭定时器 交通灯停止工作
case 0x01:TR0=1 ; break; //检测函数为 0x01 开关闭合 启动定时器 交通灯开始工作
default:LED=0xFF ;TR0=0;break; //检测函数为其他值 关闭定时器 交通灯停止工作
}
}
}
/***************************************/
/***************************************************************************************/
/*******************************/
/* 定时中断服务函数 */
/* 输入:无 */
/* 输出:无 */
/*******************************/
void timer0_isp()interrupt 1 using 2
{ TR0=0; //关闭定时器
if(++msecond==100) //10毫秒中断一次 100次为1秒
{msecond=0;
++second;
}
if(msecond==3)
complete=~complete; //设定闪烁标志位
//-----------------------------------------------------------------------------------
if(second<=15) caution=0x01; //0-15s 东西方向红灯亮, 南北方向绿灯亮 共15s
else if(second<=18) caution=0x02; //15-18s 东西方向红灯亮, 南北方向绿灯闪烁 共3s
else if(second<=20) caution=0x03; //18-20s 东西方向红灯亮, 南北方向黄灯亮 共2s
else if(second<=35) caution=0x04; //20-35s 东西方向绿灯亮, 南北方向红灯亮 共15s
else if(second<=38) caution=0x05; //35-38s 东西方向绿灯闪烁,南北方向红灯亮 共3s
else caution=0x06; //38-40s 东西方向黄灯亮, 南北方向红灯亮 共2s
//-------------------------------------------------------------------------------------
switch(caution)
{case 0x01:LED=R_ON_G_ON;break; //东西方向红灯亮 南北方向绿灯亮
case 0x02:if(complete)
LED=R_ON_G_ON ;
else LED=R_ON_G_OFF;
break; //东西方向红灯亮 南北方向绿灯闪动
case 0x03:LED=R_ON_Y_ON;break; //东西方向红灯亮 南北方向黄灯亮
case 0x04:LED=G_ON_R_ON;break; //东西方向绿灯亮 南北方向红灯亮
case 0x05:if(complete)
LED=G_ON_R_ON;
else LED=G_OFF_R_ON;
break; //东西方向绿灯闪动 南北方向红灯亮
case 0x06:LED=Y_ON_R_ON;break; //东西方向黄灯亮 南北方向红灯亮
default :LED=0xFF;break; //其他情况下 交通停止工作
}
//-------------------------------------------------------------------------------------
if(second==40) second=0; //40秒完成一次交通灯循环 秒值归0
TH0=0xd8; //10ms //校正定时器启动值
TL0=0xf0;
TR0=1; //重新启动定时器
}
/*********************************************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -