學校的課程設計做的一個小程序,用51單片機做的交通燈。
單片機源程序如下:
- #include<reg51.h>
- #include <intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define DIG0 0x01
- #define DIG1 0x02
- #define DIG2 0x03
- #define DIG3 0x04 // 定義數碼管 1,2,3,4
- sbit DIN = P3^0; //MAX7219 DIN引腳
- sbit LOAD = P3^1; //MAX7219 LOAD 引腳
- sbit CLK = P3^2; //MAX7219 CLK 引腳
- sbit G1 = P0^0; //A線信號燈
- sbit Y1 = P0^1;
- sbit R1 = P0^2;
-
- sbit G2 = P1^0; //B線信號燈
- sbit Y2 = P1^1;
- sbit R2 = P1^2;
- uchar NS_S,NS_G,EW_S,EW_G; //AB線數碼管個位,十位
- uchar NS,EW;
- uchar temp=0,i;
- uchar code table[10]= {0x7e,0x30,0x6d,0x79,0x33,0x5b,0x5f,0x70,0x7f,0x7b}; //共陰級數碼管數組
- void delay(uint i);
- void T0_init();
- void MAX7219(uchar addr,uchar num);
- void MAX7219_init();
- void display();
-
- void delay(uint i) //延時
- {
- uint j;
- for(j=0;j<i;j++);
- }
- void T0_init() //定時器
- {
- TMOD=0X01;
- TH0=0XD8; //裝初值10MS
- TL0=0XF0;
- ET0=1;
- TR0=1;
- }
- void MAX_write(uchar ch) //以8位一個字節進行寫值
- {
- uchar j,ads;
- for(j=0;j<8;j++) //8位
- {
- ads=ch&0x80; //取最高位
- CLK = 0; //時鐘位置低
- if(ads) DIN = 1;
- else DIN = 0;
- ch=ch<<1;
- CLK=1; //上升沿,DIN的數據寫入到7219
- }
- }
- void MAX7219(uchar addr, uchar num) //寫地址,寫數據
- {
- LOAD = 0;
- _nop_();
- MAX_write(addr);
- _nop_();
- MAX_write(num);
- _nop_();
- LOAD = 1; //鎖存
- }
- void MAX7219_init() //MAX7219初始化
- {
- MAX7219(0x0c,0x01); //正常工作狀態
- MAX7219(0x0b,0x03); //設置掃描范圍SMG0-3
- MAX7219(0x0a,0x05); //設置亮度11/32
- MAX7219(0x09,0x00); //采用譯碼方式 ,不譯碼
- }
- void display() //顯示函數
- {
- NS_S=NS/10; //A線十位
- NS_G=NS%10; //A線個位
- EW_S=EW/10; //B線十位
- EW_G=EW%10; //B線個位
- MAX7219(DIG0,table[NS_S]); //A線十位,個位
- MAX7219(DIG1,table[NS_G]);
- MAX7219(DIG2,table[EW_S]); //B線十位,個位
- MAX7219(DIG3,table[EW_G]);
- }
- void main()
- {
- T0_init();
- MAX7219_init();
- EA=1;
- NS=15;
- EW=18;
- R2=0,G1=0; //初始通行15秒,A線綠燈亮,B線紅燈亮
- while (1)
- {
- uint k;
- display();
- switch(i) //選擇信號燈的亮滅方式
- {
- case 1: G1=1;Y1=0; //關閉A線綠燈,黃燈閃爍
- for(k=0;k<3;k++)
- {
- R2=0;
- Y1=~Y1;
- delay(10000);
- }
- R2=1;break;
- case 2: G2=0,R1=0;break; //B線綠燈亮,A線紅燈亮
- case 3: G2=1,Y2=0; //關閉B線綠燈,黃燈閃爍
- for(k=0;k<3;k++)
- {
- R1=0;
- Y2=~Y2;
- delay(10000);
- }
- R1=1;break;
- case 4: R2=0,G1=0;break; //B線紅燈亮,A線綠燈亮
- }
- }
- }
- void T0_(void)interrupt 1 //中斷
- {
- temp++;
- TH0=0XD8;
- TL0=0XF0;
- if(temp==100) //1s進入
- {
- temp=0;
- NS--;
- EW--;
- if((NS==0)&&(EW==3)) //A線倒計時時間結束且B線剩余3s
- {
- NS=3;
- EW=3;
- i=1;
- }
- if((NS==0)&&(EW==0)&&(i==1)) //AB線倒計時時間結束且剛結束第一種情況
- {
- NS=18;
- EW=15;
- i=2;
- }
- if((NS==3)&&(EW==0)) //B線倒計時時間結束且A線剩余3s
- {
- NS=3;
- EW=3;
- i=3;
- }
- if((NS==0)&&(EW==0)&&(i==3)) //AB線倒計時時間結束且剛結束第三種情況
- {
- NS=15;
- EW=18;
- i=4;
- }
- }
- display();
- }
復制代碼
所有資料51hei提供下載:
交通燈.rar
(103.78 KB, 下載次數: 58)
2019-3-4 17:29 上傳
點擊文件名下載附件
|