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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 20625|回復: 5
打印 上一主題 下一主題
收起左側

單片機交通燈設計 原理圖與代碼

[復制鏈接]
跳轉到指定樓層
樓主
proteus交通信號燈仿真原理圖

  吉首大學單片機交通燈設計
原理圖
局部放大

單片機源程序如下:
  1. <font color="rgb(0, 0, 0)">#include<reg51.H>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. uchar code table[]={     //共陰極數碼管碼表
  5. 0x3f,0x06,0x5b,0x4f,
  6. 0x66,0x6d,0x7d,0x07,
  7. 0x7f,0x6f,0x77,0x7c,
  8. 0x39,0x5e,0x79,0x71,

  9. 0xC9,0xFF,0x40};//設置碼,測試碼,不計時碼

  10. void delay(uint x);//延時函數
  11. void display(uchar,uchar,uchar,uchar);    //數碼管顯示函數
  12. void mkeys();    //鍵盤函數
  13. void traffic();    //交通燈函數

  14. uchar num,num1,num2,  //1南北 2東西
  15. shi1,ge1,shi2,ge2,
  16. value1,value2,//南北 綠燈時間 黃燈時間
  17. value3,value4,//東西 綠燈時間 黃燈時間
  18. count1,count2,flag1,flag2; //南北標記 東西標記

  19. void main()
  20. {   
  21.         
  22.         TMOD=0x01;
  23.         TH0=(65536-45872)/256;
  24.         TL0=(65536-45872)%256;
  25.         EA=1;
  26.         ET0=1;
  27.         TR0=1;
  28.         /*初狀態*/
  29.         value1=15;         //南北 黃綠燈默認值
  30.         value2=5;      
  31.         value3=10;      //東西 黃綠燈默認值
  32.         value4=5;

  33.         num1=value1; //南北數碼管先綠燈時間
  34.         num2=value2+value1;//東西紅燈時間
  35.         shi1=num1/10;
  36.         ge1=num1%10;
  37.         shi2=num2/10;
  38.         ge2=num2%10;
  39.         P1=0x41;//初始狀態:東西紅燈 南北綠燈      20 15

  40.         while(1){
  41.             if(num==20)       //定時器1s
  42.             {
  43.                 num=0;
  44.                 num1--;
  45.                 num2--;
  46.                 traffic();
  47.                     
  48.                 shi1=num1/10;
  49.                 ge1=num1%10;

  50.                 shi2=num2/10;
  51.                 ge2=num2%10;

  52.             }
  53.               mkeys();
  54.                   display(shi1,ge1,shi2,ge2);
  55.               
  56.         }

  57. }

  58. void traffic() //紅綠燈主控制程序
  59. {
  60.     if(num1==0){
  61.             count1++;
  62.             if(count1==1){
  63.                 P1=0x42;//東西紅燈 南北黃燈    5 5
  64.                 num1=value2;
  65.             }
  66.             if(count1==2){
  67.                 num1=value3+value4;//東西綠燈 南北紅燈    10 15
  68.                 P1=0x14;
  69.             }
  70.             if(count1==3){
  71.                 P1=0x41;// 東西黃燈 南北紅燈    5 5
  72.                 num1=value4;
  73.                 count1=0;                           
  74.             }
  75.     }
  76.     if(num2==0){
  77.             count2++;
  78.             if(count2==1){
  79.                 //P1=0x14;//東西綠燈 南北紅燈
  80.                 num2=value3;
  81.             }
  82.             if(count2==2){
  83.                 P1=0x24;//東西黃燈 南北紅燈
  84.                 num2=value4;
  85.             }
  86.             if(count2==3){
  87.                 num2=value1+value2; //東西紅燈 南北綠燈
  88.                 num1=value1;
  89.                 count2=0;
  90.             }
  91.                     
  92.     }
  93. }

  94. void display(uchar shi1,uchar ge1,uchar shi2,uchar ge2)    //數碼管顯示子函數
  95. {        
  96.         uchar temp;
  97.         temp=P2;
  98.         P2=0xfe;
  99.         P0=table[shi1];
  100.         delay(5);
  101.         
  102.         P2=0xfd;
  103.         P0=table[ge1];
  104.         delay(5);
  105.    
  106.         P2=0xfb;
  107.         P0=table[shi2];
  108.         delay(5);
  109.         
  110.         P2=0xf7;
  111.         P0=table[ge2];
  112.         delay(5);        
  113. }

  114. void delay(uint x)//延時子函數
  115. {
  116.     uint i,j;
  117.     for(i=x;i>0;i--)
  118.         for(j=110;j>0;j--);
  119. }

  120. void mkeys()  //4*4矩陣鍵盤功能子函數
  121. {
  122.     uchar temp,key;
  123.     P3=0xfe;//第一行線
  124.     temp=P3;
  125.     temp=temp&0xf0;
  126.     if(temp!=0xf0)
  127.     {
  128.         delay(10);
  129.         temp=P3;
  130.         temp=temp&0xf0;
  131.         if(temp!=0xf0){
  132.             temp=P3;
  133.             switch(temp)
  134.             {
  135.                 case 0xee:
  136.                     key=0;
  137.                     break;
  138.                 case 0xde:
  139.                     key=1;
  140.                     break;
  141.                 case 0xbe:
  142.                     key=2;
  143.                     break;
  144.                 case 0x7e:
  145.                     key=3;
  146.                     break;
  147.             }
  148.         while(temp!=0xf0)
  149.         {
  150.             temp=P3;
  151.             temp=temp&0xf0;
  152.         }
  153.         if(key==0) {//按鍵1:暫停
  154.             TR0=~TR0;  //定時器取反
  155.             flag1=~flag1;//南北能夠設置標志 0有效
  156.             flag2=~flag2;//東西能夠設置標志
  157.         }

  158.         if(key==1&&flag1==0){    //按鍵2:設置時間按鈕
  159.             TR0=0;
  160.             P1=0x44;//禁止東南西北車輛 全為紅燈 可以設置
  161.             shi1=ge1=shi2=ge2=16;
  162.         }

  163.         if(key==2&&flag2==0){//按鍵3:設置完成 重啟
  164.             TR0=1;
  165.             num=0;     //定時器 初始化
  166.             P1=0x41; //重新開始初狀態
  167.             num1=value1; //南北數碼管先綠燈時間
  168.             num2=value2+value1;//東西紅燈時間
  169.             shi1=num1/10;
  170.             ge1=num1%10;
  171.             shi2=num2/10;
  172.             ge2=num2%10;
  173.         }

  174.         if(key==3&&P1==0x44){ //按鍵4:測試交通燈各個設備的好壞
  175.             P1=0xff;
  176.             delay(1000);
  177.             P1=~P1;
  178.             shi1=ge1=shi2=ge2=17;
  179.             P1=0x44;
  180.         }

  181.         }
  182.     }

  183.     P3=0xfd;//第二行線
  184.     temp=P3;
  185.     temp=temp&0xf0;
  186.     if(temp!=0xf0)
  187.     {
  188.         delay(10);
  189.         temp=P3;
  190.         temp=temp&0xf0;
  191.         if(temp!=0xf0){
  192.             temp=P3;
  193.             switch(temp)
  194.             {
  195.                 case 0xed:
  196.                     key=0;
  197.                     break;
  198.                 case 0xdd:
  199.                     key=1;
  200.                     break;
  201.                 case 0xbd:
  202.                     key=2;
  203.                     break;
  204.                 case 0x7d:
  205.                     key=3;
  206.                     break;
  207.             }
  208.         while(temp!=0xf0)
  209.         {
  210.             temp=P3;
  211.             temp=temp&0xf0;
  212.         }
  213.          
  214.         if(key==0&&P1==0x44){    //按鍵5:設置南北綠燈時間+

  215.             num1=value1;
  216.             if(num2!=159){ //@@@@保證交通合理,紅燈最大值計時159s,綠燈不再增加
  217.                 num1++;
  218.                 value1=num1;
  219.             }

  220.             shi1=num1/10;
  221.             ge1=num1%10;

  222.             num2=value1+value2;//顯示東西紅燈時間
  223.             shi2=num2/10;
  224.             ge2=num2%10;


  225.         }
  226.         if(key==1&&P1==0x44){    //按鍵6:設置南北黃燈時間+
  227.             num1=value2;
  228.             if(num2!=159){
  229.                 num1++;
  230.                 value2=num1;
  231.             }

  232.             shi1=num1/10;
  233.             ge1=num1%10;
  234.             num2=value1+value2;//顯示東西紅燈時間
  235.             shi2=num2/10;
  236.             ge2=num2%10;

  237.         }
  238.         if(key==2&&P1==0x44&&value1>3){    //按鍵7:設置南北綠燈時間- @@@@保證交通合理,綠燈最小值計時3s,綠燈不再減少
  239.             num1=value1;

  240.             num1--;
  241.             value1=num1;

  242.             shi1=num1/10;
  243.             ge1=num1%10;
  244.             num2=value1+value2;//顯示東西紅燈時間
  245.             shi2=num2/10;
  246.             ge2=num2%10;

  247.         }
  248.         if(key==3&&P1==0x44&&value2>3){    //按鍵8:設置南北黃燈時間-      
  249.             num1=value2;

  250.             num1--;
  251.             value2=num1;

  252.             shi1=num1/10;
  253.             ge1=num1%10;
  254.             num2=value1+value2;//顯示東西紅燈時間
  255.             shi2=num2/10;
  256.             ge2=num2%10;

  257.         }
  258.         }
  259.    
  260.     }
  261.    ////||||||||||||||||||

  262.     P3=0xfb;//第三行線
  263.     temp=P3;
  264.     temp=temp&0xf0;
  265.     if(temp!=0xf0)
  266.     {
  267.         delay(10);
  268.         temp=P3;
  269.         temp=temp&0xf0;
  270.         if(temp!=0xf0){
  271.             temp=P3;
  272.             switch(temp)
  273.             {
  274.                 case 0xeb:
  275.                     key=0;
  276.                     break;
  277.                 case 0xdb:
  278.                     key=1;
  279.                     break;
  280.                 case 0xbb:
  281.                     key=2;
  282.                     break;
  283.                 case 0x7b:
  284.                     key=3;
  285.                     break;
  286.             }
  287.         while(temp!=0xf0)
  288.         {
  289.             temp=P3;
  290.             temp=temp&0xf0;
  291.         }
  292.         if(key==0&&P1==0x44){    //按鍵9:設置東西綠燈時間+
  293.    
  294.             num2=value3;
  295.             if(num1!=159){
  296.                 num2++;
  297.                 value3=num2;
  298.             }

  299.             shi2=num2/10;
  300.             ge2=num2%10;

  301.             num1=value3+value4;//顯示南北紅燈時間
  302.             shi1=num1/10;
  303.             ge1=num1%10;



  304.         }
  305.         if(key==1&&P1==0x44){    //按鍵10:設置東西黃燈時間+
  306.             num2=value4;

  307.             if(num1!=159){
  308.                 num2++;
  309.                 value4=num2;
  310.             }

  311.             shi2=num2/10;
  312.             ge2=num2%10;
  313.             num1=value3+value4;//顯示南北紅燈時間
  314.             shi1=num1/10;
  315.             ge1=num1%10;

  316.         }
  317.         if(key==2&&P1==0x44&&value3>3){    //按鍵11:設置東西綠燈時間-
  318.             num2=value3;

  319.             num2--;
  320.             value3=num2;

  321.             shi2=num2/10;
  322.             ge2=num2%10;

  323.             num1=value3+value4;//顯示南北紅燈時間
  324.             shi1=num1/10;
  325.             ge1=num1%10;


  326.         }
  327.         if(key==3&&P1==0x44&&value4>3){    //按鍵12:設置東西黃燈時間-
  328.             num2=value4;

  329.             num2--;
  330.             value4=num2;

  331.             shi2=num2/10;
  332.             ge2=num2%10;
  333.             num1=value3+value4;//顯示南北紅燈時間
  334.             shi1=num1/10;
  335.             ge1=num1%10;


  336.         }
  337.         }
  338.    
  339.     }

  340.     P3=0xf7;//第四行線          2未用
  341.     temp=P3;
  342.     temp=temp&0xf0;
  343.     if(temp!=0xf0)
  344.     {
  345.         delay(10);
  346.         temp=P3;
  347.         temp=temp&0xf0;
  348.         if(temp!=0xf0){
  349.             temp=P3;
  350.             switch(temp)
  351.             {
  352.                 case 0xe7:
  353.                     key=0;
  354.                     break;
  355.                 case 0xd7:
  356.                     key=1;
  357.                     break;
  358.                 case 0xb7:
  359.                     key=2;
  360.                     break;
  361.                 case 0x77:
  362.                     key=3;
  363.                     break;
  364.             }
  365.         while(temp!=0xf0)
  366.         {
  367.             temp=P3;
  368.             temp=temp&0xf0;
  369.         }
  370.         if(key==0&&P1==0x44){    //按鍵13:南北緊急情況:南北綠燈常亮 東西紅燈常亮
  371.             P1=0x41;
  372.             shi1=ge1=shi2=ge2=18;   

  373.         }
  374.         if(key==1&&P1==0x44){    //按鍵14:東西緊急情況:東西綠燈常亮 南北紅燈常亮
  375.             P1=0x14;
  376.             shi1=ge1=shi2=ge2=18;   
  377.         }
  378.         if(key==2&&P1==0x44){//按鍵15:
  379.             
  380.         }
  381.         if(key==3&&P1==0x44){//按鍵16:
  382.             
  383.         }
  384.         }
  385.    
  386.     }



  387. }
  388. void T0_time() interrupt 1     //定時器T0 中斷子程序
  389. {
  390.     TH0=(65536-45872)/256;
  391.     TL0=(65536-45872)%256;
  392.     num++;
  393. }
  394. </font>
