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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 8915|回復: 4
收起左側

51單片機交通燈仿真與實物 源程序注釋十分詳細

  [復制鏈接]
ID:208154 發表于 2017-6-5 19:52 | 顯示全部樓層 |閱讀模式
51單片機交通燈的實物圖:
0.png 0.png

本proteus仿真文件是proteus7.4版本創建的,請用7.4版本或更高版本打開,較低版本可能出現無法打開的現象。
0.png

0.png 0.png

單片機源程序如下:
  1. /***************51單片機交通燈設計*******************/

  2. #include <reg52.h>
  3. #include <intrins.h>
  4. #define        uint unsigned int
  5. #define uchar unsigned char
  6. uchar night_flag=0;                                //深夜標志位
  7. uchar time_cl=0;                                //定義時間控制標志位  取0        
  8. uchar flag=0;                                        //方向通行標志位
  9. uchar B_N_D_flag=1;                                //定義北南通燈行標志位
  10. uchar X_D_D_flag=1;                                //定義西東通燈行標志位
  11. uchar i,j;                                                //定義變量i
  12. uchar t=3;                                                //數碼管動態掃描延時時間基數
  13. uchar num=0;                                        //時間基數初始化為0
  14. //uchar num_night=0;                                //深夜模式時間基數為0
  15. uchar time=30;                                        //time初始化定為30秒
  16. int bei,nan,xi,dong;            //定義  北  南  西  東
  17. uchar code Data[]={0x18,0x7B,0x89,0x49,0x6A,0x4C,0x0C,0x79,0x08,0x48,0xEF};
  18. //定義數組  數碼管   0    1    2    3    4    5    6    7    8    9    -
  19. /***************定義  紅黃綠燈**************/
  20. sbit    B_R=P1^2;                                //北面  紅燈
  21. sbit    B_Y=P1^1;                                //北面  黃燈
  22. sbit    B_G=P1^0;                                //北面        綠燈
  23. sbit    N_R=P2^0;                                //南面        紅燈
  24. sbit    N_Y=P2^1;                                //南面        黃燈
  25. sbit        N_G=P2^2;                                //南面        綠燈
  26. sbit    X_R=P2^5;//西面        紅燈
  27. sbit    X_Y=P2^6;                                //西面        黃燈
  28. sbit    X_G=P2^7;                                //西面        綠燈

  29. sbit    D_R=P3^7;                                //東面  紅燈
  30. sbit    D_Y=P3^6;                                //東面        黃燈
  31. sbit    D_G=P3^5;                                //東面  綠燈

  32. sbit    s1=P3^4;//時間減
  33. sbit    s2=P3^3;//時間加
  34. sbit    s3=P3^1;//白天和夜間模式控制切換口
  35. sbit    s4=P3^2;//進入時間可以設置狀態的切換口
  36. /***************定義  數碼管*****************/
  37. #define        SMG_XS        P0                                //數碼管數據顯示
  38. #define        SMG_KZ        P2                                //數碼管控制顯示
  39. sbit   smg1=P2^4;//定義數碼管1控制口
  40. sbit   smg2=P2^3;//定義數碼管2控制口
  41. void delay(uint time);// 定義延時程序
  42. void disp_init();//顯示初始化
  43. void disp(bei,nan,xi,dong);




  44. void Time0_init()                                //定時器0初始化函數
  45. {
  46.         TMOD=0x01;                                        //定時器0為方式1
  47.         TL0=(65536-50000)%256;
  48.         TH0=(65536-50000)/256;                //12M晶振 定時時間50ms
  49.         ET0=1;                                                //開定時器0中斷
  50.         EA=1;                                                //開總中斷
  51.         TR0=1;                                                //啟動定時器0
  52. }

  53. void night_mode()                                //深夜模式
  54. {
  55.         B_R=1;
  56.         B_Y=~B_Y;                                        //北 黃燈取反
  57.         B_G=1;
  58.         N_R=1;
  59.         N_Y=~N_Y;                                        //南 黃燈取反
  60.         N_G=1;

  61.         X_R=1;                                       
  62.         X_Y=~X_Y;                                        //西 黃燈取反
  63.         X_G=1;
  64.         D_R=1;
  65.         D_Y=~D_Y;                                        //東 黃燈取反
  66.         D_G=1;        
  67. }

  68. void B_N_G()                                        //北南通(綠燈)  西東(紅燈)                        
  69. {
  70.         B_G=0;                                                //北  綠燈亮
  71.         N_G=0;                                                //南  綠燈亮
  72.         B_R=1;
  73.         B_Y=1;
  74.         N_R=1;
  75.         N_Y=1;

  76.         X_R=0;                                                //西  紅燈亮
  77.         D_R=0;                                                //東  紅燈亮
  78.         X_Y=1;
  79.         X_G=1;
  80.         D_Y=1;
  81.         D_G=1;
  82. }

  83. void X_D_G()                                        //西東通(綠燈)  北南(紅燈)                        
  84. {
  85.         B_G=1;
  86.         N_G=1;
  87.         B_R=0;                                                //北  紅燈亮
  88.         B_Y=1;
  89.         N_R=0;                                                //南  紅燈亮
  90.         N_Y=1;

  91.         X_R=1;
  92.         D_R=1;
  93.         X_Y=1;
  94.         X_G=0;                                                //西  綠燈亮
  95.         D_Y=1;
  96.         D_G=0;                                                //東  綠燈亮
  97. }

  98. void B_N_tong()                                        //北南 通行
  99. {
  100.         if(B_N_D_flag==1)                        //當北南通燈行標志位為1
  101.         {
  102.                 B_N_G();                                //北南通(綠燈)  西東(紅燈)
  103.                 B_N_D_flag=0;                        //北南通燈行標志位置0
  104.         }
  105.         while(num==20)                                //當1s時間到
  106.         {
  107.                 num=0;                                        //num清0
  108.                 bei--;                                        //北時間 減1
  109.                 nan--;                                        //南時間 減1
  110.                 xi--;                                        //西時間 減1
  111.                 dong--;                                        //東時間 減1
  112.                 if(bei<=6&&bei>=0||nan<=6&&nan>=0)                //當北和南時間在0到6秒之間
  113.                 {
  114.                         if(bei<=6&&bei>3||nan<=6&&nan>3)        //進一步判斷北和南時間是否在3到6秒之間
  115.                         {
  116.                                 B_G=~B_G;                                                //北  綠燈取反
  117.                                 N_G=~N_G;                                                //南  綠燈取反
  118.                         }
  119.                         if(bei<=3&&nan<=3)                                        //進一步判斷北和南時間是否在3秒以內
  120.                         {
  121.                                 B_G=1;                                                        //北  綠燈不亮
  122.                                 N_G=1;                                                        //南  綠燈不亮
  123.                                 B_Y=0;                                                        //北  黃燈亮
  124.                                 N_Y=0;                                                        //南  黃燈亮
  125.                         }
  126.                 }
  127.                 else                                                                        //否則(即北和南時間不在0到6秒之間)
  128.                 {
  129.                         B_G=0;                                                                //北  綠燈亮
  130.                         N_G=0;                                                                //南  綠燈亮
  131.                         B_Y=1;                                                                //北  黃燈不亮
  132.                         N_Y=1;                                                                //南  黃燈不亮
  133.                 }
  134.         }
  135. }

  136. void X_D_tong()                                                                        //西東  通行
  137. {
  138.         if(X_D_D_flag==1)                                                        //當西東通燈行標志位為1
  139.         {
  140.                 X_D_G();                                                                //西東通(綠燈)  北南(紅燈)
  141.                 X_D_D_flag=0;                                                        //西東通燈行標志位置0
  142.         }
  143.         while(num==20)                                                                //當1s時間到
  144.         {
  145.                 num=0;                                                                        //num清0
  146.                 bei--;                                                                        //北時間 減1
  147.                 nan--;                                                                        //南時間 減1               
  148.                 xi--;                                                                        //西時間 減1
  149.                 dong--;                                                                        //東時間 減1        
  150.                 if(xi<=6&&xi>=0||dong<=6&&xi>=0)                //當西和東時間在0到6秒之間
  151.                 {
  152.                         if(xi<=6&&xi>3||dong<=6&&dong>3)        //進一步判斷西和東時間是否在3到6秒之間
  153.                         {
  154.                                 X_G=~X_G;                                                //西  綠燈取反
  155.                                 D_G=~D_G;                                                //東  綠燈取反
  156.                         }
  157.                         if(xi<=3&&dong<=3)                                        //進一步判斷西和東時間是否在3秒以內
  158.                         {
  159.                                 X_G=1;                                                        //西  綠燈不亮
  160.                                 D_G=1;                                                        //東  綠燈不亮
  161.                                 X_Y=0;                                                        //西  黃燈亮
  162.                                 D_Y=0;                                                        //東  黃燈亮
  163.                         }
  164.                 }
  165.                 else                                                                        //否則(即西和東時間不在0到6秒之間)
  166.                 {
  167.                         X_G=0;                                                                //西  綠燈亮
  168.                         D_G=0;                                                                //東  綠燈亮
  169.                         X_Y=1;                                                                //西  黃燈不亮
  170.                         D_Y=1;//東  黃燈不亮        
  171.                 }
  172.         }               
  173. }

  174. void Time0() interrupt 1                                                //定時器0中斷服務函數
  175. {
  176.         TH0=(65536-50000)/256;                                                //重新載裝初值,設置50ms中斷一次
  177.         TL0=(65536-50000)%256;
  178.         num++;                                                                                //時間基數加1
  179. }
  180.                
  181. void main()                                                                                //主函數入口                                                                                       
  182. {
  183.         bei=nan=xi=dong=time;                                                //把time值賦給北 南 西 東
  184.         disp_init();                        //顯示初始化
  185.         Time0_init();                //定時器0初始化函數               
  186.         while(1)                //無限循環
  187.         {  
  188.                 if(s4==0)                                                                //當P3.0按下(調整時間允許鍵)
  189.                 {
  190.                         delay(5);                                                        //延時去抖
  191.                         s4=1;                                                //關閉數碼管顯示
  192.                         if(s4==0)                                                    //再次確定按鍵是否按下
  193.                         {
  194.                                 time_cl=~time_cl;//時間控制標志位取反(開/關時間控制標志位)        
  195.                                 if(time_cl==0)                                        //如果時間控制標志位為0
  196.                                 {
  197.                                         TL0=(65536-50000)%256;
  198.                                         TH0=(65536-50000)/256;                //12M晶振 定時時間50ms
  199.                                         TR0=1;                                                //開啟定時器0
  200.                                         num=0;                                                //num初始化為0        
  201.                                 }        
  202.                         }        
  203.                         while(s4==0);                                                //等待按鍵松開
  204.                 }
  205.                
  206.                 if(s3==0)                                                                //當P3.7按下(開/關 深夜模式)
  207.                 {
  208.                         delay(5);                                                        //延時去抖
  209.                     s3=1;                                                //關閉數碼管顯示
  210.                         if(s3==0)
  211.                         {
  212.                                 night_flag=~night_flag;                        //深夜標志位取反(開/關深夜模式),1表示開,0表示關
  213.                                 if(night_flag==1)                                //如果深夜模式開
  214.                                 {
  215.                                         TR0=0;                                                //關閉定時器0
  216.                                         num=0;                                                //時間基數清0
  217.                                         TL0=(65536-50000)%256;
  218.                                         TH0=(65536-50000)/256;                //12M晶振 定時時間50ms
  219.                                         TR0=1;                                                //開啟定時器0
  220.                                         SMG_KZ=0xff;                                //關閉數碼管顯示        
  221.                                 }
  222.                                 else                                                         //否則night_flag=0表示深夜模式關(紅綠燈正常運行)                                       
  223.                                 {
  224.                                         TR0=0;                                                //關閉定時器0
  225.                                         num=0;                                                //時間基數清0
  226.                                         TL0=(65536-50000)%256;
  227.                                         TH0=(65536-50000)/256;                //12M晶振 定時時間50ms
  228.                                         TR0=1;                                                //開啟定時器0
  229.                                         B_N_D_flag=1;                                //定義北南通燈行標志位
  230.                                         X_D_D_flag=1;                                //定義西東通燈行標志位        
  231.                                         if(bei<=3&&nan<=3)                        //判斷北和南時間是否在3秒以內
  232.                                         {
  233.                                                 B_Y=1;
  234.                                                 N_Y=1;
  235.                                         }
  236.                                         if(xi<=3&&dong<=3)                        //判斷西和東時間是否在3秒以內
  237.                                         {
  238.                                                 X_Y=1;
  239.                                                 D_Y=1;
  240.                                         }                                
  241.                                 }
  242.                         }
  243.                         while(s3==0);                                                                        
  244.                 }
  245.                 if(night_flag==0)                                                //如果深夜標志位為0,表示關閉深夜模式,紅綠燈正常運行
  246.                 {
  247.                         if(time_cl==0)                                                        //如果time_cl=0(不允許調整時間),即紅綠燈正常運行
  248.                         {        
  249.                                 if(flag==0)                                                        //flag=0表示北南通行允許
  250.                                 {
  251.                                         B_N_tong();                                                //北南 通行
  252.                                         if(bei==0)                                                //北南通行時間到
  253.                                         {
  254.                                                 flag=~flag;                                        //西東 通行允許
  255.                                                 B_N_D_flag=1;                                //北南通燈行標志位置1
  256.                                         }
  257.                                 }
  258.                                 else                                                                //flag=1表示西東通行允許
  259.                                 {
  260.                                         X_D_tong();                                                //西東 通行
  261.                                         if(xi==0)                                                //西東通行時間到
  262.                                         {
  263.                                                 flag=~flag;                                        //北南 通行允許
  264.                                                 X_D_D_flag=1;                                //西東通燈行標志位置1
  265.                                         }
  266.                                 }
  267.         
  268.                                 disp(bei,nan,xi,dong);                                //顯示時間數據
  269.                                 if(bei==0&&nan==0&&xi==0&&dong==0)        //如果 北 南 西 東時間到(為0)
  270.                                 {
  271.                                         TR0=0;                                                        //關閉定時器0
  272.                                         TL0=(65536-50000)%256;                        
  273.                                         TH0=(65536-50000)/256;                        //12M晶振 定時時間50ms
  274.                                         for(j=0;j<3;j++)                                //延時顯示閃爍3下
  275.                                         {
  276.                                                 for(i=0;i<10;i++)                        //for語句延時
  277.                                                 {
  278.                                                         disp(bei,nan,xi,dong);  //顯示函數
  279.                                                 
  280.                                                 }
  281.                                                 SMG_KZ=0xff;                                //關閉顯示
  282.                                                 delay(200);                                        //延時一下
  283.                                         }
  284.                                         bei=time;                                                //time值賦給北
  285.                                         nan=time;                                                //time值賦給南
  286.                                         xi=time;                                                //time值賦給西
  287.                                         dong=time;                                                //time值賦給東
  288.                                         TR0=1;                                                        //開啟定時器0
  289.                                 }
  290.                                 else                                                                //否則
  291.                                 {}                                                                        //空操作
  292.                         }
  293.                         else                                                                        //如果time_cl==1(允許時間調整)
  294.                         {
  295.                                 TR0=0;                                                                //關閉定時器
  296.                                 TL0=(65536-50000)%256;
  297.                                 TH0=(65536-50000)/256;                                //12M晶振 定時時間50ms
  298.                                 num=0;                                                                //時間基數清0
  299.                                 bei=nan=xi=dong=time;                                //time值賦給 北 南 西 東
  300.                                 disp(bei,nan,xi,dong);                                //顯示時間數據
  301.                                 if(s2==0)                                                        //當P3.1按鍵按下(操作時間加1)
  302.                                 {
  303.                                         delay(5);                                                //延時去抖
  304.                                         if(s2==0)                                                //再次確定按鍵是否按下
  305.                                         {
  306.                                                 time++;                                                //時間加1
  307.                                         }        
  308.                                         while(s2==0);                                        //等待按鍵松開        
  309.                                 }
  310.                                 if(bei==100&&nan==100&&xi==100&&dong==100)        //如果北 南 西 東 時間到100
  311.                                 {        
  312.                                         time=1;                                                        //time等于1
  313.                                 }
  314.                                 if(s1==0)                                                        //當P3.6按鍵按下(操作時間減1)               
  315.                                 {                                                                                
  316.                                         delay(5);                                                //延時去抖
  317.                                         if(s1==0)                                                //再次確定按鍵是否按下
  318.                                         {
  319.                                                 time--;                                                //time減1
  320.                                         }
  321.                                         while(s1==0);                                        //等待按鍵松開
  322.                                 }
  323.                                 if(bei==0&&nan==0&&xi==0&&dong==0)        //如果北 南 西 東 時間到0
  324.                                 {
  325.                                         time=99;                                                //time等于99
  326.                                 }        
  327.                         }
  328.                 }
  329.                 else                                                                                //否則深夜標志位為1,表示開啟深夜模式
  330.                 {               
  331.                         if(num==20)                                                                //當1s時間到
  332.                         {
  333.                                 num=0;                                                                //50ms時間基數清0
  334.                                 night_mode();                                                //深夜模式
  335.                         }                                
  336.                 }
  337.   //  disp(69,69,69,69);                        
  338.         }
  339.    
  340. }






  341. void disp(bei,nan,xi,dong)                 //顯示(北 南 西 東)時間函數
  342. {
  343.         SMG_XS=Data[bei/10];                //顯示北的十位
  344.         smg1=0;                                //允許北十位顯示
  345.         delay(t);                                        //小延時一下,使數碼管顯示更清楚
  346.     smg1=1;                        //關閉數碼管顯示(消隱)
  347.         SMG_XS=Data[bei%10];                //顯示北的個位
  348.         smg2=0;                        //允許北個位顯示
  349.     delay(t);                                        //小延時一下,使數碼管顯示更清楚
  350.         smg2=1;                        //關閉數碼管顯示(消隱)        
  351.         SMG_XS=Data[nan/10];                //顯示南的十位        
  352. //SMG_KZ=0xf7;                                //允許南十位顯示
  353.     smg1=0;
  354.           delay(t);                                        //小延時一下,使數碼管顯示更清楚
  355.         smg1=1;
  356.     //SMG_KZ=0xff;                                //關閉數碼管顯示(消隱)
  357.         SMG_XS=Data[nan%10];                //顯示南的個位
  358.         //SMG_KZ=0xfb;                                //允許南個位顯示
  359.     smg2=0;        
  360.     delay(t);                                        //小延時一下,使數碼管顯示更清楚
  361.         //SMG_KZ=0xff;                                //關閉數碼管顯示(消隱)
  362.     smg2=1;
  363.         SMG_XS=Data[xi/10];                        //顯示西的十位        
  364.   //        SMG_KZ=0xdf;                                //允許西十位顯示
  365.         smg1=0;
  366.     delay(t);                                        //小延時一下,使數碼管顯示更清楚
  367.         smg1=1;
  368.     //SMG_KZ=0xff;                                //關閉數碼管顯示(消隱)
  369.         SMG_XS=Data[xi%10];                        //顯示西的個位
  370.         smg2=0;
  371.     //SMG_KZ=0xef;                                //允許西個位顯示
  372.         delay(t);                                        //小延時一下,使數碼管顯示更清楚
  373.         smg2=1;
  374.     //SMG_KZ=0xff;                                //關閉數碼管顯示(消隱)

  375.         SMG_XS=Data[dong/10];                //顯示東的十位               
  376.         smg1=0;
  377.     //SMG_KZ=0x7f;                                //允許東十位顯示
  378.         delay(t);                                        //小延時一下,使數碼管顯示更清楚
  379.         smg1=1;
  380.     //SMG_KZ=0xff;                                //關閉數碼管顯示(消隱)
  381.         SMG_XS=Data[dong%10];                //顯示東的個位
  382.         smg2=0;//
  383. ……………………

  384. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

所有資料51hei提供下載:
ID216 模塊相關資料 交通燈.zip (794.82 KB, 下載次數: 90)

評分

參與人數 3黑幣 +15 收起 理由
阿玲玲玲 + 5 回帖助人的獎勵!
bhbsh + 5 贊一個!
cccchen + 5 很給力!

查看全部評分

回復

使用道具 舉報

ID:1 發表于 2017-6-6 04:07 | 顯示全部樓層
好資料,51黑有你更精彩!!!
回復

使用道具 舉報

ID:208951 發表于 2017-6-12 15:59 | 顯示全部樓層
贊一個
回復

使用道具 舉報

ID:72444 發表于 2017-6-20 12:03 | 顯示全部樓層
贊一個
回復

使用道具 舉報

ID:321448 發表于 2018-7-12 13:53 | 顯示全部樓層
非常好的資料
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美video| 国产成人精品一区二区三区在线 | 羞羞视频网站免费看 | 国产www成人 | 精品一区二区三区电影 | 成人不卡一区二区 | 91视频.| 成人啊啊啊 | 日本精品久久久久久久 | 一区二区三区小视频 | 婷婷激情五月网 | 一区二区三区国产在线观看 | av在线播放国产 | 中文字幕亚洲国产 | 日韩av中文 | 精品一区二区三区四区 | 伊人艹 | 美国a级毛片免费视频 | 91精品久久久久久久久 | 亚洲一区二区三区在线播放 | 亚洲国产一区二区视频 | 国产精品免费观看 | 人人精品 | 成人免费看黄 | 色免费在线视频 | 日韩精品一区二区三区久久 | 午夜大片| av影片在线| 亚洲另类视频 | 日p视频免费看 | 亚洲欧美综合 | 亚洲一区二区三区在线免费 | 亚洲欧美一区二区在线观看 | 特级做a爰片毛片免费看108 | 国产精品视频二区三区 | av网站在线免费观看 | 久久精品国产久精国产 | 最新国产精品精品视频 | 久久精品小短片 | 日韩成人在线观看 | 成人av在线大片 |