成都理工大学毕业论文 — 交通灯
附录:
系统总体电路图:
交通灯总原理图
26
成都理工大学毕业论文 — 交通灯
总程序:
//****************************************************** //作品名称: 十字路口简易交通灯 //设计者: 刘伟 //功能介绍:
// KEY1按下,设置时间 // KEY2按下,恢复
// KEY3按下,东西禁止通行 // KEY4按下,南北禁止通行 //设计时间: 2009.5.15
//****************************************************** #include
//=========================================================== #define uchar unsigned char #define uint unsigned int
//=====================指示灯状态定义======================== #define ALL_OFF (P0 = 0xdb)//全部禁行
#define EW_ON (P0 = 0xeb) //东西绿灯,南北红灯 #define SN_ON (P0 = 0xdd) //南北绿灯,东西红灯 #define EW_Y_ON (P0 = 0xF3) //南北红灯,东西黄灯亮 #define EW_Y_OFF (P0 = 0xFB) //南北红灯,东西黄灯灭 #define SN_Y_ON (P0 = 0xDE) //东西红灯,南北黄灯亮 #define SN_Y_OFF (P0 = 0xDF) //东西红灯,南北黄灯灭 #define COUNT_DOWN 70 //定时时间 #define INTERIM t //黄灯过渡时间
//====================按键定义=============================== sbit KEY1 = P2^4; //时间设置 sbit KEY2 = P2^5; //恢复 sbit KEY3 = P2^6; //东西禁行 sbit KEY4 = P2^7; //南北禁行
//====================函数定义=============================== void TIME_Init (); //定时器初始化 void Delay1Ms(uchar t); //延时t*1Ms void Delay1s(uchar t); //延时t*1s void key_scan(); //键盘扫描
//======================数码管选择定义=======================
const uchar LED7Code[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; //段码 const uchar LED[]={0x01,0x02,0x04,0x08,0x00};//共阳数码管位选 //====================变量定义=============================== uchar t50ms = 0; //50ms累加位
uchar half_sec,sec; //半秒,秒寄存器 uchar key_flag; //键值标记位 uint t;
bit aspect_flag = 0; //0:东西通行,1:南北通行 bit interim_flag = 0; //0:东西黄灯,1:南北黄灯
////////////////////////////主函数////////////////////////// Void main ()
27
成都理工大学毕业论文 — 交通灯
{
t=5;
TIME_Init (); //定时器初始化 sec=COUNT_DOWN; //定时初值 while(1) {
key_scan(); //按键扫描 switch (key_flag) {
case 0:t++;if(t>=30)t=5;break;//设置时间 case 1:TR0 = 1;break; //恢复
case 2:EW_ON;P1=LED[4];TR0 = 0;break; //南北禁行,定时器停止 case 3:SN_ON;P1=LED[4];TR0 = 0;break; //东西禁行,定时器停止 }
//==========状态S1========
if( (aspect_flag == 0)&(interim_flag == 0)&(key_flag == 0) ) {
EW_ON; P1=LED[0];
P2=LED7Code[(sec-INTERIM)/10]; //东西方向绿灯,少5秒 Delay1Ms(1); P2 = 0XFF; P1=LED[1];
P2=LED7Code[(sec-INTERIM)]; Delay1Ms(1); P1=LED[2];
P2=LED7Code[sec/10]; //南北方向红灯 Delay1Ms(1); P2=0XFF; P1=LED[3];
P2=LED7Code[sec]; Delay1Ms(1); }
//==========状态S2========
if( (aspect_flag == 0)&(interim_flag == 1)&(key_flag == 0) ) {
if(half_sec % 2 == 1) EW_Y_ON; else EW_Y_OFF; P1=LED[0];
P2=LED7Code[sec/10]; //东西方向黄灯 Delay1Ms(1); P2 = 0XFF; P1=LED[1];
P2=LED7Code[sec]; Delay1Ms(1); P1=LED[2];
P2=LED7Code[sec/10]; //南北方向红灯 Delay1Ms(1); P2 = 0XFF; P1=LED[3];
28
成都理工大学毕业论文 — 交通灯
P2=LED7Code[sec]; Delay1Ms(1); }
//==========状态S3========
if( (aspect_flag == 1)&(interim_flag == 0)&(key_flag == 0) ) {
SN_ON; P1=LED[0];
P2=LED7Code[sec/10]; //东西方向红灯 Delay1Ms(1); P2 = 0XFF; P1=LED[1];
P2=LED7Code[sec]; Delay1Ms(1); P1=LED[2];
P2=LED7Code[(sec-INTERIM)/10]; //南北方向绿灯,少5秒 Delay1Ms(1); P2 = 0XFF; P1=LED[3];
P2=LED7Code[(sec-INTERIM)]; Delay1Ms(1); }
//==========状态S4========
if( (aspect_flag == 1)&(interim_flag == 1)&(key_flag == 0) ) {
if(half_sec % 2 == 1) SN_Y_ON; else SN_Y_OFF; P1=LED[0];
P2=LED7Code[sec/10]; Delay1Ms(1); P2 = 0XFF; P1=LED[1];
P2=LED7Code[sec]; Delay1Ms(1); P1=LED[2];
P2=LED7Code[sec/10]; Delay1Ms(1); P2 = 0XFF; P1=LED[3];
P2=LED7Code[sec]; Delay1Ms(1); } } }
/****************************************************************** 名称:void TIME_Init (); 功能:定时器初始化 指令:
29
成都理工大学毕业论文 — 交通灯
调用:无 返回:无
/******************************************************************/ void TIME_Init () {
TMOD = 0x01;
RCAP2H =(65536-50000)/256; //定时50ms 自动重装 RCAP2L =(65536-50000)%6; EA = 1; //总中断使能 ET0 = 1; //定时器0中断开 TR0 = 1; //关定时器0 }
/****************************************************************** 名称:void Tim0 () interrupt 1 功能:T0中断, 参数: 调用: 返回:
******************************************************************/ void PWM_Time0 () interrupt 1 {
RCAP2H =(65536-50000)/256; //定时50ms 自动重装 RCAP2L =(65536-50000)%6; TF2 = 0; //清零中断标志位 //ET2 = 0; //定时器0中断禁止 if(++ t50ms == 10) {
half_sec++; t50ms = 0; }
if(half_sec == 2) {
half_sec = 0; //清零 if(--sec ==INTERIM ) {
interim_flag = 1;//黄灯闪烁标志 }
if(sec ==0) {
sec = COUNT_DOWN;
aspect_flag = !aspect_flag; //换向 interim_flag = 0;//黄灯闪烁关闭 } } }
/****************************************************************** 名称:void key_scan() 功能:按键扫描 参数: 调用:
30