单片机作业:交通控制系统 遇到一个问题 求解答
时间:10-02
整理:3721RD
点击:
- #include<reg52.h>
- sbit P1_0=P1^0; // 南北左转绿灯
- sbit P1_1=P1^1; // 南北左转红灯
- sbit P1_2=P1^2; // 南北直行绿灯
- sbit P1_3=P1^3; // 南北直行红灯
- sbit P1_4=P1^4; // 南北右转绿灯
- sbit P1_5=P1^5; // 南北右转红灯
- sbit P1_6=P1^6; // 南北行人绿灯
- sbit P1_7=P1^7; // 南北行人红灯
- sbit P2_0=P2^0; // 东西左转绿灯
- sbit P2_1=P2^1; // 东西左转红灯
- sbit P2_2=P2^2; // 东西直行绿灯
- sbit P2_3=P2^3; // 东西直行红灯
- sbit P2_4=P2^4; // 东西右转绿灯
- sbit P2_5=P2^5; // 东西右转红灯
- sbit P2_6=P2^6; // 东西行人绿灯
- sbit P2_7=P2^7; // 东西行人红灯
- sbit P3_4=P3^4;
- sbit P3_5=P3^5;
- sbit P3_0=P3^0;
- sbit P3_1=P3^1;
- unsigned char temp,bai,shi,ge,num;
- unsigned int z;
- char point =20,time =100,i=1;
- //延时程序
- void delay(unsigned int z)
- {
- unsigned int x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
- display()
- {
-
- unsigned char code table[]={
- 0x3f,0x06,0x5b,0x4f,
- 0x66,0x6d,0x7d,0x07,
- 0x7f,0x6f,0x77,0x7c,
- 0x39,0x5e,0x79,0x71};
- while(1)
- {
- shi=temp/10;
- ge=temp%10;
- P3_0=0x00;
- P0=table[shi];
- delay(5);
- P3_1=0x00;
- P0=table[ge];
- delay(5);
-
- }
- }
- //紧急情况中断程序
- void EX0_INT()interrupt 0
- {
- i=~1;
- }
- void main ()
- {
- TMOD |= 0x01; //T0初始化
- TH0=0X3C;
- TL0=0XB0;
- TR0=1;
- EA=1;ET0=1;EX0=1;IT0=1;//开中断
- TMOD |= 0x10; //T1初始化
- temp=60;
- num=0;
- P2=0x00;
- TH1=(65536-45872)/256;
- TL1=(65536-45872)%256;
- ET1=1;
- TR1=1;
- PT1=1;
-
- while (1)
- {
- if(i==1) //判断是否为紧急情况
- { //正常执行程序
- if(time>80)
- {
- P2_2=0X00; //东西绿灯亮
- P1_3=0x00; //南北红灯亮
- P2_6=0x00; //东西行人绿灯开
- P1_1=0X00; //南北左转红灯亮
- P1_5=0X00; // 南北右转红灯亮
- P2_1=0X00; //东西左转红灯亮
- P2_5=0X00; // 东西右转红灯亮
- P1_7=0X00; //南北行人红灯亮
- }
- else if (time>90) //10s后 南北允许左转
- {
- P1_0=0x00; //南北左转绿灯亮
- P1_1=0xff; //南北左转红色灭
-
- }
- else if (time>80) //10s后 南北允许右转
- { P1_1=0x00; //南北左转红灯亮
- P1_0=0xff; //南北左转绿灯灭
- P1_4=0x00; //南北右转绿灯亮
- P1_5=0xff; //南北右转红灯灭
- }
- else if(time>78) //2s
- {
- P2_2=~P2_2; //东西绿灯闪烁3s
- }
- else if (time>77) //1s后
- { P1_4=0xff; //南北右转绿灯灭
- P1_5=0x00; //南北左转红灯亮
-
-
- P1_3=0xff; //南北直行红灯灭
- P1_2=0x00; //南北直行绿灯亮
- P1_6 =0x00; //南北行人绿灯亮
- P1_7=0xff; //南北行人红灯灭
- P2_2=0Xff; //东西直行绿灯灭
- P2_3=0x00; //东西直行红灯亮
-
- }
- else if(time >67) //10s后允许东西左转
- {
- P2_0=0x00; //东西左转绿灯亮
- P2_1=0xff; //东西左转红灯灭
- }
- else if (time>57) //10s后允许东西右转
- {
- P2_0=0xff; //东西左转绿灯灭
- P2_1=0x00; //东西左转红灯亮
- P2_4=0x00; //东西右转绿灯亮
- P2_5=0xff; //东西右转红灯灭
- }
- else if (time>47) // 10s后
- {
- P1_2=~P1_2; //南北直行绿灯闪烁
-
- }
- else if (time>37)
- {
- P1_2=0xff; //南北直行绿灯灭
- P1_3=0x00; //南北直行红灯亮
- P1_6 =0xff; //南北行人绿灯灭
- P1_7=0x00; //南北行人红灯亮
-
- }
-
- }
- else
- {
-
- }
- display();
- }
- else //紧急情况执行程序 完善中
- {
-
- }
-
- }
-
- void t0int() interrupt 1 //T0中断子程序
- {
- if(i==1)
- {
- TH0=0X3C;
- TL0=0XB0;
- point--; //50MS 20次 共1s
- if (point==0)
- {
- point=15;
- if(time==0)
- time=100;
- else
- time--;
-
- }
-
- }
- else;
- }
- void T1_time()interrupt 1
- { if(i==1)
- {
- TH1=(65536-45872)/256;
- TL1=(65536-45872)%256;
- num++;
- if(num==40)
- {
- num=0;
- temp--;
- if(temp==0)
- {
- temp=60;
- }
- }
- }
- }
附电路图
仿真结果显示
我感觉显示部分的代码没问题啊 为什么运行结果老是不对 我想要60s倒计时
代码有些繁杂 还没来得及优化 将就看吧0.0
有些部分 还没有完善 目前 交通灯显示部分 计时部分 是完好的
刚才仿真 led也不正常了 把显示电路的代码去掉就正常了 是不是T0 T1优先级的问题呢
有偿代做 1002925094