找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机c51交通灯

[复制链接]
跳转到指定楼层
楼主
很简单的一个单片机程序
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载):


单片机源程序如下:
  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. }

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

  173. }

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

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

所有资料51hei提供下载:
交通灯.rar (87.73 KB, 下载次数: 37)


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

使用道具 举报

沙发
ID:667157 发表于 2019-12-19 14:05 | 只看该作者
这个有图吗
回复

使用道具 举报

板凳
ID:667157 发表于 2019-12-19 14:24 | 只看该作者
请问有图吗
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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