找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3239|回复: 3
收起左侧

超级交通灯proteus仿真,立体实物,行人道上的红绿灯第二轮,发代码,大家点评

[复制链接]
ID:112410 发表于 2017-12-13 22:26 | 显示全部楼层 |阅读模式
超级交通灯proteus仿真,立体实物,行人道上的红绿灯第二轮,发代码,大家点评
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
0.jpg 0.png

单片机源程序如下:
  1. #include<reg51.h>
  2. sbit P3_5=P3^5;
  3. sbit shi=P3^6; //十位
  4. sbit ge=P3^7; //个位
  5. sbit fm=P3^4;
  6. sbit hw1=P3^3;
  7. sbit LED1=P1^0;        //南红北绿
  8. sbit LED2=P1^1;        //南北黄
  9. sbit LED3=P1^2;        //南绿北红
  10. sbit LED4=P1^3;        //东红西绿
  11. sbit LED5=P1^4;        //东西黄
  12. sbit LED6=P1^5;        //东绿西红
  13. sbit k2=P1^6;
  14. sbit sw=P1^7;
  15. sbit led1=P3^1; //电机启动为0
  16. sbit led2=P3^2;
  17. sbit k1=P3^0;
  18. sbit P2_0=P2^0;
  19. sbit P2_1=P2^1;
  20. sbit P2_2=P2^2;
  21. sbit P2_3=P2^3;
  22. sbit P2_4=P2^4;
  23. sbit P2_5=P2^5;
  24. sbit P2_6=P2^6;
  25. sbit P2_7=P2^7;
  26. sbit P0_0=P0^0;
  27. sbit P0_1=P0^1;
  28. sbit P0_2=P0^2;
  29. sbit P0_3=P0^3;
  30. sbit P0_4=P0^4;
  31. sbit P0_5=P0^5;
  32. sbit P0_6=P0^6;
  33. sbit P0_7=P0^7;

  34. unsigned char count=0;        //计数50ms
  35. unsigned char miaoa;        //东西方向
  36. unsigned char miaob;        //南北方向
  37. unsigned char DY=1;                //标志第一个方式
  38. unsigned char DX=1;
  39. unsigned char DZ=0;
  40. unsigned char DB=0;
  41. unsigned int c=0;
  42. unsigned int b=0;
  43. unsigned char miao;  //加减时间       
  44. void disp1();
  45. void disp2();
  46. void delay(unsigned int t)         //延时函数
  47. {
  48.         unsigned int a;
  49.         for(a=0;a<t;a++);
  50. }
  51.                  
  52. void timer_1() interrupt 3           //定时器T1的中断函数,工作方式1下50ms产生中断,执行该中断函数
  53. {
  54.         TH1=(65536-50000)/256;         //重新设置T1计数初值高8位
  55.         TL1=(65536-50000)%256;         //重新设置T1计数初值低8位                                      
  56.         count++;                                         //50ms计数器加1
  57. }                                                        
  58. //void hongwai1()
  59. //{
  60. //        bit flag;
  61. //        flag=0;  //灯灭
  62. //
  63. //        if(hw1==1&&flag==0)
  64. //                {
  65. //                        fm=0;                                                                                                                  
  66. //                        delay(50000);
  67. //                        flag=1;
  68. //                }
  69. //                else if(hw1==0&&flag==1)
  70. //                {
  71. //                        fm=1;
  72. //                        delay(50000);
  73. //                        flag=0;
  74. //                }
  75. //}       

  76. void shumaguan()
  77. {
  78.         if(DX==1)                                                   //方式1
  79. {
  80.         if(DY==1)
  81. {
  82. //                    hongwai1();
  83.            P0_0=1;
  84.            P0_1=0;
  85.            P0_2=0;
  86.            P0_3=1;
  87.            switch(c)                                                                           //切换闲忙时间范围
  88. {   
  89.    case 0:miaoa=15+miao;miaob=12+miao;break;                //忙
  90.    case 1:miaoa=25+miao;miaob=22+miao;break;                //不忙
  91.    case 2:miaoa=35+miao;miaob=32+miao;break;                 //闲
  92.    default:break;
  93. }
  94. DY=0;
  95. }
  96. if(count==20)
  97. {
  98.         miaoa--;
  99.         miaob--;
  100.         count=0;                                //50ms计数清零
  101. }
  102.         if(miaoa<10&&miaob<7)
  103.         {
  104.                 disp1();
  105.         }
  106.         if(DZ==0)
  107.         {
  108.         LED6=1;                                   //灭东绿西红,亮东西黄灯
  109.         LED3=1;
  110.         LED1=0;                                           //南红北绿,东红西绿
  111.         LED4=0;
  112.         LED2=1;
  113.         LED5=1;       
  114.        
  115.        

  116.         if(miaoa==3&&miaob==0)
  117. {
  118.         miaob=3;                                //东西方向减为0
  119.         LED1=1;                                           //灭南红北绿,南北亮黄
  120.         LED4=1;
  121.     DZ=1;
  122. }
  123. }
  124. if(DZ==1)
  125. {
  126.         LED1=1;                                           //灭南红北绿,南北亮黄
  127.         LED4=1;
  128. if(count<10)
  129. {

  130. LED2=0;                                                   // 南北红灯亮,东西黄灯灭
  131. LED5=0;
  132. }
  133. else  {

  134.         LED2=1;
  135.         LED5=1        ;
  136. }}               
  137.         if(miaoa==-1&&miaob==-1)                           //东西南北都减为0
  138. {
  139.          DX=0;
  140.         DZ=0;       

  141.                                                   //DY置0,准备方式2
  142. }

  143. }
  144.         else if(DX==0)
  145. {                                                //方式2启动
  146.         if(DY==0)
  147. {
  148. //                 hongwai1();
  149.         P0_0=0;
  150.            P0_1=1;
  151.            P0_2=1;
  152.            P0_3=0;
  153.                    switch(c)                                                                           //切换闲忙时间范围
  154. {   
  155.    case 0:miaoa=12+miao;miaob=15+miao;break;                //忙
  156.    case 1:miaoa=22+miao;miaob=25+miao;break;                //不忙
  157.    case 2:miaoa=32+miao;miaob=35+miao;break;                 //闲
  158.    default:break;
  159. }
  160. DY=1;
  161. }

  162.         if(count==20)
  163. {
  164.         miaoa--;
  165.         miaob--;
  166.         count=0;
  167. }
  168. if(miaob<10&&miaoa<7)
  169.         {
  170.          disp2() ;
  171.                            }
  172. if(DB==0)
  173. {
  174.         LED1=1;                                           //灭南红北绿,南北亮黄
  175.         LED4=1;
  176.         LED3=0;                                                 //南绿北红,东绿西红
  177.         LED6=0;
  178.         LED2=1;
  179. LED5=1        ;
  180.        
  181. if(miaob==3&&miaoa==0)
  182. {
  183.         miaoa=3;
  184.         LED6=1;       
  185.         LED3=1;                           //灭东绿西红,亮东西黄灯
  186.          DB=1  ;
  187. }
  188. }
  189. if(DB==1)
  190. {
  191.         LED6=1;                                   //灭东绿西红,亮东西黄灯
  192.         LED3=1;
  193. if(count<10)
  194. {
  195. LED2=0;                                                   // 南北红灯亮,东西黄灯灭
  196. LED5=0;
  197. }
  198. else  {LED2=1;
  199. LED5=1        ;
  200. }}               
  201.         if(miaob==-1&&miaoa==-1)
  202. {

  203.         DX=1;
  204.         DB=0;                                          //转为方式1
  205. }
  206. }
  207. }       
  208. void disp()           //显示函数
  209. {
  210.         unsigned char led1[]={0,1,0,1,0,1,0,1,0,1};
  211.         unsigned char led2[]={0,0,1,1,0,0,1,1,0,0};
  212.         unsigned char led3[]={0,0,0,0,1,1,1,1,0,0};
  213.         unsigned char led4[]={0,0,0,0,0,0,0,0,1,1};
  214.         P2_7=led4[miaoa/10%10];           //显示十位        西东
  215.         P2_6=led3[miaoa/10%10];       
  216.         P2_5=led2[miaoa/10%10];       
  217.         P2_4=led1[miaoa/10%10];       
  218.         P2_3=led4[miaob/10%10];                          //南北
  219.         P2_2=led3[miaob/10%10];       
  220.         P2_1=led2[miaob/10%10];       
  221.         P2_0=led1[miaob/10%10];       
  222.         shi=0;
  223.         delay(5);
  224.         shi=1;
  225.    P2_7=led4[miaoa%10];           //显示十位        西东
  226.         P2_6=led3[miaoa%10];       
  227.         P2_5=led2[miaoa%10];       
  228.         P2_4=led1[miaoa%10];       
  229.         P2_3=led4[miaob%10];                          //南北
  230.         P2_2=led3[miaob%10];       
  231.         P2_1=led2[miaob%10];       
  232.         P2_0=led1[miaob%10];
  233.         ge=0;
  234.         delay(5);
  235.         ge=1;                                                                 
  236. }
  237. void disp1()
  238. {
  239.         unsigned char led1[]={0,1,0,1,0,1,0,1,0,1};
  240.         unsigned char led2[]={0,0,1,1,0,0,1,1,0,0};
  241.         unsigned char led3[]={0,0,0,0,1,1,1,1,0,0};
  242.         unsigned char led4[]={0,0,0,0,0,0,0,0,1,1};
  243.         P0_7=led4[miaoa];           //显示十位        西东
  244.         P0_6=led3[miaoa];       
  245.         P0_5=led2[miaoa];       
  246.         P0_4=led1[miaoa];
  247.         P3_5=0;
  248.         delay(5);
  249.         P3_5=1;
  250.                
  251.        
  252. }
  253. void disp2()
  254. {
  255.                  unsigned char led1[]={0,1,0,1,0,1,0,1,0,1};
  256.         unsigned char led2[]={0,0,1,1,0,0,1,1,0,0};
  257.         unsigned char led3[]={0,0,0,0,1,1,1,1,0,0};
  258.         unsigned char led4[]={0,0,0,0,0,0,0,0,1,1};
  259.                 P0_7=led4[miaob];                          //南北
  260.         P0_6=led3[miaob];       
  261.         P0_5=led2[miaob];       
  262.         P0_4=led1[miaob];
  263.         P3_5=0;
  264.         delay(5);
  265.         P3_5=1;

  266. }

  267. void main()
  268. {
  269.         TMOD=0x10;
  270.         TH1=(65536-50000)/256;  //设置T1计数初值高八位
  271.         TL0=(65536-50000)%256;  //设置T1计数初值低八位                  
  272.                  EA=1;
  273.          while(1)
  274.          {
  275.          while(!sw)
  276. {
  277. ……………………

  278. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
超级交通灯(proteus仿真).rar (224.99 KB, 下载次数: 34)

评分

参与人数 2黑币 +10 收起 理由
578293667 + 5
renqian4436 + 5 绝世好帖!

查看全部评分

回复

使用道具 举报

ID:255579 发表于 2017-12-14 08:48 | 显示全部楼层
不错不错
回复

使用道具 举报

ID:311092 发表于 2018-4-18 18:16 | 显示全部楼层
很棒很棒
回复

使用道具 举报

ID:256906 发表于 2018-5-24 16:47 | 显示全部楼层
大佬,发个说明书吧,没有看懂按键和左上角的led显示啥意思
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表