復制代碼

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:297634 發表于 2018-3-30 00:13 | 只看該作者
獲益良多!!
回復

使用道具 舉報

板凳
ID:411657 發表于 2018-10-18 18:35 | 只看該作者
想獲得全部代碼
回復

使用道具 舉報

地板
ID:447674 發表于 2018-12-17 09:17 | 只看該作者
樓主學的是否是通用式單片機
回復

使用道具 舉報

5#
ID:552378 發表于 2019-6-10 10:32 | 只看該作者
要是有仿真文件就好了,自己連的仿真有點小問題
回復

使用道具 舉報

6#
ID:728994 發表于 2020-4-14 14:55 來自手機 | 只看該作者
想要全部代碼
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 精品久久久一区 | 涩涩视频在线观看免费 | 国产精品久久久久国产a级 欧美日韩国产免费 | 免费看黄视频网站 | sese视频在线观看 | 狠狠干综合视频 | 久久久久久久一区 | 四虎影视免费观看 | 亚洲成人午夜在线 | 欧美午夜精品久久久久免费视 | 国产乱码精品1区2区3区 | 亚洲国产精品成人综合久久久 | 无码一区二区三区视频 | 亚洲成网| 精品国产99| 99这里只有精品视频 | 熟女毛片 | 国产大学生情侣呻吟视频 | 日韩一区二区在线观看 | 在线日韩中文字幕 | 黄免费观看视频 | 免费看一级毛片 | 亚洲国产欧美在线 | 亚洲黄色高清视频 | 欧美精品99 | 成人av网页 | 久久亚洲一区二区三区四区 | 精品国产成人 | 国产精品99久久久久久宅男 | 全免费a级毛片免费看视频免费下 | 中文字幕一级毛片视频 | 国产在线播放一区二区三区 | 国产成人久久av免费高清密臂 | 欧美日高清 | 亚洲国产欧美精品 | 日韩精品欧美精品 | 亚洲一区不卡在线 | 成人中文字幕在线 | 亚洲精品日日夜夜 | 成人精品一区二区三区中文字幕 | 国产乱码高清区二区三区在线 |