找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6558|回復(fù): 2
收起左側(cè)

單片機交通燈設(shè)計 含proteus仿真和源碼

[復(fù)制鏈接]
ID:143245 發(fā)表于 2016-10-18 15:59 | 顯示全部樓層 |閱讀模式
這是大二的時候做的單片機期末設(shè)計,在交通繁忙的時候可以調(diào)整通行時間

0.png
所有資料打包下載:
簡易交通燈設(shè)計.rar (134.96 KB, 下載次數(shù): 106)

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

0.png

下面是單片機源碼:
  1. #include <REGX52.H>
  2. #define        uchar        unsigned char
  3. #define        uint        unsigned int
  4. sbit    Time_Show_LED2=P2^1;// 繁忙狀態(tài)數(shù)碼管高位控制
  5. sbit    Time_Show_LED1=P2^0;//        低位控制

  6. sbit          EW_LED2=P2^3;        //東西方向數(shù)碼管高位控制
  7. sbit          EW_LED1=P2^2;        //        低位控制

  8. sbit          SN_LED2=P2^5;        //南北方向數(shù)碼管高位控制
  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;  //設(shè)置T0中斷服務(wù)程序初始值為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};//共陰數(shù)碼管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; //關(guān)中斷

  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) //測試按鍵是否按下,按下為繁忙狀態(tài)
  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狀態(tài)****/
  156.     case 1:        EW_ManGreen=1;        //EW人行道禁止
  157.                                           SN_ManGreen=0;//SN人行道通行
  158.                                           Flag_EW_Yellow=1;           //EW關(guān)黃燈顯示信號
  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狀態(tài)***/
  173.           case 2:  P1=0xff;                                        //關(guān)掉所有燈
  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狀態(tài)***/
  184.                 case 3:        Flag_SN_Yellow=1; //SN關(guān)黃燈顯示信號
  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狀態(tài)***/
  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狀態(tài)***/
  211.                 case 5:        EW_ManGreen=~EW_ManGreen;//EW人行道通行
  212.                                                 SN_ManGreen=~SN_ManGreen;//SN人行道禁止
  213.                                                 Flag_SN_Yellow=1;  //SN關(guān)黃燈顯示信號
  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狀態(tài)***/
  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狀態(tài)***/
  239.                 case 7:        Flag_EW_Yellow=1;            //EW關(guān)黃燈顯示信號
  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狀態(tài)***/
  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. }
復(fù)制代碼


評分

參與人數(shù) 2黑幣 +62 收起 理由
丿Sapphire + 2 很給力!
admin + 60 共享資料的黑幣獎勵!

查看全部評分

回復(fù)

使用道具 舉報

ID:544861 發(fā)表于 2019-5-23 15:57 | 顯示全部樓層
好非常不錯,謝謝分享
回復(fù)

使用道具 舉報

ID:626546 發(fā)表于 2019-10-19 11:10 | 顯示全部樓層
lllll22 發(fā)表于 2019-5-23 15:57
好非常不錯,謝謝分享

有文件麼
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表