找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 8125|回复: 15
收起左侧

基于51单片机的智能交通灯仿真设计

  [复制链接]
ID:168523 发表于 2017-10-26 17:44 | 显示全部楼层 |阅读模式
交通灯设计仿真文件:
034235nhlunkgpzhl8lglt.png
0.png

单片机源程序如下:
  1. #include<reg51.h>                                         // 对单片机的口进行了定义
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. uchar code a[10]={0x3f,0x06,0x5b,0x4f,0x66,      
  5.                 0x6d,0x7d,0x07,0x7f,0x6f      /*0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10*/};//段码组合,共阳极
  6. uchar code b[4]={0x01,0x02,0x04,0x08}; //位码组合         
  7. uchar code c[4]={0xcc,0xd4,0x78,0xb8};//P1 绿红、黄红、红绿、红黄                  
  8. uchar NB=25,DX=30,NBG=25,DXG=15,H=5;  //数码管显示值设置
  9. uchar i,k=0,cnt=0,j=0;
  10. sbit K0=P3^4;               //南北路道通行
  11. sbit K1=P3^5;               //东西路道通行
  12. sbit K4=P3^6;               //返回
  13. sbit K3=P3^2;              //设置时间
  14. sbit K2=P3^3;              //紧急刹车

  15. void delay(uchar t);       //定义延时程序
  16. void key();                //定义键盘程序
  17. void display();            //定义显示程序
  18. void settime();            //定义时间设置显示程序
  19. //*************************程序初始*********************************************
  20. void init()
  21. {
  22.         TMOD=0x01;   //使用定时器0模式一
  23.         TH0=(65536-5000)/256;   
  24.         TL0=(65536-5000)%256;  
  25.         IT0=1;      //开中断
  26.         ET0=1;                //定时器T1中断允许
  27.         TR0=1;                //启动定时器0
  28.         EA=1;            //开总中断
  29.         EX0=1;
  30.         EX1=1;
  31.         P1=c[k];    //开启交通灯
  32. }
  33. //*************************中断0处理程序***************************************
  34. void int0(void) interrupt 0    //通行时间设置
  35. {         
  36.     EA=0;           //关中断
  37.     P1=0xd8;       //红灯全亮
  38.     for(;;)
  39.         {
  40.          settime();
  41.          if(K1==0)   //设置东西路通行时间
  42.            {  
  43.             delay(10);          //按键消抖,按键是否按下
  44.             if(K1==0)
  45.               {
  46.                while(!K1)           //按键是否松开
  47.                     {
  48.                                  settime();
  49.                                 }
  50.                DXG++;           //东西路通行时间加1
  51.                if(DXG==99)
  52.                DXG=0;                        
  53.              }
  54.            }
  55.          
  56.          if(K0==0)          //设置南北路通行时间         
  57.            {  
  58.             delay(10);
  59.             if(K0==0)
  60.               {
  61.                while(!K0)
  62.                      {
  63.                                   settime();
  64.                                  }
  65.                NBG++;          //南北路通行时间加1
  66.                if(NBG==99)
  67.                NBG=0;               
  68.              }
  69.            }
  70.          
  71.           if(K4==0)                  //返回
  72.             {  
  73.              delay(10);        
  74.              if(K4==0)
  75.                {
  76.                 while(!K4)
  77.                      {
  78.                                           settime();
  79.                      }
  80.                 k=0;
  81.                                 P1=c[k];
  82.                 NB=NBG,DX=NBG+H;        
  83.                 display();
  84.                 EA=1;         
  85.                 break;
  86.               }                       
  87.            }
  88.          }
  89. }


  90. //***********************************中断1处理程序********************
  91. void int1(void) interrupt 2                                         //紧急情况
  92. {                                                                                          
  93.                                  /*东西南北红灯亮*/
  94.         EA=0;                                                                        
  95.         TR0=!TR0;                    /*停止计数*/

  96.         for(;;)                                                                   /*主支干道显示全为0*/
  97.         {         
  98.            P1=0xd8;
  99.            P0=a[0];
  100.                    P2=b[0];
  101.            delay(10);
  102.            
  103.            P2=b[1];
  104.            delay(10);

  105.            P2=b[2];
  106.            delay(10);

  107.            P2=b[3];
  108.            delay(10);
  109.            if(K4==0)                    /*返回*/
  110.               {
  111.                 delay(10);
  112.                 EA=1;   
  113.                 P1=c[k];                                 /*返回紧急前状态开始计数*/
  114.                 TR0=!TR0;                                                /*重启计数*/
  115.                 break;                                                           
  116.               }
  117.         }
  118. }
  119. void time1(void) interrupt 1          /*交通灯控制程序*/
  120. {
  121.         TH0=(65536-5000)/256;      /*定时50ms*/
  122.         TL0=(65536-5000)%256;                                                                                         
  123.         cnt++;
  124.         if(cnt>=20)                                                /*每20*50ms=1s自减一*/
  125.         {
  126.           NB--;
  127.           DX--;
  128.           cnt=0;
  129.           if(NB==0||DX==0)
  130.             {
  131.               k++;
  132.               if(k>3)                                                                        /*k取0,1,2,3*/
  133.               k=0;
  134.               switch(k)
  135.                   {        
  136.                    case 0:NB=NBG,DX=NBG+H;j=0;P1=c[k];break;          /*主干道通行显示绿红*/
  137.                    case 1:NB=H;j=1;P1=c[k];break;                                           /*主干道黄灯闪烁*/
  138.                    case 2:NB=DXG+H,DX=DXG;j=0;P1=c[k];break;          /*支干道通行显示红绿*/
  139.                    case 3:DX=H;j=2;P1=c[k];break;                                           /*支干道黄灯闪烁*/
  140.                   }
  141.             }                 
  142.         }
  143. }
  144. /***************************延时程序延时1ms *****************************/
  145. /*void delay(uchar t)                           
  146. {
  147.   uchar i,j;
  148.   for(i=0;i<t;i++)  
  149.       for(j=0;j<120;j++);
  150.   
  151. }*/
  152. void delay(uchar t)                         //延时程序延时0.1*nms   
  153. {
  154.   uchar i;
  155.   do
  156.    {
  157.      for(i=0;i<20;i++)
  158.      ;;;
  159.    } while(t--);
  160. }


  161. /*************************时间设定函数**********************/
  162. void settime()
  163. {
  164.   P2=b[0],P0=a[(NBG+H)%10];        /*显示主干道通行时间         */
  165.   delay(10);
  166.                   
  167.   P2=b[1],P0=a[(NBG+H)/10];        
  168.   delay(10);
  169.                   
  170.   P2=b[2],P0=a[(DXG+H)%10];                /*显示支干道通行时间*/
  171.   delay(10);
  172.                   
  173.   P2=b[3],P0=a[(DXG+H)/10];        
  174.   delay(10);
  175. }
  176. /*******************键盘程序用KO K1模拟一道有车一道无车        *****************/
  177. void  key()                              
  178. {
  179. if(K1==0)           //南北通行,东西禁止
  180.    {  
  181.     delay(10);
  182.     if(K1==0)                        
  183.       {
  184.        while(!K1)
  185.            {  
  186.             display();
  187.            }
  188.        k=0,P1=c[k];cnt=0;
  189.        NB=NBG, DX=NBG+H;
  190.        display();
  191.        }
  192.     }
  193.     if(K0==0)         //东西通行,南北禁止
  194.      {  
  195.       delay(10);
  196.       if(K0==0)
  197.          {
  198.           while(!K0)
  199.           {
  200.            display();
  201.           }
  202.           k=2,P1=c[k];cnt=0;
  203.           NB=DXG+H,DX=DXG;
  204.           display();
  205.          }
  206.      }
  207. }
  208. /*******************************数码管显示程序        ***********************/
  209. void display()               
  210.      {
  211.       
  212.           P2=b[0],P0=a[NB%10];  //由k的不同值进入确定显示数值
  213.       delay(10);   
  214.       P2=b[1],P0=a[NB/10];
  215.       delay(10);  
  216.       P2=b[2],P0=a[DX%10];
  217.       delay(10);                                             
  218.       P2=b[3],P0=a[DX/10];
  219.       delay(10);
  220.      }

  221. /************************************主程序函数*********************/
  222. void main(void)
  223. {                //主程序
  224. init();      
  225. for(;;)
  226.     {
  227.      display();
  228.      key();   
  229.      //黄灯闪烁程序
  230.      while(j==1)                             //主干道黄灯闪烁
  231.           {                                                                                                               
  232.            P1=0xdc;                          //给黄灯一高电平黄灯灭                 
  233.            for(i=83;i>0;i--)
  234.                       {display();}                    //执行for循环延时                        
  235.                P1=c[k];                         //再给黄灯一低电平黄灯亮
  236.                for(i=83;i>0;i--)
  237.                              {display();}
  238.                         }
  239.      while(j==2)
  240.          {                                //支干道黄灯闪烁         
  241.           P1=0xf8;
  242.           for(i=83;i>0;i--){display();}
  243.           P1=c[k];
  244.           for(i=83;i>0;i--){display();}
  245.          }                                                                        
  246.      
  247.          
  248.                
  249.      }
  250. }
