久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1387|回復: 1
收起左側

單片機交通燈,請大家幫忙看看程序哪里有錯誤

[復制鏈接]
ID:870327 發表于 2020-12-29 16:11 | 顯示全部樓層 |閱讀模式
程序在Proteus上可以運行成功,在開發板連接之后中斷返回有點問題(應該是功能函數那個地方),請大家幫忙看看是哪里有問題
  1. #include <reg51.h>
  2. #define        uint unsigned int
  3. #define uchar unsigned char
  4. //南北為次干道
  5. sbit Blue_nb=P2^7;                                                 //南北左轉標志
  6. sbit Red_nb=P2^6;                                //南北紅燈標志
  7. sbit Yellow_nb=P2^5;                        //南北黃燈標志
  8. sbit Green_nb=P2^4;                     //南北綠燈標志
  9. //東西為主干道
  10. sbit Blue_dx=P2^0;                                                //東西左轉標志
  11. sbit Red_dx=P2^3;                                //東西紅燈標志
  12. sbit Yellow_dx=P2^2;                        //東西黃燈標志
  13. sbit Green_dx=P2^1;                                //東西綠燈標志

  14. sbit set=P3^6;
  15. sbit key1=P3^4;
  16. sbit key2=P3^5;


  17. bit dx_nb=0;                                        //東西南北控制位
  18. bit Yellow_status=0;                        //黃燈閃爍標志位

  19. unsigned int  sec_dx;                             //東西方向時間存儲變量
  20. unsigned int  sec_nb;                                      //南北方向時間存儲變量
  21. float  set_timedx=15;                                    //東西方向的通行單次時間
  22. float  set_timenb=15;                                    //南北方向的通行單次時間
  23. unsigned char  buf[4];                                    //秒顯示的變量
  24. unsigned char data countt0;             //定時器0中斷定時器

  25. unsigned int Temp;
  26. unsigned char flag_option=0;            //功能選擇: 緊急模式
  27. sbit beep=P3^3;                                                         //蜂鳴器
  28. sbit  key_EP=P3^2;                                //緊急模式
  29. unsigned char conut_ER;                 //緊急狀態



  30. unsigned char code led[11]={                //共陽極字型碼
  31.     0xc0,  //--0
  32.     0xf9,  //--1
  33.     0xa4,  //--2
  34.     0xb0,  //--3
  35.     0x99,  //--4
  36.     0x92,  //--5
  37.     0x82,  //--6
  38.     0xf8,  //--7
  39.     0x80,  //--8
  40.     0x90,  //--9
  41.     0x00   //--NULL
  42. };



  43. /*延時函數*/
  44. void delay(int time)
  45. {
  46.     unsigned int j,k;
  47.     for(j=0;j<time;j++)                       
  48.        for(k=0;k<124;k++);               
  49. }

  50. /*顯示函數*/
  51. void display(void)
  52. {
  53.     buf[0]=sec_dx/10;                 //第1位 東西十位
  54.     buf[1]=sec_dx%10;                 //第2位 東西個位
  55.     P1=0x40;                           //LED1
  56.     P0=led[buf[0]];                    //東西十位
  57.     delay(1);
  58.     P1=0x80;                     //LED2
  59.     P0=led[buf[1]];                    //東西個位
  60.     delay(1);
  61.         buf[2]=sec_nb/10;                //南北十位
  62.         buf[3]=sec_nb%10;                //南北個位
  63.         P1=0x01;
  64.         P0=led[buf[2]];
  65.         delay(1);
  66.         P1=0x02;
  67.         P0=led[buf[3]];
  68.         delay(1);               

  69. }

  70. /*功能函數*/
  71. void function(void)
  72. {
  73.                            
  74.             conut_ER=1-conut_ER;
  75.             if(conut_ER==1)
  76.             {      
  77.                                  
  78.                 TR0=0;                                                //關交通燈定時器
  79.                                         Temp=P2;
  80.                 P2=0x00;                                        //關全部信號燈
  81.                 Red_dx=1;                   //全部置紅燈
  82.                 Red_nb=1;
  83.                             beep=0;
  84.                
  85.                               
  86.             }               
  87.             if(conut_ER==0)
  88.             {
  89.                  TR0=1;                                                //開交通燈定時器
  90.                        P2=Temp;
  91.                                 beep=1;
  92.                           
  93.             }      
  94.             flag_option=0;      

  95.         }



  96. /*處理整個交通燈計時*/
  97. void time0(void) interrupt 1 using 1          //定時中斷子程序
  98. {
  99.     TH0=0x4C;                                                        //重賦初值;11.0592m晶振50ms
  100.     TL0=0X00;
  101.     TR0=1;                                                                //開交通燈定時器
  102.     countt0++;                                                        //計數器數加1(用于計算時間)

  103.     if(countt0==20)                                  //定時器中斷次數=20時(即1秒時)
  104.     {      
  105.         countt0=0;                                                //清零計數器
  106.         sec_dx--;                                                //東西時間減1
  107.         sec_nb--;                                                //南北時間減1
  108.                
  109.         if(sec_nb==5&&sec_dx==0&&(Yellow_status==0))                //當南北倒計時到5s時,用于黃燈閃爍時間
  110.         {
  111.                    sec_dx=5;
  112.             Yellow_status=1;
  113.         }
  114.         if(sec_dx==5&&sec_nb==0&&(Yellow_status==0))                 //當東西倒計時到5s時,用于黃燈閃爍時間
  115.         {
  116.             sec_nb=5;
  117.             Yellow_status=1;                        //啟動黃燈開始倒計時
  118.         }
  119.         if((sec_nb<=5)&&(dx_nb==0)&&(Yellow_status==1))                  //東西黃燈閃
  120.         {
  121.             Blue_dx=0;
  122.             Yellow_dx=~Yellow_dx;
  123.         }
  124.         if((sec_dx<=5)&&(dx_nb==1)&&(Yellow_status==1))                  //南北黃燈閃
  125.         {
  126.             Blue_nb=0;
  127.             Yellow_nb=~Yellow_nb;
  128.         }
  129.         if(dx_nb==0&&sec_nb==0&&sec_dx==0)                                    //東西通行:當黃燈時間、通行方向倒計時到0時
  130.         {
  131.             P2=0x00;                                        //重置東西南背方向的紅綠燈
  132.             Green_nb=1;                                        //南北綠燈亮
  133.             Red_dx=1;                                        //東西紅燈亮
  134.             dx_nb=!dx_nb;                                //交換通行方向
  135.             Yellow_status=0;                        //關閉黃燈閃爍
  136.             sec_dx=set_timedx+25;                        //重賦東西方向的起始值
  137.             sec_nb=set_timenb+5;                //重賦南北方向的起始值
  138.         }
  139.         if(dx_nb==1&&sec_dx==0&&sec_nb==0)                                    //南北通行:當黃燈時間、通行方向倒計時到0時
  140.         {
  141.             P2=0X00;                                        //重置東西南北的紅綠燈狀態
  142.             Green_dx=1;                                        //東西綠燈亮
  143.             Red_nb=1;                                        //南北紅燈亮
  144.             dx_nb=!dx_nb;                                //交換通行方向
  145.             Yellow_status=0;                                        //關閉黃燈閃爍
  146.             sec_dx=set_timedx+25;                //重賦東西方向的起始值
  147.             sec_nb=set_timenb+45;                        //重賦南北方向的起始值
  148.         }
  149.                 if(dx_nb==0&&sec_nb==20&&sec_dx==0)                 //東西通行:當東西直行綠燈倒數到0時
  150.                 {
  151.                         P2=0x00;
  152.                         Blue_dx=1;
  153.                         Red_nb=1;
  154.                         sec_dx=set_timedx;
  155.                         Yellow_status=0;
  156.                        
  157.                 }
  158.                 if(dx_nb==1&&sec_nb==0&&sec_dx==20)                 //南北通行:當南北直行綠燈倒數到0時
  159.                 {
  160.                         P2=0x00;
  161.                         Blue_nb=1;
  162.                         Red_dx=1;
  163.                         sec_nb=set_timedx;
  164.                         Yellow_status=0;
  165.                        
  166.                 }
  167.     }
  168. }

  169. void key_to1()
  170. {
  171.         TR0=0;         //關定時器
  172.                 if(set==0)
  173.                 {sec_nb++; //南北加1S
  174.                 sec_dx++;//東西加1S
  175.                 }
  176.                 else
  177.                 TR0=1;
  178.         if(sec_dx==100&sec_nb==100)           //東西黃燈閃爍
  179.         {
  180.                 sec_nb=5;
  181.                 sec_dx=5;
  182.         }
  183.         if(sec_nb==100)                //東西直行,南北禁止
  184.                 {
  185.                 sec_nb=60;
  186.                 sec_dx=40;
  187.                 }
  188.         if(sec_dx==100)                //南北直行,東西禁止
  189.                 {
  190.                 sec_nb=20;
  191.                 sec_dx=40;
  192.                 }
  193.         if(sec_nb==100&&sec_dx==95)         //東西左轉,南北禁止
  194.         {
  195.                 sec_nb=20;
  196.                 sec_dx=15;
  197.         }      
  198.         if(sec_dx==100&&sec_nb==95)                //南北左轉,東西禁止
  199.         {
  200.                 sec_nb=15;
  201.                 sec_dx=20;
  202.         }
  203.                
  204. }
  205. void key_to2()
  206. {
  207.         TR0=0;//關定時器
  208.                 if(set==0)
  209.                 {sec_nb--;  //南北減1S

  210.                 sec_dx--;  //東西減1S
  211.                 }
  212.                 else
  213.                 TR0=1;
  214.         if(sec_dx==0&sec_nb==0)         //南北黃燈閃爍
  215.         {
  216.                 sec_nb=5;
  217.                 sec_dx=5;
  218.         }      
  219.         if(sec_nb==0)                 //東西直行,南北禁止
  220.         {
  221.                 sec_nb=20;      
  222.                 sec_dx=40;
  223.                 }
  224.         if(sec_dx==0)                  //南北直行,東西禁止
  225.         {
  226.                 sec_nb=60;
  227.                 sec_dx=40;
  228.         }
  229.         if(sec_nb==5&&sec_dx==0)         //東西左轉,南北禁止
  230.         {
  231.                 sec_nb=20;
  232.                 sec_dx=15;
  233.         }
  234.         if(sec_dx==5&&sec_nb==0)                //南北左轉,東西禁止
  235.         {
  236.                 sec_nb=15;
  237.                 sec_dx=20;
  238.         }

  239. }
  240. void key()        //按鍵掃描子程序
  241. {
  242.         if(key1!=1)
  243.         {
  244.                 delay(10);
  245.                 if(key1!=1)
  246.                 {
  247.                         while(key1!=1);
  248.                         key_to1();
  249.                 }
  250.         }
  251.         if(key2!=1)
  252.         {
  253.                 delay(10);
  254.                 if(key2!=1)
  255.                 {
  256.                         while(key2!=1);
  257.                         key_to2();
  258.                 }
  259.         }
  260.         }
  261. //外部中斷0
  262. void int0(void) interrupt 0 using 1            //緊急模式
  263. {
  264.     while(!key_EP)display();
  265.     flag_option=1;


  266. }


  267. /*初始化函數*/
  268. void init()
  269. {
  270.     TMOD=0X01;                                                           //定時器設置
  271.     TH0=0x4C;                                                        //TH0重賦初值;11.0592m晶振50ms
  272.     TL0=0X00;
  273.     TCON=0X10;                                                        //啟動定時0
  274.     IE=0x83;                                                        //開總中斷;定時器0中斷開啟;開外部中斷
  275.     P2=0X42;                                                        //開始默認狀態,東西紅燈,南北綠燈      
  276.         beep=1;                                                                //beep為1,蜂鳴器不響
  277.     sec_nb=60;                                                        //南北方向初始時間
  278.     sec_dx=40;                                                        //東西方向初始時間
  279.         conut_ER=0;
  280. }

  281. //主程序
  282. void main()
  283. {
  284.     init();                                                                //初始化定時器、中斷服務
  285.     while(1)                                                        
  286.     {         key(); //調用按鍵掃描程序
  287.         if(flag_option!=0)function();         //調用功能函數
  288.         display();                                                 //調用顯示函數
  289.     }
  290. }
