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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 3807|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

交通燈仿真工程+程序-帶按鍵-LED數(shù)碼管顯示數(shù)值

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
交通燈,僅供參考!

交通燈仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)



單片機(jī)源程序如下:
  1. #include <reg52.h>
  2. bit red,green,yellow,turnred;          //定義紅、黃、綠及轉(zhuǎn)紅標(biāo)志
  3. code unsigned char tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  4.                                         0x7f,0x6f}; //共陰極數(shù)碼管碼表
  5. #define  LIGHT P0
  6. #define  SEG P1
  7. #define  BITR P2
  8. unsigned char Dis_Shiwei;//定義十位
  9. unsigned char Dis_Gewei; //定義個(gè)位
  10. unsigned char second,count=0; //初值60

  11. #define uchar unsigned char
  12. #define uint unsigned int

  13. sbit add=P3^3;                                 //定義東西綠燈時(shí)間加按鍵
  14. sbit sub=P3^4;                                 //定義東西綠燈時(shí)間減按鍵
  15. sbit K1=P3^1;                                 //定義設(shè)定時(shí)間按鍵
  16. sbit add2=P3^5;                             //定義調(diào)南北綠燈時(shí)間加按鍵
  17. sbit sub2=P3^6;                             //定義調(diào)南北綠燈時(shí)間減按鍵


  18. unsigned char timeDX=13,timeNB=15; //定義東西和南北綠燈亮?xí)r可調(diào)變量并賦予初值2S

  19. void delay(unsigned int cnt)          //用于動(dòng)態(tài)掃描數(shù)碼管的延時(shí)程序
  20.         {
  21.         while(--cnt);
  22.         }
  23. /*********************************延時(shí)子程序*************************************/
  24. void DelayMS(unsigned int x)                  //延時(shí)ms
  25. {
  26.     unsigned char t;
  27.     while(x--)
  28.     {
  29.         for(t=120;t>0;t--);
  30.     }
  31. }



  32. void key_scan( )
  33. {
  34.         uchar s1num=0;                        //s1num記錄光標(biāo)的位置的編號(hào)
  35.         
  36.         if(K1==0)
  37.         {
  38.                 DelayMS(5);
  39.                 if(K1==0)
  40.                 {
  41.                         while(!K1);          //menum測(cè)試到由0到1的變化,也就是按下松開(kāi)的變化,s1num加1
  42.                         s1num++;
  43.                         while(1)
  44.                         {
  45.                                 if(K1==0)
  46.                                 {
  47.                                 DelayMS(5);
  48.                                 if(K1==0)
  49.                                 {
  50.                                 while(!K1);
  51.                                 s1num++;        //menum測(cè)試到由0到1的變化,也就是按下松開(kāi)的變化,s1num再加1
  52.                                 }
  53.                                 }

  54.                
  55.                
  56.                                 if(s1num==1)
  57.                                 {
  58.                         
  59.                         

  60.                 while(add==0)                                    //如果第一個(gè)按鍵按下東西方向綠燈延續(xù)時(shí)間加1秒
  61.                                         {
  62.                                             DelayMS(10);
  63.                                                 while(add==0);
  64.                                                 timeDX++;
  65.                                                 if(timeDX>60)   //當(dāng)時(shí)間超過(guò)60秒將時(shí)間置為60秒
  66.                                                 {timeDX=0;}

  67.                                                 Dis_Shiwei=tab[timeDX/10];//十位顯示值處理
  68.                                                 Dis_Gewei=tab[timeDX%10]; //個(gè)位顯示處理  


  69.                                         }
  70.                         while(sub==0)                                   //如果第二個(gè)按鍵按下東西方向綠燈延續(xù)時(shí)間減1秒
  71.                                         {        
  72.                                                 DelayMS(10);
  73.                                                 while(sub==0);
  74.                                                 timeDX--;
  75.                                                 if(timeDX<=0)           //當(dāng)時(shí)間減到小于或等于0時(shí)將時(shí)間置為1秒
  76.                                                 {timeDX=60;}

  77.                                                 Dis_Shiwei=tab[timeDX/10];//十位顯示值處理
  78.                                                 Dis_Gewei=tab[timeDX%10]; //個(gè)位顯示處理  



  79.                                         }
  80.                     while(add2==0)                                   //如果第三個(gè)按鍵按下南北方向綠燈延續(xù)時(shí)間加1秒
  81.                                         {        
  82.                                                 DelayMS(10);
  83.                                                 while(add2==0);
  84.                                                 timeNB++;
  85.                                                 if(timeNB>60)   //當(dāng)時(shí)間超過(guò)60秒將時(shí)間置為60秒
  86.                                                 {timeNB=0;}

  87.                                                  Dis_Shiwei=tab[timeNB/10];//十位顯示值處理
  88.                         Dis_Gewei=tab[timeNB%10]; //個(gè)位顯示處理



  89.                                         }
  90.                         while(sub2==0)                                   //如果第四個(gè)按鍵按下南北方向綠燈延續(xù)時(shí)間減1秒
  91.                                         {                                          
  92.                                                 DelayMS(10);
  93.                                                 while(sub2==0);
  94.                                                 timeNB--;
  95.                                                 if(timeNB<=0)           //當(dāng)時(shí)間減到小于或等于0時(shí)將時(shí)間置為1秒
  96.                                                 {timeNB=60;}

  97.                                                  Dis_Shiwei=tab[timeNB/10];//十位顯示值處理
  98.                         Dis_Gewei=tab[timeNB%10]; //個(gè)位顯示處理

  99.                                            }
  100.                                 }

  101.                                 if(s1num==2)
  102.                                 {

  103.                                 s1num=0;//s1num清零//
  104.                                 break;
  105.                                 }
  106.                         }
  107.                 }
  108.         }
  109. }

  110. void LINGHTLED( )

  111. {
  112.         if (count==100)
  113.             {
  114.             count=0;
  115.             second--;//秒減1
  116.                 if(second==0)
  117.             { //這里添加定時(shí)到0的代碼 ,可以是燈電路,繼電器吸合等,或者執(zhí)行一個(gè)程序
  118.                         if(red)   //紅滅,先轉(zhuǎn)黃
  119.                         {
  120.                                 red=0;
  121.                                 yellow=1;
  122.                                 second=4;
  123.                                 LIGHT=0xdd;//黃燈亮4秒,黃燈為過(guò)渡燈,再根據(jù)情況轉(zhuǎn)綠或轉(zhuǎn)紅
  124.                         while(K1==0);        

  125.                         }
  126.             else if(yellow && !turnred)
  127.                                         {
  128.                                         yellow=0;
  129.                                         green=1;
  130.                                         second=timeDX;
  131.                                         LIGHT=0xf3;//綠燈亮25秒,
  132.                                 while(K1==0);        
  133.                                         }
  134.                                 else if(green)
  135.                                                 {
  136.                                                 yellow=1;
  137.                                                 green=0;
  138.                                                 second=4;
  139.                                                 LIGHT=0xeb;//黃燈亮4秒
  140.                                         while(K1==0);        
  141.                                                 turnred=1;

  142.                                                 }
  143.                                                 else if(yellow && turnred)   //綠燈滅,轉(zhuǎn)黃燈,后紅燈,turnred=1時(shí)
  144.                                                         {
  145.                                                         red=1;
  146.                                                         yellow=0;
  147.                                                         LIGHT=0xde;//紅燈亮60秒
  148.                                                 while(K1==0);        
  149.                                                         second=timeNB;
  150.                                                         turnred=0;   //接下來(lái)是轉(zhuǎn)黃,綠。
  151.                                                         }
  152.              }

  153.         }

  154.         Dis_Shiwei=tab[second/10];//十位顯示值處理
  155.         Dis_Gewei=tab[second%10]; //個(gè)位顯示處理  







  156. }


  157. void inti( )
  158. {

  159.         TMOD |=0x11;//定時(shí)器設(shè)置 10ms in 12M crystal定時(shí)器0,工作方式1,16位定時(shí)器
  160.         TH0=0xd8;            //65535-10000=55535=D8F0(十六進(jìn)制)
  161.         TL0=0xf0;
  162.         IE= 0x8A; //中斷控制,EA=1開(kāi)總中斷,ET0=1:定時(shí)器0中斷允許
  163.         IP=0x02;
  164.         TR0=1;    //開(kāi)定時(shí)器0中斷
  165. TR1=1;    //開(kāi)定時(shí)器0中斷


  166. }



  167. void main()
  168. {

  169.         
  170. inti( );


  171.         LIGHT=0xde;//紅燈亮,根據(jù)紅黃綠接燈的順序。
  172.         red =1;
  173.    second=timeDX;

  174.         while(1)
  175.         {


  176.          key_scan();//鍵盤(pán)掃描程序


  177.    
  178.    LINGHTLED( );






  179.         }
  180. }

  181. /********************************/
  182. /*      定時(shí)中斷                */
  183. /********************************/
  184. void tim(void) interrupt 1
  185. {

  186.         TH0=(65536-10000)/256;//重新賦值,10毫秒定時(shí)
  187.         TL0=(65536-10000)%256;;               
  188.         count++;
  189. }


  190. /********************************/
  191. /*      定時(shí)中斷                */
  192. /********************************/
  193. void tim2(void) interrupt 3
  194. {
  195.         TR1=0;
  196.    TH1=(65536-5000)/256;//重新賦值,5毫秒定時(shí)
  197.         TL1=(65536-5000)%256;;                        
  198.         

  199.         BITR=0xfE;
  200.         SEG=Dis_Shiwei;//顯示十位,這里實(shí)現(xiàn)用8位數(shù)碼管,即左1位
  201.         delay(30);//短暫延時(shí)
  202.         BITR=0XfD;
  203.         SEG=Dis_Gewei; //顯示個(gè)位,左數(shù),2位
  204.         delay(30);

  205.         TR1=1;
  206. …………
  207. …………
  208. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
交通燈.rar (53.16 KB, 下載次數(shù): 49)


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

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 国产在线中文字幕 | 狠狠躁天天躁夜夜躁婷婷老牛影视 | 男女免费观看在线爽爽爽视频 | 伊人免费在线观看 | 先锋av资源在线 | 久久噜噜噜精品国产亚洲综合 | 亚洲国产一区二区三区, | 婷婷色国产偷v国产偷v小说 | 精品久久久久久久 | 亚洲一区二区三区在线视频 | av网站免费 | 久久精品中文 | 国产精品免费一区二区三区四区 | 怡红院成人在线视频 | 新超碰97 | 一级毛片视频在线观看 | 黄一区二区三区 | 国产精品久久久久久久久久久免费看 | 日日夜夜精品视频 | 天天躁日日躁性色aⅴ电影 免费在线观看成年人视频 国产欧美精品 | 高清av电影| 欧美一级二级三级视频 | 91丨九色丨国产在线 | 亚洲三区在线 | 午夜久草 | 精品亚洲二区 | 国产日产精品一区二区三区四区 | 欧美日韩亚洲视频 | 91传媒在线观看 | 国产日韩欧美一区二区 | 久久久综合网 | 久久久www成人免费精品 | 国产一级片精品 | 91精品国产乱码久久久久久久久 | 日韩精品专区在线影院重磅 | 涩涩鲁亚洲精品一区二区 | 亚洲国产精品人人爽夜夜爽 | 91精品久久久久久久久久 | 亚洲综合在线一区二区 | 成人精品视频 | 日韩精品久久一区 |