交通信号灯调试
这篇博客来调试一下简单的交通灯,根据我以前博客里的keil_proteus文件打开对应位置的电路图
电路图如下图
现在我们开始进行调试
根据要求
我们要根据电路图来思考怎么控制灯,由图可知该电路图的灯由p0.0,p0.1,p0.2,p0.3,p0.4,p0.5这五个引脚控制,并且是共阳极那么可初步编写下面的代码
1 #include <reg52.h> 2 #include "delay.h" 3 sbit W_E_R = P0^0; //东西红灯 4 sbit W_E_Y = P0^1; //东西黄灯 5 sbit W_E_G = P0^2; //东西绿灯 6 sbit N_S_R = P0^3; //南北红灯 7 sbit N_S_Y = P0^4; //南北黄灯 8 sbit N_S_G = P0^5; //南北绿灯 9 unsigned char i; 10 void main() 11 { 12 W_E_R = 0x00; 13 N_S_R = 0X00; //红灯全亮 14 delay1s(); 15 while(1) 16 { 17 N_S_R = 1; 18 W_E_G = 1; 19 W_E_R = 0; 20 N_S_G = 0; //东西红灯亮,南北绿灯亮,10s 21 delay10s(); 22 for(i=0;i<3;i++) 23 { 24 W_E_R = 0; 25 N_S_Y = 0; 26 N_S_G = 1; 27 delay1s(); 28 W_E_R = 1; 29 N_S_Y = 1; 30 delay1s(); //东西红灯闪,南北黄灯闪,3s 31 } 32 W_E_G = 0; 33 W_E_R = 1; 34 N_S_R = 0; 35 delay10s(); //东西绿灯亮 ,南北红灯亮,10s 36 W_E_G = 1; 37 for(i=0;i<3;i++) 38 { 39 W_E_Y = 0 ; 40 N_S_R = 0 ; 41 delay1s(); 42 W_E_Y = 1 ; 43 N_S_R = 1 ; 44 delay1s(); //东西黄灯闪,南北红灯闪,3s 45 } 46 } 47 }
然后打开电路图把生成的.hex文件拷进去
这样就完成了要求。
但是我觉得可以是代码更加精简
于是我试着用预处理命令直接控制P0引脚然后使用十六进制数进行控制
1 #include <reg52.h> 2 #include "delay.h" 3 #define LED P0 4 unsigned char i; 5 void main() 6 { 7 LED = 0X36; //红灯全亮 8 delay1s(); 9 while(1) 10 { 11 LED = 0XDE; 12 delay10s(); //东西红灯亮,南北绿灯亮,10s 13 for(i=0;i<3;i++) 14 { 15 LED = 0XEE; 16 delay1s(); 17 LED = 0XFF; 18 delay1s(); 19 } //东西红灯闪,南北黄灯闪,3s 20 LED = 0XF3; 21 delay10s(); //东西绿灯亮,南北红灯亮,10s 22 for(i=0;i<3;i++) 23 { 24 LED = 0XF5; 25 delay1s(); 26 LED = 0XFF; 27 delay1s(); //东西黄灯闪,南北红灯闪,3s 28 } 29 } 30 }
这样代码就更加精简而且便于移植。
另外关于文章中delay1s();与delay10s();的代码我也放出来吧
1 void delay1s() 2 { 3 unsigned char x = 0; 4 unsigned char i; 5 unsigned char y = 0; 6 while(y < 5) 7 { 8 x = 0; 9 while(x<250) 10 { 11 i = 0; 12 while(i<250) 13 { 14 i++; 15 } 16 x++; 17 } 18 y++; 19 } 20 } 21 22 23 void delay10s() 24 { 25 unsigned char x = 0; 26 unsigned char i; 27 unsigned char y = 0; 28 while(y < 50) 29 { 30 x = 0; 31 while(x<250) 32 { 33 i = 0; 34 while(i<250) 35 { 36 i++; 37 } 38 x++; 39 } 40 y++; 41 } 42 }
void delay1s(); void delay10s();