找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机交通灯设计 含proteus仿真和源码

[复制链接]
跳转到指定楼层
楼主
这是大二的时候做的单片机期末设计,在交通繁忙的时候可以调整通行时间


所有资料打包下载:
简易交通灯设计.rar (134.96 KB, 下载次数: 106)

下面是proteus仿真原理图:
可以看得出功能十分全面



下面是单片机源码:
  1. #include <REGX52.H>
  2. #define        uchar        unsigned char
  3. #define        uint        unsigned int
  4. sbit    Time_Show_LED2=P2^1;// 繁忙状态数码管高位控制
  5. sbit    Time_Show_LED1=P2^0;//        低位控制

  6. sbit          EW_LED2=P2^3;        //东西方向数码管高位控制
  7. sbit          EW_LED1=P2^2;        //        低位控制

  8. sbit          SN_LED2=P2^5;        //南北方向数码管高位控制
  9. sbit          SN_LED1=P2^4;        // 低位控制

  10. sbit    SN_Yellow=P1^6;//南北黄灯
  11. sbit    EW_Yellow=P1^2;//东西黄灯
  12. sbit    EW_Red=P1^3;//东西红灯
  13. sbit    SN_Red=P1^7;//南北红灯
  14. sbit    EW_ManGreen=P3^0;//东西人行道绿灯
  15. sbit    SN_ManGreen=P3^1;//南北人行道绿灯

  16. sbit    SN_GREEN_A1=P1^5;//南北直行和右拐绿灯
  17. sbit    EW_RED_B=P1^3;//东西红灯
  18. sbit                 SN_GREEN_A2=P1^4;//南北左拐绿灯
  19. sbit    EW_GREEN_B1=P1^1;//东西直行右拐绿灯
  20. sbit    SN_RED_A=P1^7;//南北红灯
  21. sbit    EW_GREEN_B2=P1^0;//东西左拐绿灯

  22. sbit    Busy_LED=P2^7;//交通繁忙指示灯
  23. sbit    Busy_Btton=P3^6;//交通繁忙按键
  24. sbit    Add_Button=P3^3;//时间加
  25. sbit    Reduces_Button=P3^4;//时间减

  26. bit     Flag_SN_Yellow; //南北黄灯标志位
  27. bit     Flag_EW_Yellow;//东西黄灯标志位

  28. char        Time_EW;//东西方向倒计时单元
  29. char        Time_SN;//南北方向倒计时单元
  30. uchar operation_type=1;  //设置T0中断服务程序初始值为1
  31. uchar EW=60,SN=40,EWL=19,SNL=19; //程序初始化赋值,正常模式
  32. uchar EW1=60,SN1=40,EWL1=19,SNL1=19;//用于存放修改值的变量
  33. uchar code table[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//共阴数码管0~9段码

  34. void Delay(unsigned char cnt)
  35. {
  36.         unsigned int i,t;
  37.         for(i=0;i<cnt;i++)
  38.         {
  39.                 t=115;
  40.                 while(--t);
  41.   }
  42. }


  43. void        Display(void)
  44.         {
  45.                 char h,l;
  46.                 h=Time_EW/10;
  47.                 l=Time_EW%10;
  48.           P0=table[l];
  49.                 EW_LED1=1;
  50.                 Delay(1);
  51.                 EW_LED1=0;
  52.           P0=table[h];
  53.                 EW_LED2=1;
  54.                 Delay(1);
  55.                 EW_LED2=0;

  56.                 h=Time_SN/10;
  57.                 l=Time_SN%10;
  58.                 P0=table[l];
  59.                 SN_LED1=1;
  60.                 Delay(1);
  61.                 SN_LED1=0;
  62.           P0=table[h];
  63.                 SN_LED2=1;
  64.                 Delay(1);
  65.                 SN_LED2=0;
  66.                

  67.                  h= EW1/10;
  68.                  l= EW1%10;
  69.                  P0=table[l];
  70.                  Time_Show_LED1=1;
  71.                  Delay(2);
  72.      Time_Show_LED1=0;
  73.                  P0=table[h];
  74.                  Time_Show_LED2=1;
  75.                  Delay(2);
  76.            Time_Show_LED2=0;
  77. }
  78. /*********外部中断***********/
  79. void        EXINT0(void)interrupt 0 using 1
  80. {
  81.                  EX0=0; //关中断

  82.     if(Add_Button==0) //时间加
  83.         {
  84.              EW1+=5;
  85.              SN1+=5;
  86.                if(EW1>=100)
  87.                                 {
  88.                                               EW1=99;
  89.                                               SN1=79;
  90.               }
  91.         }
  92. if(Reduces_Button==0) //时间减
  93.         {
  94.              EW1-=5;
  95.              SN1-=5;
  96.              if(EW1<=40)
  97.                {
  98.                                     EW1=40;
  99.                   SN1=20;
  100.                 }
  101.                                  
  102.                      }


  103. if(Busy_Btton==0) //测试按键是否按下,按下为繁忙状态
  104.          {
  105.                              EW1=45;
  106.                  SN1=30;
  107.                                          EWL1=14;
  108.                                          SNL1=14;
  109.          
  110.                                          Busy_LED=0;//开繁忙信号灯
  111.                         
  112.          }

  113.                  EX0=1;//开中断
  114.          }
  115.         
  116. /*********定时中断***********/
  117. void T0_INT() interrupt 1
  118. {
  119.         static uchar count;
  120.         TH0=(65536-50000)/256;
  121.         TL0=(65536-50000)%256;
  122.         count++;
  123.         
  124.         if(count==10)
  125.         {
  126.           if(Flag_SN_Yellow==0) //测试南北黄灯标志位
  127.           {
  128.                  SN_Yellow=~SN_Yellow;
  129.                 }
  130.           if(Flag_EW_Yellow==0)  //测试东西黄灯标志位
  131.           {
  132.                  EW_Yellow=~EW_Yellow;
  133.                 }
  134.         }
  135.         if(count==20)
  136.         {
  137.           Time_EW--;
  138.           Time_SN--;
  139.           if(Flag_SN_Yellow==0)//测试南北黄灯标志位
  140.           {
  141.                  SN_Yellow=~SN_Yellow;
  142.                 }
  143.           if(Flag_EW_Yellow==0)//测试东西黄灯标志位
  144.           {
  145.                  EW_Yellow=~EW_Yellow;
  146.                 }
  147.         count=0;
  148.         }
  149.         
  150. }

  151. void zhuangtai()
  152. {
  153.         switch(operation_type)
  154.         {
  155.                   /**s1状态****/
  156.     case 1:        EW_ManGreen=1;        //EW人行道禁止
  157.                                           SN_ManGreen=0;//SN人行道通行
  158.                                           Flag_EW_Yellow=1;           //EW关黄灯显示信号
  159.                                           Time_EW=EW;        
  160.                                           Time_SN=SN;               
  161.                                                 while(Time_SN>=5)
  162.                                                         {
  163.                                                                 SN_GREEN_A1=0;         //SN通行,EW红灯
  164.                                                                 EW_RED_B=0;
  165.                                                                 SN_Yellow=1;
  166.                                                                 SN_RED_A=1;
  167.                                                                 Display();
  168.                                                         }
  169.                                                 operation_type=2;
  170.                                                 break;
  171.                                                         
  172.                                      /***s2状态***/
  173.           case 2:  P1=0xff;                                        //关掉所有灯
  174.                                                 while(Time_SN>=0)
  175.                                                  {
  176.                                                          Flag_SN_Yellow=0;         //SN开黄灯信号位
  177.                                                          EW_Red=0;      //SN黄灯亮,等待左拐信号,EW红灯
  178.                                                          Display();
  179.                                                  }
  180.                                                  operation_type=3;
  181.                                                  break;
  182.                                                          
  183.                                     /***s3状态***/
  184.                 case 3:        Flag_SN_Yellow=1; //SN关黄灯显示信号
  185.                                     Time_SN=SNL;
  186.                                                 while(Time_SN>=5)
  187.                                                 {
  188.                                                         SN_GREEN_A2=0;//SN左拐绿灯亮,EW红灯
  189.                                                         EW_RED_B=0;
  190.                                                         SN_Yellow=1;
  191.                                                   Display();
  192.                                                 }
  193.                                                 operation_type=4;
  194.                                                 break;

  195.                                /***s4状态***/
  196.                 case 4:        P1=0xff;
  197.                                                 while(Time_SN>=0)
  198.                                                 {
  199.                                                         Flag_SN_Yellow=0;        //SN开黄灯信号位
  200.                                                         EW_Red=0;      //SN黄灯亮,等待停止信号,EW红灯
  201.                                                         
  202.                                                         Display();
  203.                                                 }
  204.             EW=EW1;
  205.                                                 SN=SN1;
  206.                                                 EWL=EWL1;
  207.                                                 SNL=SNL1;
  208.             operation_type=5;
  209.                                                 break;

  210.                                                 /***s5状态***/
  211.                 case 5:        EW_ManGreen=~EW_ManGreen;//EW人行道通行
  212.                                                 SN_ManGreen=~SN_ManGreen;//SN人行道禁止
  213.                                                 Flag_SN_Yellow=1;  //SN关黄灯显示信号
  214.                                                 Time_EW=SN;
  215.                                                 Time_SN=EW;
  216.                                                 while(Time_EW>=5)
  217.                                                 {
  218.                                                  EW_GREEN_B1=0;         //EW通行,SN红灯
  219.                                                  SN_RED_A=0;
  220.                                                  EW_Yellow=1;
  221.                                                  EW_RED_B=1;
  222.                                                  Display();
  223.                                                 }
  224.                                                 operation_type=6;
  225.                                                 break;
  226.                                                 
  227.                                      /***s6状态***/
  228.                 case 6:        P1=0xff;
  229.                                                 while(Time_EW>=0)
  230.                                                  {
  231.                                                          Flag_EW_Yellow=0;//EW开黄灯信号位
  232.                                                         SN_Red=0;//EW黄灯亮,等待左拐信号,SN红灯        
  233.                                                         Display();
  234.                                                  }
  235.                                                  operation_type=7;
  236.                                                  break;
  237.                                                 
  238.                                                  /***s7状态***/
  239.                 case 7:        Flag_EW_Yellow=1;            //EW关黄灯显示信号
  240.                                                 Time_EW=EWL;
  241.                                                 while(Time_EW>=5)
  242.                                                 {
  243.                                                   EW_GREEN_B2=0        ;//EW左拐绿灯亮,SN红灯
  244.                                                         EW_RED_B=1;
  245.                                                         SN_RED_A=0;
  246.                                                         EW_Yellow=1;
  247.                                                         Display();
  248.                                                 }
  249.                                                 operation_type=8;
  250.             break;
  251.                                                 
  252.                                 
  253.                                                 
  254.                                     /***s8状态***/
  255.                 case 8:        P1=0xff;
  256.                                                 while(Time_EW>=0)
  257.                                                  {
  258.                                                         Flag_EW_Yellow=0; //EN开黄灯信号位
  259.                                                         SN_Red=0;//EW黄灯亮,等待停止信号,SN红灯        
  260.                                                         Display();
  261.                                                  }
  262.                                                         EW=EW1;
  263.                                                         SN=SN1;
  264.                                                         EWL=EWL1;
  265.                                                         SNL=SNL1;
  266.                                                         operation_type=1;
  267.                                                          break;


  268.         }                                 
  269. }                                 
  270. void        main()
  271. {
  272.         IT0=1;        
  273.   TMOD=0x01;    //定时器T0工作于方式1
  274.         TH0=(65536-50000)/256;  //定时赋初值
  275.         TL0=(65536-50000)%256;
  276.         EA=1;  //开总中断
  277.         ET0=1; //开定时器中断
  278.         EX0=1; //开外部INTO中断
  279.   TR0=1; //启动定时器

  280.   while(1)

  281.         {               
  282.                         zhuangtai();
  283.         }
  284. }
复制代码


评分

参与人数 2黑币 +62 收起 理由
丿Sapphire + 2 很给力!
admin + 60 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

沙发
ID:544861 发表于 2019-5-23 15:57 | 只看该作者
好非常不错,谢谢分享
回复

使用道具 举报

板凳
ID:626546 发表于 2019-10-19 11:10 | 只看该作者
lllll22 发表于 2019-5-23 15:57
好非常不错,谢谢分享

有文件麽
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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