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

QQ登錄

只需一步,快速開始

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

交通燈系統(tǒng) 原理圖,PCB(AD格式)單片機(jī)程序都有

[復(fù)制鏈接]
ID:140725 發(fā)表于 2017-3-22 18:35 | 顯示全部樓層 |閱讀模式
51單片機(jī)左的交通燈控制系統(tǒng) 原理圖,PCB,程序都有.

交通燈的原理圖(ad畫的 需要用ad打開,里面也有pdf版本)
182915t26d6lvjlv6mtjyw.png
交通燈的pcb圖(有2個(gè)版本):
182550arbqjspkccqgq1p7.png 182413zhommbtvhszbg2mh.png

交通燈的單片機(jī)源程序:
  1. #include<reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. sbit dongxi_red=P1^3;                                        //東西方向紅燈定義
  5. sbit dongxi_yellow=P3^6;                                //東西方向黃燈定義
  6. sbit dongxi_green=P3^7;                                        //東西方向綠燈定義
  7. sbit nanbei_red=P1^2;                                        //南北方向紅燈定義
  8. sbit nanbei_yellow=P1^1;                                //南北方向黃燈定義
  9. sbit nanbei_green=P1^0;                                        //南北方向綠燈定義
  10. uchar tab[]={0xbf,0x7f,0xef,0xdf};                //數(shù)碼管位選
  11. uchar IRtime;                                                        //紅外解碼時(shí)間次數(shù)
  12. uchar IRbyte[4];                                                //紅外一字節(jié)
  13. uchar IRdate[33];                                                //紅外數(shù)據(jù)碼,用戶碼,停止碼共33位
  14. uchar IRbyte_ok,IRdate_ok;                                //接收一字節(jié)完成標(biāo)志位,解碼完成標(biāo)志位

  15. bit flag=0;
  16. uchar num=45,num1=40,shi,ge,shi1,ge1,i;
  17. uchar table[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//共陰數(shù)碼管段選

  18. void delay(uchar z)                                //延時(shí)
  19. {
  20.         uchar k,l;
  21.         for(k=0;k<110;k++)
  22.                 for(l=0;l<z;l++);
  23. }

  24. void dongxi__red()           //東西方向紅燈亮,黃綠燈都滅,南北方向綠燈亮,紅黃燈滅
  25. {
  26.         dongxi_red=0;
  27.         dongxi_yellow=1;
  28.         dongxi_green=1;
  29.         nanbei_red=1;
  30.         nanbei_yellow=1;
  31.         nanbei_green=0;
  32. }

  33. void nanbei__yellow()  //東西方向紅燈亮,黃綠燈都滅,南北方向黃燈亮,紅綠燈滅
  34. {
  35.         dongxi_red=0;
  36.         dongxi_yellow=1;
  37.         dongxi_green=1;
  38.         nanbei_red=1;
  39.         nanbei_yellow=0;
  40.         nanbei_green=1;
  41. }

  42. void nanbei__red()          //南北方向紅燈亮,黃綠燈都滅,東西方向綠燈亮,紅黃燈滅
  43. {
  44.         dongxi_red=1;
  45.         dongxi_yellow=1;
  46.         dongxi_green=0;
  47.         nanbei_red=0;
  48.         nanbei_yellow=1;
  49.         nanbei_green=1;
  50. }

  51. void dongxi__yellow()  //南北方向紅燈亮,黃綠燈都滅,東西方向黃燈亮,紅綠燈滅
  52. {
  53.         dongxi_red=1;
  54.         dongxi_yellow=0;
  55.         dongxi_green=1;
  56.         nanbei_red=0;
  57.         nanbei_yellow=1;
  58.         nanbei_green=1;
  59. }

  60. void number(uchar num,num1)                   //兩個(gè)數(shù)碼管分別求個(gè)位和十位
  61. {
  62.         shi=num/10;
  63.         ge=num%10;
  64.         shi1=num1/10;
  65.         ge1=num1%10;
  66. }

  67. void display(uchar shi,ge)                  //數(shù)碼管顯示
  68. {
  69.         P2=tab[1];
  70.         P0=0x00;
  71.         P0=table[shi];
  72.         delay(5);

  73.         P2=tab[0];
  74.         P0=0x00;
  75.         P0=table[ge];
  76.         delay(5);
  77. }

  78. void display1(uchar shi1,ge1)         //數(shù)碼管顯示
  79. {
  80.         P2=tab[3];
  81.         P0=0x00;
  82.         P0=table[shi1];
  83.         delay(5);

  84.         P2=tab[2];
  85.         P0=0x00;
  86.         P0=table[ge1];
  87.         delay(5);
  88. }

  89. void start()                           //定時(shí)器0、1,外中斷0初始化
  90. {
  91.         EA=1;
  92.         EX0=1;
  93.         EX1=1;
  94.         IT0=1;
  95.         IT1=1;
  96.         ET0=ET1=1;
  97.         TMOD=0X21;                 
  98.         TH1=0X00;
  99.         TL1=0X00;
  100.         TH0=(65536-50000)/256;
  101.         TL0=(65536-50000)%256;
  102.         TR0=TR1=1;
  103. }

  104. void first()                                //一開始東西方向亮紅燈45秒,南北綠燈40秒
  105. {
  106.         if(num>5)
  107.                 {
  108.                         dongxi__red();
  109.                         number(num,num1);
  110.                         display(shi,ge);
  111.                         display1(shi1,ge1);
  112.                 }
  113.                 if(num<=5)                        //南北綠燈亮完了亮黃燈5秒
  114.                 {
  115.                         nanbei__yellow();
  116.                         number(num,num1);
  117.                         display(shi,ge);
  118.                         display1(shi1,ge1);
  119.                         if(num==0){num=45;num1=40;flag=1;}
  120.                 }
  121. }

  122. void second()                                //南北紅燈45秒,東西綠燈40秒
  123. {
  124.         if(num>5)
  125.                 {
  126.                         nanbei__red();
  127.                         number(num1,num);
  128.                         display(shi,ge);
  129.                         display1(shi1,ge1);
  130.                 }
  131.                         if(num<=5)                //東西綠燈結(jié)束,亮黃燈5秒
  132.                         {
  133.                                 dongxi__yellow();
  134.                                 number(num1,num);
  135.                                 display(shi,ge);
  136.                                 display1(shi1,ge1);
  137.                                 if(num==0){num=45;num1=40;flag=0;}
  138.                         }                        
  139. }

  140. void all_red()                           //雙向禁行,亮紅燈,數(shù)碼管關(guān)閉
  141. {
  142.         dongxi_red=0;
  143.         dongxi_yellow=1;
  144.         dongxi_green=1;
  145.         nanbei_red=0;
  146.         nanbei_yellow=1;
  147.         nanbei_green=1;
  148.         P2=0x00;
  149.         P0=0x00;
  150. }

  151. void nanbei_all_red()           //南北方向禁行,亮紅燈數(shù)碼管關(guān)閉,東西方向正常工作
  152. {
  153.         for(num=45;num>0;)
  154.         {
  155.                 dongxi_red=0;
  156.                 dongxi_yellow=1;
  157.                 dongxi_green=1;
  158.                 nanbei_red=0;
  159.                 nanbei_yellow=1;
  160.                 nanbei_green=1;
  161.                 number(num,num1);
  162.                 display(shi,ge);
  163.         }
  164.         for(num=40;num>0;)
  165.         {
  166.                 nanbei__red();
  167.                 number(num,num1);
  168.                 display(shi,ge);
  169.         }
  170.         for(num=5;num>0;)
  171.         {
  172.                 dongxi__yellow();
  173.                 number(num,num1);
  174.                 display(shi,ge);
  175.         }
  176.         
  177. }

  178. void dongxi_all_red()                 //東西方向禁行,亮紅燈數(shù)碼管關(guān)閉,南北方向正常工作
  179. {
  180.         for(num=45;num>0;)
  181.         {
  182.                 dongxi_red=0;
  183.                 dongxi_yellow=1;
  184.                 dongxi_green=1;
  185.                 nanbei_red=0;
  186.                 nanbei_yellow=1;
  187.                 nanbei_green=1;
  188.                 number(num,num1);
  189.                 display1(shi,ge);
  190.         }
  191.         for(num=40;num>0;)
  192.         {
  193.                 dongxi__red();
  194.                 number(num,num1);
  195.                 display1(shi,ge);
  196.         }
  197.         for(num=5;num>0;)
  198.         {
  199.                 nanbei__yellow();
  200.                 number(num,num1);
  201.                 display1(shi,ge);
  202.         }
  203.         
  204. }

  205.                                                                   
  206. void jiema()                          //紅外解碼
  207. {
  208.         uchar i,j,k=1;
  209.         for(i=0;i<4;i++)
  210.         {
  211.                 for(j=0;j<8;j++)
  212.                 {
  213.                         if(IRdate[k]>5)
  214.                                 IRbyte[i] |=0x80;
  215.                         if(j<7)
  216.                                 IRbyte[i]>>=1;
  217.                         k++;
  218.                 }
  219.         }
  220.         IRbyte_ok=1;
  221. }

  222. void display2()                         //比對(duì)收到的信號(hào)
  223. {
  224.         switch(IRbyte[2])         
  225.         {
  226.                 case 0x45 :while(1) all_red();                 //按下該鍵兩個(gè)方向都持續(xù)亮紅燈
  227.             case 0x46 :while(1) dongxi_all_red();          //按下該鍵東西方向持續(xù)亮紅燈
  228.             case 0x47 :while(1) nanbei_all_red();           //按下該鍵南北方向持續(xù)亮紅燈
  229.         }  
  230. }


  231. void main()
  232. {
  233.         start();                          //初始化
  234.         while(1)
  235.         {        
  236.                 if(!flag)
  237.                 first();
  238.                 if(flag)
  239.                 second();
  240.                 if(IRdate_ok)                          //紅外接收完成
  241.                 {
  242.                         jiema();                           //解碼
  243.                         IRdate_ok=0;                   //標(biāo)志位清零
  244.                         if(IRbyte_ok)                   //如果解碼完成,做相關(guān)指令
  245.                         {
  246.                                 display2();
  247.                                 IRbyte_ok=0;            //解碼完成標(biāo)志清零
  248.                         }
  249.                 }
  250.         }
  251. }

  252. void ex0() interrupt 0                           //外中斷0用來接收紅外脈沖
  253. {
  254.         static uchar i;                                   //靜態(tài)變量i
  255.         static bit flag;
  256.         if(flag)                                           //如果flag為1執(zhí)行一下操作
  257.         {                                 
  258.                 if((IRtime<53)&&(IRtime>=32))        //IRtime在此范圍內(nèi)說明接收到紅外起始信號(hào)           
  259.                 i=0;
  260.                 IRdate[i]=IRtime;                                //將IRtime的值保存到數(shù)組中
  261.                 IRtime=0;
  262.                 i++;
  263.                 if(i==33)                                                //如果i=33接收到停止位
  264.                 {
  265.                         i=0;
  266.                         IRdate_ok=1;
  267.                 }
  268.         }
  269.         else                                                                //flag不為1時(shí)執(zhí)行
  270.         {
  271.                 IRtime=0;                                                //IRtime數(shù)值清零
  272.                 flag=1;                                                        //flag置1
  273.         }
  274. }

  275. void et0() interrupt 1                                        //定時(shí)器0用來控制交通燈的時(shí)間
  276. {
  277.         TH0=(65536-50000)/256;                                //重裝初值
  278.         TL0=(65536-50000)%256;
  279.         i++;
  280.         if(i==20)
  281.         {
  282.                 i=0;
  283.                 num--;
  284.                 num1--;
  285.                 if(num1==0)
  286.                 num1=5;
  287.         }
  288. }


  289. void time0() interrupt 3                                //定時(shí)器1用來計(jì)算收到的紅外脈寬

  290. …………余下代碼請(qǐng)下載附件…………
復(fù)制代碼


182724l94x9jcm3sm6zodj.png

交通燈源碼和pcb原理圖資料下載:http://www.torrancerestoration.com/bbs/dpj-54314-1.html


回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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