找回密码
 立即注册

QQ登录

只需一步,快速开始

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

交通灯仿真 AD画的原理图与PCB 源代码 实现时间按键可以加,可以减

[复制链接]
跳转到指定楼层
楼主
这个51单片机做的交通灯可以实现时间按键可以加,可以减,实现南北通行,东西通行。



交通灯仿真:

单片机交通灯的原理图(用ad画的)


pcb图:



单片机源程序:
  1. #include <reg52.h>
  2. #define uchar   unsigned char
  3. #define uint    unsigned int
  4. /*****定义控制位**********************/
  5. sbit    EW_LED2=P2^3;           //EW_LED2控制位
  6. sbit    EW_LED1=P2^2;           //EW_LED1控制位
  7. sbit    SN_LED2=P2^1;           //SN_LED2控制位
  8. sbit    SN_LED1=P2^0;           //SN_LED1控制位
  9. sbit    SN_G=P1^2;                            //SN绿灯
  10. sbit    EW_G=P1^5;                                //EW绿灯
  11. sbit    SN_Yellow=P1^1;         //SN黄灯
  12. sbit    EW_Yellow=P1^4;         //EW黄灯
  13. sbit    EW_Red=P1^3;            //EW红灯
  14. sbit    SN_Red=P1^0;            //SN红灯
  15. sbit    s=P2^4;                 //功能选择键
  16. sbit    key1=P2^5;              //按键加及东西强制通行
  17. sbit    key2=P2^6;              //按键减及南北强制通行
  18. sbit    fm=P3^7;                //蜂鸣器
  19. sbit    dula=P2^7;
  20. sbit    P3_2=P3^2;
  21. bit     FLAG_SN_Y,FLAG_SN_G,f_sn;  //SN黄灯标志位,绿灯标志位,sn运行标志位
  22. bit     FLAG_EW_Y,FLAG_EW_G,f_ew;  //EW黄灯标志位,绿灯标志位,ew运行标志位
  23. bit     F_DISP=0,flag=0,flag_key=0;
  24. char    Time_EW;                //东西方向倒计时单元
  25. char    Time_SN;                //南北方向倒计时单元
  26. uchar EW=24,SN=20,EW1=30,SN1=34; //程序初始化赋值正常模式
  27. uchar a=0,i,c=0;
  28. uchar code table[]= {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; //1~~~~9段选码
  29. uchar code LIGHT[]= {0x0c,//SN通行
  30.         0x0a,//SN黄灯
  31.     0x21,//EW通行
  32.         0x11,//EW黄灯
  33.         0x09//全红
  34.         }; //交通信号灯控制代码
  35. /**************** 延时子程序*********************/
  36. void delay1(uchar k)
  37. {
  38.    uchar i,j;
  39.    for(i=100;i>0;i--)
  40.      for(j=k;j>0;j--);
  41. }  
  42. void Delay(uchar  a)
  43. {
  44.     uchar   i;
  45.     i=a;
  46.     while(i--)
  47.     {
  48.         ;
  49.     }
  50. }
  51. /***************EW方向SN方向主干道数码管显示驱动 ****************/
  52. void DISP_SN(char g)
  53. {
  54.     char h,l;
  55.     h=g/10;  //SN方向计时的十位数
  56.     l=g%10;  //SN方向计时的个位数
  57.         dula=1;
  58.     P0=table[l];   //显示SN计时时间的低位
  59.         dula=0;
  60.     SN_LED2=0;
  61.     Delay(2);
  62.     SN_LED2=1;
  63.         P0=0;
  64.         dula=1;
  65.     P0=table[h];   //显示SN计时时间的高位
  66.         dula=0;
  67.     SN_LED1=0;
  68.     Delay(2);
  69.     SN_LED1=1;
  70.         P0=0;
  71. }
  72. void DISP_EW(char b)
  73. {
  74.   char h,l;
  75.     h=b/10;  //EW方向计时的十位数
  76.     l=b%10;  //EW方向计时的个位数
  77.         dula=1;
  78.     P0=table[l];   //显示EW计时时间的低位
  79.         dula=0;
  80.     EW_LED2=0;
  81.     Delay(2);
  82.         P0=0;
  83.     EW_LED2=1;
  84.         dula=1;
  85.     P0=table[h];   //显示EW计时时间的高位
  86.         dula=0;
  87.     EW_LED1=0;
  88.     Delay(2);
  89.     EW_LED1=1;
  90.         P0=0;
  91. }
  92. /**************开机自检***********/
  93. void check(void)
  94. {
  95.   Time_EW=5;
  96.   Time_SN=5;
  97.   f_sn=1;
  98.   f_ew=1;
  99.   while(Time_SN>=0&&Time_EW>=0)
  100.   {
  101.     P1=LIGHT[4];
  102.     DISP_SN(Time_SN);
  103.     DISP_EW(Time_EW);
  104.   }
  105. }
  106. /**************无显示**************/
  107. void dispnon(void)
  108. {
  109.         dula=1;
  110.     P0=0;   //显示SN计时时间的低位
  111.         dula=0;
  112.     SN_LED2=0;
  113.     Delay(2);
  114.         P0=0;
  115.     SN_LED2=1;
  116.         dula=1;
  117.     P0=0;   //显示SN计时时间的高位
  118.         dula=0;
  119.     SN_LED1=0;
  120.     Delay(2);
  121.         P0=0;
  122.     SN_LED1=1;

  123.         dula=1;
  124.     P0=0;   //显示EW计时时间的低位
  125.         dula=0;
  126.     EW_LED2=0;
  127.     Delay(2);
  128.         P0=0;
  129.     EW_LED2=1;
  130.         dula=1;
  131.     P0=0;   //显示EW计时时间的高位
  132.         dula=0;
  133.     EW_LED1=0;
  134.     Delay(2);
  135.     EW_LED1=1;
  136.         P0=0;
  137. }
  138. /***************按键检测*************/
  139. void keyscan(void)
  140. {
  141.           if(s==0)
  142.           {
  143.               delay1(5);
  144.                          if(s==0)
  145.                          {
  146.                                  if(flag_key==0)
  147.                                  {         
  148.                                                  a++;
  149.                                                 flag=1;
  150.                                                 TR0=0;
  151.                                                 P1=LIGHT[4];
  152.                                            if(a==4)
  153.                                            {
  154.                                                         a=0;
  155.                                                         flag=0;
  156.                                                          if(f_sn==1&&f_ew==1)
  157.                                                          P1=LIGHT[4];
  158.                                                          if(f_sn==1&&f_ew==0)
  159.                                                          P1=LIGHT[0];
  160.                                                          if(FLAG_SN_Y==1)
  161.                                                          P1=LIGHT[1];
  162.                                                          if(f_ew==1&&f_sn==0)
  163.                                                          P1=LIGHT[2];
  164.                                                          if(FLAG_EW_Y==1)
  165.                                                          P1=LIGHT[3];
  166.                                                         TR0=1;
  167.                                            }
  168.                               }
  169.                                  else if(flag_key==1)
  170.                                     {
  171.                                                 flag_key=0;
  172.                         flag=0;
  173.                                                 if(f_sn==1&&f_ew==1)
  174.                                                  P1=LIGHT[4];
  175.                                                  if(f_sn==1&&f_ew==0)
  176.                                                  P1=LIGHT[0];
  177.                                                  if(FLAG_SN_Y==1)
  178.                                                  P1=LIGHT[1];
  179.                                                  if(f_ew==1&&f_sn==0)
  180.                                                  P1=LIGHT[2];
  181.                                                  if(FLAG_EW_Y==1)
  182.                                                  P1=LIGHT[3];
  183.                                                 TR0=1;
  184.                     }
  185.                            }
  186.                          while(!s);
  187.                }                        
  188.           if(a!=0)
  189.           {
  190.              if(key1==0)
  191.                   {
  192.                     delay1(5);
  193.                          if(key1==0)
  194.                          {
  195.                                                 if(a==1)
  196.                                            {
  197.                                                         SN++;
  198.                                                         EW++;
  199.                                                  if(SN==100)
  200.                                                          SN=0;
  201.                                                  if(EW==100)
  202.                                                          EW=0;
  203.                                                         DISP_SN(SN);
  204.                                                         DISP_EW(EW1);
  205.                                                 }
  206.                                                  if(a==2)
  207.                                                  {
  208.                                                                  EW1++;
  209.                                                                  SN1++;
  210.                                                          if(EW1==100)
  211.                                                                  EW1=0;
  212.                                                          if(SN==100)
  213.                                                                  SN1=0;
  214.                                                          DISP_EW(EW1);
  215.                                                          DISP_SN(SN);
  216.                                                  }
  217.                                                          while(!key1)
  218.                                                          {
  219.                                                                 if(a==1)
  220.                                                                 {
  221.                                                                         DISP_SN(SN);
  222.                                                                         DISP_EW(EW1);
  223.                                                                 }
  224.                                                                  if(a==2)
  225.                                                                  {
  226.                                                                         DISP_EW(EW1);
  227.                                                                  DISP_SN(SN);
  228.                                                                  }
  229.                                                          }
  230.                         }
  231.                         }                        
  232.                 if(key2==0)
  233.                   {
  234.                                  delay1(5);
  235.                                  if(key2==0)
  236.                                  {
  237.                                                 if(a==1)
  238.                                                  {
  239.                                                         SN--;
  240.                                                         EW--;
  241.                                                          if(SN==-1)
  242.                                                                  SN=99;
  243.                                                          if(EW==-1)
  244.                                                                  EW=99;
  245.                                                                 DISP_SN(SN);
  246.                                                                 DISP_EW(EW1);
  247.                                                  }
  248.                                                          if(a==2)
  249.                                                          {
  250.                                                                  EW1--;
  251.                                                                  SN1--;
  252.                                                          if(EW1==-1)
  253.                                                                  EW1=99;
  254.                                                          if(SN1==-1)
  255.                                                                  SN1=99;
  256.                                                          DISP_EW(EW1);
  257.                                                          DISP_SN(SN);
  258.                                                          }
  259.                                                                          while(!key2)
  260.                                                                          {
  261.                                                                                 if(a==1)
  262.                                                                                 {
  263.                                                                                         DISP_SN(SN);
  264.                                                                                         DISP_EW(EW1);
  265.                                                                                 }
  266.                                                                          if(a==2)
  267.                                                                          {
  268.                                                                                         DISP_EW(EW1);
  269.                                                                                  DISP_SN(SN);
  270.                                                                                  }
  271.                                                                          }
  272.                            }
  273.                                 }                        
  274.           }
  275.          if(a==0)
  276.          {
  277.              if(key1==0)
  278.                  {
  279.                      delay1(5);
  280.                          if(key1==0)
  281.                      {
  282.                         TR0=0;
  283.                                 flag=1;
  284.                                 P0=0;
  285.                             fm=1;
  286.                                 flag_key=1;
  287.                      }
  288.                          while(!key1);
  289.               dispnon();
  290.              P1=LIGHT[0];
  291.                  }
  292.                  if(key2==0)
  293.                  {
  294.                      delay1(5);
  295.                          if(key2==0)
  296.                      {
  297.                         TR0=0;
  298.                                    flag=1;
  299.                                    P0=0;
  300.                                          fm=1;
  301.                                          c++;
  302.                                  flag_key=1;
  303.                                          
  304.                      }
  305.                          while(!key2);
  306.                          dispnon();         
  307.                          P1=LIGHT[2];
  308.                  }
  309.          }
  310. }
  311. void led_disp(void)
  312. {
  313.   /*******SN通行EW红灯*** ***************/
  314.         FLAG_EW_Y=0;
  315.         Time_EW=EW;
  316.         Time_SN=SN;
  317.                 f_ew=0;
  318.                 f_sn=1;
  319.                 P1=LIGHT[0];
  320.         while(Time_SN>=0)
  321.         {   
  322.                     if(Time_SN==3)
  323.                         {
  324.                            FLAG_SN_G=1;
  325.                         }
  326.                     if(F_DISP==0)   
  327.              {
  328.                           DISP_SN(Time_SN);
  329.                           }
  330.                   DISP_EW(Time_EW);
  331.         }
  332.                 /**SN黄灯闪烁***/
  333.                  FLAG_SN_G=0;
  334.                  Time_SN=3;
  335.                  FLAG_SN_Y=1;
  336.                  P1=LIGHT[1];
  337.                while(Time_SN>=0)
  338.         {   
  339.                   DISP_SN(Time_SN);
  340.                   DISP_EW(Time_EW);
  341.         }
  342.                 FLAG_SN_Y=0;
  343.                 f_sn=0;
  344. /*******EW通行SN红灯******************/
  345.         Time_EW=EW1;
  346.         Time_SN=SN1;
  347.                 f_ew=1;
  348.                 P1=LIGHT[2];
  349.                 /***EW绿灯亮***/
  350.         while(Time_EW>=0)
  351.         {  
  352.            if(Time_EW==3)
  353.                         {
  354.                            FLAG_EW_G=1;
  355.                         }
  356.                     if(F_DISP==0)   
  357.              {
  358.                           DISP_EW(Time_EW);
  359.                          }
  360.                      DISP_SN(Time_SN);
  361.         }
  362.         P1=0X00;
  363.                 FLAG_EW_G=0;
  364.                 /***切换为黄灯***/
  365.                  Time_EW=3;
  366.                  FLAG_EW_Y=1;
  367.                  P1=LIGHT[3];
  368.        while(Time_EW>=0)
  369.         {   
  370.                   DISP_SN(Time_SN);
  371.                   DISP_EW(Time_EW);
  372.         }
  373.                 FLAG_SN_Y=0;
  374.                 P1=0x00;
  375. }
  376. void init(void)
  377. {
  378.     IT0=0;
  379.     TMOD=0x01;//定时器工作于方式1
  380.     TH0=(65536-50000)/256;//定时器赋初值
  381.     TL0=(65536-50000)%256;
  382.     EA=1;//CPU开中断总允许
  383.     ET0=1;//开定时中断
  384.           EX0=1;
  385.     TR0=1;//启动定时器0  
  386.           fm=1;
  387. }
  388. /********************************************************************/

  389. void main(void)
  390. {
  391.     init();
  392.         check();
  393.     while(1)
  394.     {
  395.            led_disp();
  396.     }
  397. }
  398. /*****************定时器0*********************/
  399. void timer0(void) interrupt 1
  400. {
  401.     static uchar count;
  402.     TH0=(65536-50000)/256;
  403.     TL0=(65536-50000)%256;
  404.     count++;
  405.         keyscan();
  406.         while(flag)
  407.          {
  408.                  if(a!=0)
  409.                   {
  410.                           if(a==1)
  411.                           DISP_EW(EW1);
  412.                           if(a==2)
  413.                           DISP_SN(SN);
  414.                           if(a==3)
  415.                           {
  416.                 DISP_EW(EW1);
  417.                                 DISP_SN(SN);
  418.               }         
  419.                   }
  420.            keyscan();
  421.          }
  422.         if(FLAG_SN_G==1)
  423.         {
  424.            if(count%10==0)
  425.            {
  426.               SN_G=~SN_G;
  427.                   F_DISP=~F_DISP;
  428.                   fm=~fm;
  429.            }
  430.         }
  431.         if(FLAG_SN_Y==1)
  432.         {
  433.            if(count%10==0)
  434.            {
  435.              SN_Yellow=~SN_Yellow;
  436.                   fm=~fm;
  437.            }
  438.         }
  439.         if(FLAG_EW_G==1)
  440.         {
  441.            if(count%10==0)
  442.            {
  443.               EW_G=~EW_G;
  444.                   F_DISP=~F_DISP;
  445.                    fm=~fm;
  446.            }
  447.         }
  448.         if(FLAG_EW_Y==1)
  449.         {
  450.            if(count%10==0)
  451.            {
  452.              EW_Yellow=~EW_Yellow;
  453.                   fm=~fm;
  454.            }
  455.         }
  456.     if(count==20)
  457.     {
  458.         Time_EW--;


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

全部资料下载:
交通灯.rar (617.52 KB, 下载次数: 82)


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

使用道具 举报

沙发
ID:203433 发表于 2017-5-23 22:39 | 只看该作者
求相关实验报告
回复

使用道具 举报

板凳
ID:72444 发表于 2017-6-20 14:01 | 只看该作者
谢谢分享
回复

使用道具 举报

地板
ID:262914 发表于 2017-12-18 00:14 | 只看该作者
感谢分享
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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