標(biāo)題: 基于STC系列的交通燈程序 [打印本頁(yè)]

作者: 李狗蛋16    時(shí)間: 2020-12-30 10:32
標(biāo)題: 基于STC系列的交通燈程序
部分代碼如下:
  1. #include<reg51.h>typedef unsigned char u8;
  2. typedef unsigned int u16;

  3. sbit LSA=P2^2;//使用138譯碼器控制8個(gè)燈
  4. sbit LSB=P2^3;
  5. sbit LSC=P2^4;
  6. #define GPIO_DIG P0//數(shù)碼管段選,宏定義到P0
  7. #define GPIO_TRAFFIC P1//交通燈的8個(gè)端口p1

  8. sbit RED10=P1^0; //前進(jìn)路人行道的紅燈
  9. sbit GREEN10=P1^1;//前進(jìn)路人行道的綠燈
  10. sbit RED11=P1^2;//上方公路的紅燈
  11. sbit YELLOW11=P1^3;//上方公路的黃燈
  12. sbit GREEN11=P1^4;//上方公路綠燈

  13. sbit RED00=P3^0;//上方人行道的紅燈(其它的有8個(gè)管腳控制,這個(gè)用單片機(jī)管腳控制)
  14. sbit GREEN00=P3^1;//上方人行道的綠燈(其它的有8個(gè)管腳控制,這個(gè)用單片機(jī)管腳控制)
  15. sbit RED01=P1^5;//前進(jìn)路的紅燈
  16. sbit YELLOW01=P1^6;//前進(jìn)路的黃燈
  17. sbit GREEN01=P1^7;//前進(jìn)路的綠燈

  18. u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  19.                                         0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//顯示0~F的值
  20. u8 second;//存儲(chǔ)時(shí)間數(shù)據(jù)
  21. u8 DispalyData[8];//全局變量,保存動(dòng)態(tài)數(shù)碼管顯示時(shí)間的數(shù)組                                
  22.         void delay(u16 i)
  23. {
  24.         while(i--);        
  25. }                                
  26. void Timer0lnit()//初始化
  27. {
  28.         TMOD|=0X01;//選擇為定時(shí)器0模式,工作方式1,僅用TR0打開(kāi)啟動(dòng)(用0001轉(zhuǎn)化為16進(jìn)制)(低4位T0)(TMOD=TMOD|0x01,防止對(duì)前面其他位產(chǎn)生影響)
  29.         TH0=0XFC;//給定時(shí)器賦初值,定時(shí)1ms(65535-1000+1,結(jié)果轉(zhuǎn)換為16進(jìn)制)
  30.         TL0=0X18;//由低四位溢向高四位,所以是0x18
  31.         ET0=1;//打開(kāi)定時(shí)器0中斷允許位
  32.         EA=1;//打開(kāi)中斷
  33.         TR0=1;//打開(kāi)定時(shí)器(T0寄存器控制位,置1開(kāi)始工作,置0停止工作,軟件控制啟動(dòng)和停止)
  34. }
  35. void DigDisplay()
  36. {
  37.         u8 i;
  38.         for(i=0;i<8;i++)
  39.         {
  40.                 switch(i)         //位選,選擇點(diǎn)亮的數(shù)碼管,
  41.                 {
  42.                         case(0):
  43.                                 LSA=0;LSB=0;LSC=0; break;//顯示第0位
  44.                         case(1):
  45.                                 LSA=1;LSB=0;LSC=0; break;//顯示第1位
  46.                         case(2):
  47.                                 LSA=0;LSB=1;LSC=0; break;//顯示第2位
  48.                         case(3):
  49.                                 LSA=1;LSB=1;LSC=0; break;//顯示第3位
  50.                         case(4):
  51.                                 LSA=0;LSB=0;LSC=1; break;//顯示第4位
  52.                         case(5):
  53.                                 LSA=1;LSB=0;LSC=1; break;//顯示第5位
  54.                         case(6):
  55.                                 LSA=0;LSB=1;LSC=1; break;//顯示第6位
  56.                         case(7):
  57.                                 LSA=1;LSB=1;LSC=1; break;//顯示第7位        
  58.                 }
  59.                    GPIO_DIG=DispalyData[i];//相當(dāng)于調(diào)用smgduan[17]的數(shù)組內(nèi)容
  60.                 delay(100); //間隔一段時(shí)間掃描        
  61.                 GPIO_DIG=0x00;//消隱
  62.         }
  63. }
  64.         void main()
  65. {
  66.         second=1;
  67.         Timer0lnit();//定時(shí)器0初始化
  68.         while(1)
  69.         {
  70.                 if(second==70)
  71.                 {
  72.                         second=1;
  73.                 }
  74.                 if(second<30)
  75.                 {
  76.                         DispalyData[0]=0x00;//對(duì)于共陰數(shù)碼管是不點(diǎn)亮的意思,(同是低電平)
  77.                         DispalyData[1]=0x00;//同上
  78.                         DispalyData[2]=smgduan[(30-second)%100/10];//取十位賦值到DispalyData[i]位選,進(jìn)而調(diào)用smgduan[17]數(shù)組里面的數(shù)據(jù)
  79.                         DispalyData[3]=smgduan[(30-second)%10];//取個(gè)位同上
  80.                         
  81.                         DispalyData[4]=0x00;//前兩位不顯示,代表另外一路口的紅綠燈
  82.                         DispalyData[5]=0x00;
  83.                         DispalyData[6]=DispalyData[2];//后兩位顯示
  84.                         DispalyData[7]=DispalyData[3];
  85.                         DigDisplay();
  86.                         
  87.                         GPIO_TRAFFIC=0xff;//所有初始燈關(guān)閉
  88.                         RED00=1;//它內(nèi)部電路接在高電平,所以給它高電平就是關(guān)閉狀態(tài)
  89.       GREEN00=1;//同上
  90.                         
  91.                         
  92.                         GREEN11=0;//上方公路綠燈
  93.                          RED00=0;//上方人行道紅燈
  94.                         
  95.                          RED01=0;//前進(jìn)路紅燈
  96.                          GREEN10=0;//前進(jìn)路人行道綠燈               
  97.                 }
復(fù)制代碼






歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1