复制代码

管理提醒:作者发布的源文件由于 多人回帖说有问题 已经被删除,大家可以参考:http://www.51hei.com/bbs/dpj-118303-1.html

回复

使用道具 举报

ID:554654 发表于 2020-3-15 12:36 | 显示全部楼层
仿真与截图不符
回复

使用道具 举报

ID:242454 发表于 2017-10-27 09:58 | 显示全部楼层
这是用的什么仿真软件
回复

使用道具 举报

ID:168523 发表于 2017-10-28 17:40 | 显示全部楼层
不错的设计,支持
回复

使用道具 举报

ID:89286 发表于 2017-10-28 22:49 | 显示全部楼层
thanks for sharing
回复

使用道具 举报

ID:314436 发表于 2018-4-27 21:14 来自手机 | 显示全部楼层
非常感谢
回复

使用道具 举报

ID:405631 发表于 2018-10-5 17:54 | 显示全部楼层
无畏造英雄 发表于 2017-10-27 09:58
这是用的什么仿真软件

protues
回复

使用道具 举报

ID:405918 发表于 2018-10-7 17:15 | 显示全部楼层
挺好的,谢谢分享
回复

使用道具 举报

ID:406373 发表于 2018-10-8 10:17 | 显示全部楼层
挺好的 3q
回复

使用道具 举报

ID:659446 发表于 2019-12-9 11:26 | 显示全部楼层
数码管时间会不会太短了
回复

使用道具 举报

ID:662757 发表于 2019-12-12 20:37 | 显示全部楼层
无畏造英雄 发表于 2017-10-27 09:58
这是用的什么仿真软件

Protues
回复

使用道具 举报

ID:638551 发表于 2019-12-18 17:00 | 显示全部楼层
仿真与截图不符
回复

使用道具 举报

ID:666600 发表于 2019-12-19 21:01 | 显示全部楼层
电路图怎么不正确可以发我一份吗
回复

使用道具 举报

ID:707309 发表于 2020-3-17 21:26 | 显示全部楼层
正在学习,谢谢分享
回复

使用道具 举报

ID:745177 发表于 2020-5-9 16:34 | 显示全部楼层

为什么我打不开
回复

使用道具 举报

ID:247623 发表于 2020-5-23 15:38 | 显示全部楼层
审核的人能不能自己打开测试一下,什么东西啊,仿真图纸不全,另外仿真结果错误,浪费我们黑币啊

评分

参与人数 1黑币 +15 收起 理由
51hei团团 + 15 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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