白木时羽

导航

交通信号灯调试

这篇博客来调试一下简单的交通灯,根据我以前博客里的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();

 

posted on 2019-10-12 14:50  白木时羽  阅读(794)  评论(1编辑  收藏  举报