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

QQ登錄

只需一步,快速開始

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

用51單片機(jī)做的交通燈程序+Proteus仿真圖

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
學(xué)校的課程設(shè)計(jì)做的一個(gè)小程序,用51單片機(jī)做的交通燈。


單片機(jī)源程序如下:
  1. #include<reg51.h>
  2. #include <intrins.h>

  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. #define        DIG0 0x01                 
  6. #define DIG1 0x02                 
  7. #define DIG2 0x03                 
  8. #define DIG3 0x04                 // 定義數(shù)碼管 1,2,3,4


  9. sbit DIN  = P3^0;                                         //MAX7219 DIN引腳
  10. sbit LOAD = P3^1;                                        //MAX7219 LOAD 引腳
  11. sbit CLK  = P3^2;                                         //MAX7219 CLK 引腳

  12. sbit G1 = P0^0;                                        //A線信號(hào)燈
  13. sbit Y1 = P0^1;
  14. sbit R1 = P0^2;
  15.                                                                   
  16. sbit G2 = P1^0;                                        //B線信號(hào)燈
  17. sbit Y2 = P1^1;
  18. sbit R2 = P1^2;

  19. uchar NS_S,NS_G,EW_S,EW_G;                                                           //AB線數(shù)碼管個(gè)位,十位
  20. uchar NS,EW;
  21. uchar temp=0,i;

  22. uchar code table[10]= {0x7e,0x30,0x6d,0x79,0x33,0x5b,0x5f,0x70,0x7f,0x7b};                //共陰級(jí)數(shù)碼管數(shù)組

  23. void delay(uint i);
  24. void T0_init();
  25. void MAX7219(uchar addr,uchar num);
  26. void MAX7219_init();                       
  27. void display();
  28.                                                          
  29. void delay(uint i)                                                                                 //延時(shí)
  30. {
  31.         uint j;
  32.         for(j=0;j<i;j++);
  33. }

  34. void T0_init()                                                                                          //定時(shí)器
  35. {                                                         
  36.         TMOD=0X01;                                                                                  
  37.         TH0=0XD8;                                                                                  //裝初值10MS
  38.         TL0=0XF0;
  39.         ET0=1;
  40.         TR0=1;
  41. }
  42. void MAX_write(uchar ch)                                                //以8位一個(gè)字節(jié)進(jìn)行寫值
  43. {
  44.         uchar j,ads;
  45.             for(j=0;j<8;j++)                                           //8位
  46.                 {
  47.                               ads=ch&0x80;                                //取最高位
  48.                               CLK = 0;                                               //時(shí)鐘位置低
  49.                               if(ads)  DIN = 1;
  50.                               else     DIN = 0;                                               
  51.                               ch=ch<<1;                                                        
  52.                               CLK=1;                                       //上升沿,DIN的數(shù)據(jù)寫入到7219
  53.                     }
  54. }
  55. void MAX7219(uchar addr, uchar num)                        //寫地址,寫數(shù)據(jù)
  56. {
  57.     LOAD = 0;         
  58.         _nop_();
  59.     MAX_write(addr);
  60.          _nop_();
  61.     MAX_write(num);  
  62.          _nop_();
  63.     LOAD = 1;                                                  //鎖存
  64. }                                                                           

  65. void MAX7219_init()                                                                         //MAX7219初始化
  66. {                                                                                       
  67.     MAX7219(0x0c,0x01);                                  //正常工作狀態(tài)
  68.     MAX7219(0x0b,0x03);                                  //設(shè)置掃描范圍SMG0-3
  69.     MAX7219(0x0a,0x05);                                  //設(shè)置亮度11/32
  70.     MAX7219(0x09,0x00);                                  //采用譯碼方式 ,不譯碼
  71. }
  72. void display()                                                         //顯示函數(shù)
  73. {
  74.         NS_S=NS/10;                              //A線十位                     
  75.         NS_G=NS%10;                                                        //A線個(gè)位

  76.         EW_S=EW/10;                         //B線十位         
  77.         EW_G=EW%10;                                                        //B線個(gè)位

  78.         MAX7219(DIG0,table[NS_S]);          //A線十位,個(gè)位        
  79.             MAX7219(DIG1,table[NS_G]);                                       
  80.                    MAX7219(DIG2,table[EW_S]);          //B線十位,個(gè)位
  81.             MAX7219(DIG3,table[EW_G]);
  82. }

  83. void main()
  84. {
  85.         T0_init();
  86.         MAX7219_init();
  87.         EA=1;
  88.         NS=15;                                                                  
  89.         EW=18;                                                                  
  90.                    R2=0,G1=0;                                            //初始通行15秒,A線綠燈亮,B線紅燈亮
  91.                 while (1)
  92.         {
  93.                 uint k;
  94.                 display();        
  95.                               switch(i)                                                                         //選擇信號(hào)燈的亮滅方式
  96.                        {
  97.                               case 1: G1=1;Y1=0;                       //關(guān)閉A線綠燈,黃燈閃爍
  98.                                       for(k=0;k<3;k++)
  99.                                         {
  100.                                                                         R2=0;
  101.                                               Y1=~Y1;                                                      
  102.                                               delay(10000);
  103.                                            }     
  104.                                                                           R2=1;break;
  105.                               case 2: G2=0,R1=0;break;                    //B線綠燈亮,A線紅燈亮
  106.                               case 3: G2=1,Y2=0;                                //關(guān)閉B線綠燈,黃燈閃爍
  107.                                       for(k=0;k<3;k++)                       
  108.                                 {
  109.                                                                 R1=0;
  110.                                                Y2=~Y2;
  111.                                     delay(10000);
  112.                                 }
  113.                                                                 R1=1;break;
  114.                               case 4: R2=0,G1=0;break;                        //B線紅燈亮,A線綠燈亮
  115.              }                        
  116.          }
  117. }

  118. void T0_(void)interrupt 1                                  //中斷
  119. {
  120.           temp++;
  121.           TH0=0XD8;
  122.           TL0=0XF0;
  123.           if(temp==100)                                                          //1s進(jìn)入
  124.             {
  125.                       temp=0;
  126.                       NS--;
  127.                       EW--;
  128.                      if((NS==0)&&(EW==3))                        //A線倒計(jì)時(shí)時(shí)間結(jié)束且B線剩余3s
  129.                        {
  130.                                    NS=3;
  131.                                 EW=3;
  132.                           i=1;
  133.                        }
  134.                      if((NS==0)&&(EW==0)&&(i==1))        //AB線倒計(jì)時(shí)時(shí)間結(jié)束且剛結(jié)束第一種情況
  135.                  {       
  136.                           NS=18;
  137.                           EW=15;
  138.                           i=2;
  139.                  }
  140.                       if((NS==3)&&(EW==0))                         //B線倒計(jì)時(shí)時(shí)間結(jié)束且A線剩余3s
  141.                  {
  142.                                  NS=3;
  143.                                  EW=3;
  144.                           i=3;
  145.                  }
  146.                       if((NS==0)&&(EW==0)&&(i==3))         //AB線倒計(jì)時(shí)時(shí)間結(jié)束且剛結(jié)束第三種情況
  147.                  {
  148.                           NS=15;
  149.                           EW=18;
  150.                           i=4;
  151.                  }
  152.         }
  153.       display();
  154. }
復(fù)制代碼

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


評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

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

使用道具 舉報(bào)

沙發(fā)
ID:530358 發(fā)表于 2019-5-8 17:31 | 只看該作者
你好,請(qǐng)問這個(gè)芯片除了c51還有個(gè)什么芯片?
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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