1、附录一:系统总程序#include/*初始变量设定*/ sbit p1_0=P10; /定义P0口的8位 sbit p1_1=P11; sbit p1_2=P12; sbit p1_3=P13; sbit p1_4=P14; sbit p1_5=P15; sbit p0_0=P16; bit flag=0; /定义显示状态控制位 int ns_time; /定义东西,南北红黄绿各自的时间初值分别为20,15,5秒 int ew_time; int ns_time_red=20; int ns_time_green=15; int ns_time_yellow=5; int ew_time_re
2、d=20; int ew_time_green=15; int ew_time_yellow=5; char point=20; /定时的控制次数初值设定 int a=0; /南北,东西两方向切换状态标志初值设定/*延时子函数*/ delay(int t) /延时子函数 while(t-); /*显示子函数*/ display(int ew_time,int ns_time) /显示子函数 char table10=0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09; /共阳极数码显示0-9对应的字型码 char i,a4; a2=ns_time
3、%10; /南北时间个位数赋值给a2 a3=ns_time/10; /南北时间十位数赋值给a3 a0=ew_time%10; /东西时间个位数赋值给a0 a1=ew_time/10; /东西时间个位数赋值给a1 SM1=0;SM0=0; /串行口工作方式0设定 for(i=3;i=0;i-) /分别将4位数送到SBUF区域 SBUF=tableai; while(!TI) ; /判断是否发送完一个数据TI=0; /假设发送完,0赋给TI /*主函数*/ void main(void) TMOD=0x01; /设置定时方式1TH0=0x3c; /定时初值50MSTL0=0xb0;TR0=1; /
4、T0溢出中断请求开启EA=1; /总中断开启ET0=1; /T0中断开启 EX0=1; /外部中断INT0开启 IT0=1; /设置开关下降沿有效 EX1=1; /外部中断INT0开启IT1=1; /设置开关下降沿有效ns_time=ns_time_green; /东西南北红黄绿灯时间赋值ew_time=ew_time_red;ew_time_red=ns_time_green+ns_time_yellow; if(!a) /a=0,东西显示19开始倒计时,南北14开始倒计时 ns_time=ew_time_red; ew_time=ns_time_green+ns_time_yellow;
5、while(!a) /a=0,进入循环 if(ew_time-50) while(!flag); display(ew_time,ew_time-5); /flag=1,显示东西19,南北14 P1=0xdd; /南北绿灯,东西红灯flag=0; if(ew_time=5) /东西时间0) /南北红灯,东西绿灯 while(!flag); display(ns_time-5,ns_time); /flag=0,显示南北19,东西14 delay(5000); /延时子函数调用 P1=0xeb; /南北红扥个,东西绿灯显示if(ns_time-5=0) /南北时间=5时南北红灯,东西黄灯闪烁 w
6、hile(!flag); /flag=0南北显示19开始倒计时,东西14开始倒计时 flag=0; display(ns_time,ns_time); /东西,南北均从5开始倒计时显示 P1=0xfb; /南北红灯,东西黄灯一亮一灭显示 p1_3=p1_3; /东西黄灯位取反,以实现黄灯亮灭变化显示 delay(5000); /延时函数调用if(ns_time=0) /如果南北时间为0赋值a为0a=0; /*t0中断定时子函数*/ int t0int()interrupt 1 /t0中断定时器0中断子函数 TH0=0x3c; /定时50ms初值设定TL0=0xb0; point-; /20次T
7、0定时次数控制 if(point=0) /如果20次到了,改变显示的东西南北方向的时间flag=1;point=20;if(ns_time!=0)ns_time-;if(ew_time!=0)ew_time-; /*int0中断紧急情况处理子函数*/ void int0(void) interrupt 0 /int0中断子函数,当紧急情况救护车等发生时,对应INT0按键调用此函数 int i,j; display(00,00); /显示器显示0000,不再进行倒计时delay(5000); for(i=0;i10;i+) /利用flag实现东西南北方向红灯均显示亮,对应东西南北方向车流均停止,
8、处理紧急情况 for(j=0;j10;j+) delay(50000); while(!flag) P1=0xdb; flag=0; /*int1中断流量处理子函数*/ void int1(void) interrupt 2 /int1中断子函数,当紧急情况救护车等发生时,对应INT1按键调用此函数 int i,j; display(00,00); /显示器显示0000,不再进行倒计时 for(i=0;i10;i+) for(j=0;j10;j+) /利用flag实现主干道东西方向绿灯南北方向红灯 while(!flag) P1=0xeb; flag=0; 系统总硬件电路仿真图系统硬件电路总图
9、包括复位电路,时钟电路,按键紧急处理电路,LED显示电路,数码管显示电路模块,对应各自电路功能如前面硬件电路设计局部进行说明。 图 :东西方向数码管显示19,东西方向红灯亮;南北方向显示14, 南北方向绿灯亮 东西方向数码管从19,南北方向从14开始倒计时,东西方向红灯亮,禁止车辆通行,南北方向绿灯亮,车辆通行 图 :东西方向数码管显示4,东西方向红灯亮;南北方向显示4, 南北方向黄灯亮灭 当南北方向计数到5时,东西方向数码管从4,南北方向从4开始倒计时,东西方向红灯亮,禁止车辆通行,南北方向黄灯亮灭变化,处于状态变化等待状态 图 :东西方向数码管显示14,东西方向绿灯亮;南北方向显示19,
10、南北方向红灯亮 东西方向数码管从14,南北方向从19开始倒计时,东西方向绿灯亮,允许车辆通行,南北方向红灯亮,禁止车辆通行图 :东西方向数码管显示4,东西方向黄灯亮灭变化;南北方向显示4, 南北方向红灯亮当南北方向计数到5时,东西方向数码管从4,南北方向从4开始倒计时,东西方向黄灯亮灭变化,处于等待转换的状态,南北方向红灯亮,禁止车辆通信图 :东西方向数码管显示0,东西方向红灯亮;南北方向显示0, 南北方向红灯亮当发生救护车到来等紧急情况发生时,对应仿真时按键INT0来模拟,对应东西南北方向显示红等,使得两方向车禁止通行,处理紧急情况图 :东西方向数码管显示0,东西方向绿灯亮;南北方向显示0, 南北方向红灯亮假设东西方向为主干道,车流量特别多,南北方向为次干道,对应控制东西方向绿灯亮,南北方向红灯亮,从而南北方向车禁止通行,疏通交通,保证正常进行。