復制代碼

回復

使用道具 舉報

ID:235200 發表于 2020-12-30 00:46 | 顯示全部樓層
程序編譯無錯誤,中斷計時也無錯誤,但計時后的處理及信號燈的變化處理邏輯太混亂且復雜,可以簡化
回復

使用道具 舉報

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

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩一区二区av | 麻豆成人91精品二区三区 | 91在线免费视频观看 | 亚洲啪啪网 | 成人一级黄色片 | 激情视频网址 | 99视频| 青草视频在线播放 | 91午夜精品亚洲一区二区三区 | 成人av免费看 | 男人天堂2020| 久久久久久久免费视频 | 国产资源在线播放 | 日韩精品三区 | 97在线免费观看视频 | 91美女网站 | 亚洲综合激情五月久久 | 激情综合网站 | 欧美顶级黄色大片免费 | 日本精品久久久 | 中文字幕在线观看日本 | 小日子的在线观看免费第8集 | 在线免费黄色 | 欧美一区二区三区在线视频 | 中文字幕少妇 | 91在线亚洲 | 中文字幕在线网站 | 国产免费一区 | 欧美爱爱视频 | 伊人黄色 | 伊人久久av | 日韩国产一区二区三区 | 一级片欧美 | 亚洲视频免费在线观看 | 国产不卡视频 | 国产精品免费一区 | 死神来了4无删减版在线观看 | 欧美精品亚洲 | 九九精品视频在线观看 | 成人免费毛片片v | 日本不卡视频在线观看 |