XX学院课程设计
---------------------*/ uchar rd_emstate(void) {
uchar value; value=P3; value>>=4; value&=0x07;
if(value!=statebef){statebef=value;return 1;}//判断是否有紧急灯状况
发生,保存按键值,置返回标志为1
else return 0; }
/*------------------------
显示函数
----------------------*/ void display(void) {
if(md_flag==1)//显示更改时间状态 {
if(1==red) {// 南北方向红灯时间显示
P2=0xf6; P0=led_table[light_time[0][0]];delay();//分
钟
P2=0xed;
P0=led_table[light_time[0][1]/10];delay();//秒的十位 P2=0xdb;
P0=led_table[light_time[0][1]];delay();//秒的个位 }
else {//南北绿灯东西红灯亮时间显示
P2=0xf6;P0=led_table[light_time[2][0]]; delay();//分钟
P2=0xed;P0=led_table[light_time[2][1]/10]; delay();//秒的十位
15
XX学院课程设计
P2=0xdb;P0=led_table[light_time[2][1]]; delay();//秒的个位 } } else //正常状态,显示时间 {
P2=0xf6; P0=led_table[time/100]; delay();//分钟 P2=0xed; P0=led_table[time/10];delay();// 秒
的十位
P2=0xdb; P0=led_table[time]; delay();//秒的个
位
} }
/*---------------------------
主函数
--------------------*/ void main() {
//初始化定时器0,外部中断1 EA=1; EX1=1; IT1=1; ET0=1; TMOD=0x01; TH0=-10000/256; TL0=-10000%6; TR0=1; while(1){
if(rd_emstate())//如果有紧急灯按下,进行如下紧急处理 {
16
XX学院课程设计
switch(statebef) {
case 0x04:P1=em_state[0];TR0=0;break;//紧急灯亮 case 0x02:P1=em_state[1];TR0=0;break;//东西应急灯亮 case 0x01:P1=em_state[2];TR0=0;break;//南北应急灯亮 case 0x00:TR0=1;break; default: break;
} }
if(state_flag)//正常状态下时间切换,如果状态标志为1,进行如下处理,进
行状态间切换
{
switch(state) { case
0:time=light_time[0][0]*60+light_time[0][1]; P1=light_state[0];break;//南北红灯亮时间 case
1:time=light_time[1][0]*60+light_time[1][1]; P1=light_state[1];break;//黄灯亮时间 case
2:time=light_time[2][0]*60+light_time[2][1]; P1=light_state[2];break;//南北绿灯亮时间 case
3:time=light_time[1][0]*60+light_time[1][1]; P1=light_state[1];break;//黄灯亮时间 default: break;
}
17
XX学院课程设计
state_flag=0;//清标志位 }
if(nom==0) { md_flag=0;}//恢复时间状态,更改为最近更改的值 display(); } }
/*-----------------
定时器0
--------------------*/
void Time0int(void) interrupt 1 { EA=0;
TH0=-10000/256; TL0=-10000%6; time1s--;
if(time1s==0){//一秒中到,重新置数
time1s=100; time--;//显示时间自减
if(time==0){//显示时间减到0时切换显示时间状态
state++;//四个状态轮流切换 if(state==4) state=0; state_flag=1;//置状态切换标志位 }
} EA=1; }
/*---------------------
外部中断1
----------------------*/
void Exint1(void) interrupt 2
18
XX学院课程设计
{
EA=0;
md_flag=1;//置更改时间标志位 if(red) {
switch(P3&0X07) {
case 6: light_time[0][1]++;
if(light_time[0][1]==60) light_time[0][1]=0;break;//南北方向绿灯时
间 秒加 小于60s
case 5: light_time[0][0]++;
if(light_time[0][0]==10) light_time[0][0]=0;break;//分加 小于10m case 3: red=0;break;//红绿灯切换 } } else
switch(P3&0X07) {
case 6: light_time[2][1]++;
if(light_time[2][1]==60) light_time[2][1]=0;break;
//南北方向红灯时间 秒加 小于60
case 5: light_time[2][0]++;
if(light_time[2][0]==10) light_time[2][0]=0;break;//分加 小于10 case 3: red=1;break;//红绿灯切换 } EA=1; }
19