找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机交通灯仿真效果 程序带注释

[复制链接]
跳转到指定楼层
楼主
51单片机 交通灯,有仿真效果 程序带注释
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源程序如下:
  1. #include<reg52.h>                                         // 对单片机的口进行了定义
  2. #define uint unsigned int
  3. #define uchar unsigned char

  4. uchar code a[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};        //段码组合,共阴极数码管
  5. uchar code c[4]={0x30,0x28,0x84,0x44};      /*P1 绿红、黄红、红绿、红黄*/
  6.                   
  7. //12MHz                          
  8. //*************************************************************************************
  9. uchar NB=25,DX=30,NBG=25,DXG=15,H=5;                         /*数码管显示值设置*/
  10. uchar  i,k=0,cnt=0,j=0;

  11. sbit K0=P3^0;                              /*主干道通行*/
  12. sbit K1=P3^1;                             /*次干道通行*/
  13. sbit K2=P3^2;                        /*中断设置时间加减*/
  14. sbit K3=P3^3;                    /*紧急情况控制*/
  15. sbit K4=P3^5;                      /*南北时间加*/
  16. sbit K5=P3^6;                  /*东西时间加*/
  17. sbit K6=P3^7;                 /*设置完成,返回*/

  18. void delay(uchar t);                /*定义延时程序*/
  19. void key();                                   /*定义键盘程序*/
  20. void display();                          /*定义显示程序*/
  21. void settime();                     /*定义时间设置显示程序*/


  22. //*************************程序初始*********************************************
  23. void init(void)
  24. {
  25.         TMOD=0x01;                          /*使用定时器0模式1*/
  26.         TH0=0x3c;                          /*(65536-5000)/256*/
  27.         TL0=0xb0;                          /*(65536-5000)%256*/
  28.         IT0=1;                                  //开中断
  29.         ET0=1;
  30.         TR0=1;
  31.         EA=1;
  32.         EX0=1;
  33.         EX1=1;
  34.         P1=c[k];                                  //开启交通灯
  35. }

  36. //*************************外部中断0处理程序***************************************
  37. void int0(void) interrupt 0                    //        通行时间设置
  38. {         
  39.   EA=0;
  40.   P1=0x90;                                /*红灯全亮*/
  41.   
  42.   while(1)
  43.         {
  44.            settime();

  45.          if(K4==0)                                          /*P3^6=0设置主干道通行时间*/
  46.            {  
  47.           delay(40);
  48.         if(K4==0)
  49.                   {
  50.              while(!K4)
  51.              {
  52.                settime();
  53.              }
  54.                          NBG++;                                /*主干道通行时间加1*/
  55.              if(NBG==100)
  56.              NBG=0;                       
  57.           }
  58.            }
  59.           
  60.          if(K5==0)                                 /*P3^5=0设置支干道通行时间*/
  61.            {  
  62.         delay(40);
  63.         if(K5==0)
  64.                      {
  65.              while(!K5)
  66.                {
  67.                 settime();
  68.                }
  69.                            DXG++;                                /*支干道通行时间加1*/
  70.                if(DXG==100)
  71.                DXG=0;               
  72.              }
  73.            }
  74.           
  75.            if(K6==0)                                                           /*P3^7=0返回*/
  76.        {  
  77.              delay(40);       
  78.                  if(K6==0)
  79.                     {
  80.                        while(!K6)
  81.                            {
  82.                            }
  83.                       k=0;P1=c[k];
  84.                            NB=NBG,DX=NBG+H;       
  85.                        display();
  86.                            EA=1;
  87.                            break;
  88.                     }                      
  89.        }
  90.     }
  91. }


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

  98.         while(1)                                                                   /*主支干道显示全为0*/
  99.         {
  100.            P1=0x90,P0=a[0];
  101.            P2=0xfe;
  102.            delay(20);
  103.           
  104.            P2=0xfd;
  105.            delay(20);

  106.            P2=0xfb;
  107.            delay(20);

  108.            P2=0xf7;
  109.            delay(20);
  110.    

  111.    if(K6==0)                                                           /*P3^7=0返回*/
  112.        {  
  113.              delay(40);       
  114.                  if(K6==0)
  115.                     {
  116.                        while(!K6)
  117.                            {
  118.                            }
  119.                
  120.                 EA=1;
  121.                    P1=c[k];                                          /*返回紧急前状态开始计数*/
  122.                 TR0=!TR0;                                         /*重启计数*/
  123.                 break;                                                          
  124.                    }
  125.           }
  126.    }

  127. }


  128. void time1(void) interrupt 1                                                /*交通灯控制程序*/
  129. {
  130.         TH0=0x3c;                                                                                /*定时50ms*/
  131.         TL0=0xb0;                                                                                         
  132.         cnt++;
  133.        
  134.         if(cnt==20)                                                                                  /*每20*50ms=1s自减一*/
  135.         {
  136.                 NB--;
  137.                 DX--;
  138.                 cnt=0;
  139.                 if(NB==0||DX==0)
  140.                 {
  141.                         k++;
  142.                         if(k>3)                                                                        /*k取0,1,2,3*/
  143.                         k=0;
  144.                         switch(k)
  145.                         {       
  146.                                 case 0:NB=NBG,DX=NBG+H;j=0;P1=c[k];break;            /*主干道通行显示绿红*/
  147.                             case 1:NB=H;j=1;P1=c[k];break;                                   /*主干道黄灯闪烁*/
  148.                                 case 2:NB=DXG+H,DX=DXG;j=0;P1=c[k];break;          /*支干道通行显示红绿*/
  149.                                 case 3:DX=H;j=2;P1=c[k];break;                                 /*支干道黄灯闪烁*/
  150.                         }
  151.                 }                 
  152.         }
  153. }


  154. void delay(uchar t)                         //延时程序延时0.1*nms   
  155. {
  156.   uchar i;
  157.   do
  158.    {
  159.      for(i=0;i<20;i++);;;
  160.    }
  161.    while(t--);
  162. }



  163. void settime()
  164. {
  165.            P2=0xfe,P0=a[(NBG+H)/10];        /*显示主干道通行时间         */
  166.        delay(20);
  167.                   
  168.            P2=0xfd,P0=a[(NBG+H)%10];       
  169.            delay(20);
  170.                   
  171.            P2=0xfb,P0=a[(DXG+H)/10];                /*显示支干道通行时间*/
  172.            delay(20);
  173.                   
  174.        P2=0xf7,P0=a[(DXG+H)%10];       
  175.            delay(20);
  176. }


  177. void  key()                                //键盘程序用KO K1模拟一道有车一道无车
  178. {
  179.   if(K0==0)                                           /*主干道有车支干道无车*/
  180.     {  
  181.        delay(40);
  182.        if(K0==0)                         
  183.        {
  184.           while(!K0)
  185.           {  
  186.                  display();
  187.           }
  188.              k=0,P1=c[k];cnt=0;
  189.           NB=NBG, DX=NBG+H;
  190.          display();
  191.        }
  192.     }

  193.            if(K1==0)                                            /*支干道有车主干道无车*/
  194.     {  
  195.        delay(40);
  196.        if(K1==0)
  197.        {
  198.           while(!K1)
  199.           {
  200.            display();
  201.           }
  202.           k=2,P1=c[k];cnt=0;
  203.           NB=DXG+H,DX=DXG;
  204.           display();
  205.            }
  206.         }
  207. }


  208. void display()                                                        //显示程序
  209. {
  210.    P2=0xfe,P0=a[NB/10];                           /*由k的不同值进入确定显示数值*/
  211.    delay(20);
  212.        
  213.    P2=0xfd,P0=a[NB%10];
  214.    delay(20);
  215.                
  216.    P2=0xfb,P0=a[DX/10];
  217.    delay(20);
  218.                
  219.    P2=0xf7,P0=a[DX%10];
  220.    delay(20);
  221. }  


  222. void main(void)
  223. ……………………

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

所有资料51hei提供下载:
交通灯【参考程序】.rar (72.64 KB, 下载次数: 100)


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

使用道具 举报

沙发
ID:979401 发表于 2021-11-12 10:17 | 只看该作者
谁能画出一个流程图吗?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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