找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 8542|回复: 1
打印 上一主题 下一主题
收起左侧

交通灯模拟控制系统设计(源码、原理图、仿真)

[复制链接]
跳转到指定楼层
楼主

1.用单片机扩展一片8255,用4个交通灯模拟一个十字交叉路口的红、绿、黄灯,并设置二个单方向行按键,和一个紧急按键;

2.正常行驶时,东西或南北方向的灯按绿灯亮27秒,黄灯闪烁3秒,红灯亮30秒控制;

3.当两个单方向通行按键某一个按下时,则南北(东西)方向一直是绿灯,东西(南北)方向一直是红灯;或者紧急按键按下时,两方向均为红灯禁止通行,而只要有按键按下时8个数码管均显示8,且停止计时,按键松开后恢复到之前的状态。
         本设计选用的51单片机内部晶振为12MHz,12分频所得时钟周期为1μs,选用定时器0,选用方式1,T0定时最长时间约为65ms,选用T0产生50ms的定时,再通过计时20次产生1S标志。设定时初值为X,则有(65536-X)*1μs=50ms,得X=3CB0H, 即 TH0=3CH, TL0=B0H

源程序:
  1. #include<reg51.h>
  2. #include<absacc.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. #define PA XBYTE[0x0000]        //8255 A口地址
  6. #define PB XBYTE[0x0001]        //8255 B口地址
  7. #define PC XBYTE[0x0002]        //8255 C口地址
  8. #define PS XBYTE[0x0003]        //8255 控制口地址
  9. sbit button1=P3^3;                           //K0  接外部中断1,紧急车辆通过指示开关                     
  10. sbit button2=P1^0;                            //K1 支道状态开关
  11. sbit button3=P1^1;                            //K2 主道状态开关
  12. sbit button4=P3^2;              //K3  接外部中断0,调整红绿时长
  13. sbit button5=P0^4;
  14. sbit wei1=P1^4;
  15. sbit wei2=P1^5;
  16. sbit wei3=P1^6;
  17. sbit wei4=P1^7;
  18. sbit wei5=P1^2;
  19. sbit wei6=P1^3;
  20. sbit wei7=P3^0;
  21. sbit wei8=P3^1;
  22. uint num0=0,num1=0;
  23. uint k;
  24. uchar dp1,dp2,dp3,dp4;
  25. uchar code table[]=      //共阴七段码
  26. {
  27. 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f
  28. };                     

  29. void time0_int()                               //计时器初始化
  30. {
  31.          TMOD=0x11;                       //设置定时器0位方式1
  32.          TH0=0x3C;                         //定时50毫秒,初值为15536=3CB0
  33.          TL0=0xB0;                           
  34.          EA=1;                             //开全局中断
  35.          EX1=1;                            //开外部中断1
  36.          EX0=1;
  37.          IT0=0;
  38.          IT1=0;                            //中断1为低电平触发
  39.          ET0=1;                             //开计时器0中断
  40. TR0=1;                           //启动计时器0
  41.          
  42. }

  43. void delay(unsigned int z)                      //延时程序
  44. {
  45. uint x,y;
  46. for(x=z;x>0;x--)
  47. for(y=110;y>0;y--);
  48. }

  49. void ini()                  //两路灯初始状态
  50. {
  51.                    P3=0xff;
  52.                    P1=0xff;
  53.                    P2=0xff;
  54.            PA=0x21;
  55.                    PB=0x0C;
  56.          }
  57.          
  58. void display0(uchar unit,uchar decade) //南北方向倒计时显示
  59. {
  60. wei1=0;           //显示低位
  61. P2=table[unit];
  62. delay(2);
  63. wei1=1;
  64. wei2=0;  //高位显示
  65. P2=table[decade];
  66. delay(2);
  67. wei2=1;
  68. wei5=0;
  69. P2=table[unit];
  70. delay(2);
  71. wei5=1;
  72. wei6=0;
  73. P2=table[decade];
  74. delay(2);
  75. wei6=1;
  76. }

  77. void display1(uchar unit,uchar decade)  //东西方向倒计时
  78. {
  79. wei3=0;              //显示低位
  80. P2=table[unit];
  81. delay(10);
  82. wei3=1;
  83. wei4=0;             //显示高位
  84. P2=table[decade];
  85. delay(10);
  86. wei4=1;
  87. wei7=0;              
  88. P2=table[unit];
  89. delay(10);
  90. wei7=1;
  91. wei8=0;            
  92. P2=table[decade];
  93. delay(10);
  94. wei8=1;
  95. }

  96. void main()
  97. {  
  98.          PS=0x80;       //8255控制字写入,A B C口均为输出,均为方式0
  99.          time0_int();
  100.                    ini();
  101. while(1)
  102.   {            
  103.          while((button1!=0)&&(button2!=0)&&(button3!=0))
  104.                    {
  105.                    if((button1!=0)&&(button2!=0)&&(button3!=0))    //南北方向
  106.                    {
  107.                    if(num0>0&&num0<540)
  108.                    {
  109.                    PA=0x0C;               //绿灯亮27秒
  110.                    dp1=(27-(num0-0)/20)%10;
  111.                    dp2=(27-(num0-0)/20)/10;
  112.                    display0(dp1,dp2);       //倒计时显示
  113.     }
  114.                     
  115.                     if(num0>=540&&num0<600)    //黄灯连续闪烁3秒
  116.                     {
  117.                 PA=0x12;
  118.                    delay(200);
  119.                    PA=0x00;
  120.                    dp1=(3-(num0-540)/20)%10;
  121.                    dp2=(3-(num0-540)/20)/10;
  122.                    display0(dp1,dp2);           //倒计时显示
  123.                    }
  124.                   
  125.                    if(num0>=600&&num0<1200)    //红灯亮30秒
  126.                    {
  127.                  PA=0x21;
  128.                    dp1=(30-(num0-600)/20)%10;
  129.                    dp2=(30-(num0-600)/20)/10;
  130.                    display0(dp1,dp2);            //倒计时显示
  131.                    }
  132.                    if(num0>=1200)num0=0;
  133.                    }
  134.                   
  135.                    if((button1!=0)&&(button2!=0)&&(button3!=0))   //东西方向
  136.                    {                           
  137.      if(num1>0&&num1<600)           //红灯亮30秒
  138.     {                        
  139.                    PB=0x0C;                           

  140.                    dp3=(30-num1/20)%10;
  141.                    dp4=(30-num1/20)/10;
  142.                    display1(dp3,dp4);             //倒计时显示
  143.     }

  144.      if(num1>=600&&num1<1140)     //绿灯亮27秒
  145.                             {
  146.          PB=0x21;
  147.      dp3=(27-(num1-600)/20)%10;
  148.                    dp4=(27-(num1-600)/20)/10;
  149.                    display1(dp3,dp4);             //倒计时显示
  150.     }
  151.                     
  152.                     if(num1>=1140&&num1<1200)      //黄灯连续闪3秒
  153.                     {
  154.                 PB=0x12;
  155.                    delay(200);
  156.                    PB=0x00;
  157.                    dp3=3-(num1-1140)/20;
  158.                    dp4=0;
  159.                    display1(dp3,dp4);              //倒计时显示
  160.                    }
  161.                    if(num1>1200)num1=0;
  162.                    }
  163.                    }
  164.          }        
  165. }

  166. void time0() interrupt 1                     //定时中断响应
  167. {
  168.          TH0=0x3C;                                        //定时1ms初值
  169.          TL0=0xB0;
  170.          num0++;
  171.          num1++;
  172. }

  173. void thing1() interrupt 0    //某一方向放行
  174. {
  175.                    display0(0,0);
  176.                    display1(0,0);
  177.          while((button1!=0)&&(button2!=0)&&(button3==0))               //南北禁行,东西放行
  178.                    {
  179.                    PA=0x21;
  180.                    PB=0x21;
  181.                    dp1=8;
  182.                    dp2=8;
  183.                    display0(8,8);
  184.                    display1(8,8);
  185.                    }
  186.                   
  187.                    while((button1!=0)&&(button2==0)&&(button3!=0))               //南北放行,东西禁行
  188.                    {
  189.                    PA=0x0C;
  190.                    PB=0x0C;
  191.                    dp1=8;
  192.                    dp2=8;
  193.                    display0(8,8);
  194.                    display1(8,8);
  195.                    }
  196. }

  197. void thing2() interrupt 2      //外部中断器1响应_紧急情况_两道禁止通行
  198. {
  199.            PA=0x21;
  200.                    PB=0x0C;
  201.          
  202.                    display0(8,8);
  203.                    display1(8,8);
  204. }
复制代码


交通灯模拟控制系统.rar

21.85 KB, 下载次数: 71, 下载积分: 黑币 -5

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:425693 发表于 2018-11-13 16:18 | 只看该作者
仿真载入不了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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