|
學(xué)校的課程設(shè)計(jì)做的一個(gè)小程序,用51單片機(jī)做的交通燈。
0.png (12.36 KB, 下載次數(shù): 32)
下載附件
2019-3-6 02:16 上傳
單片機(jī)源程序如下:
- #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 // 定義數(shù)碼管 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線信號(hào)燈
- sbit Y1 = P0^1;
- sbit R1 = P0^2;
-
- sbit G2 = P1^0; //B線信號(hào)燈
- sbit Y2 = P1^1;
- sbit R2 = P1^2;
- uchar NS_S,NS_G,EW_S,EW_G; //AB線數(shù)碼管個(gè)位,十位
- uchar NS,EW;
- uchar temp=0,i;
- uchar code table[10]= {0x7e,0x30,0x6d,0x79,0x33,0x5b,0x5f,0x70,0x7f,0x7b}; //共陰級(jí)數(shù)碼管數(shù)組
- void delay(uint i);
- void T0_init();
- void MAX7219(uchar addr,uchar num);
- void MAX7219_init();
- void display();
-
- void delay(uint i) //延時(shí)
- {
- uint j;
- for(j=0;j<i;j++);
- }
- void T0_init() //定時(shí)器
- {
- TMOD=0X01;
- TH0=0XD8; //裝初值10MS
- TL0=0XF0;
- ET0=1;
- TR0=1;
- }
- void MAX_write(uchar ch) //以8位一個(gè)字節(jié)進(jìn)行寫值
- {
- uchar j,ads;
- for(j=0;j<8;j++) //8位
- {
- ads=ch&0x80; //取最高位
- CLK = 0; //時(shí)鐘位置低
- if(ads) DIN = 1;
- else DIN = 0;
- ch=ch<<1;
- CLK=1; //上升沿,DIN的數(shù)據(jù)寫入到7219
- }
- }
- void MAX7219(uchar addr, uchar num) //寫地址,寫數(shù)據(jù)
- {
- LOAD = 0;
- _nop_();
- MAX_write(addr);
- _nop_();
- MAX_write(num);
- _nop_();
- LOAD = 1; //鎖存
- }
- void MAX7219_init() //MAX7219初始化
- {
- MAX7219(0x0c,0x01); //正常工作狀態(tài)
- MAX7219(0x0b,0x03); //設(shè)置掃描范圍SMG0-3
- MAX7219(0x0a,0x05); //設(shè)置亮度11/32
- MAX7219(0x09,0x00); //采用譯碼方式 ,不譯碼
- }
- void display() //顯示函數(shù)
- {
- NS_S=NS/10; //A線十位
- NS_G=NS%10; //A線個(gè)位
- EW_S=EW/10; //B線十位
- EW_G=EW%10; //B線個(gè)位
- MAX7219(DIG0,table[NS_S]); //A線十位,個(gè)位
- MAX7219(DIG1,table[NS_G]);
- MAX7219(DIG2,table[EW_S]); //B線十位,個(gè)位
- 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) //選擇信號(hào)燈的亮滅方式
- {
- case 1: G1=1;Y1=0; //關(guān)閉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; //關(guān)閉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進(jìn)入
- {
- temp=0;
- NS--;
- EW--;
- if((NS==0)&&(EW==3)) //A線倒計(jì)時(shí)時(shí)間結(jié)束且B線剩余3s
- {
- NS=3;
- EW=3;
- i=1;
- }
- if((NS==0)&&(EW==0)&&(i==1)) //AB線倒計(jì)時(shí)時(shí)間結(jié)束且剛結(jié)束第一種情況
- {
- NS=18;
- EW=15;
- i=2;
- }
- if((NS==3)&&(EW==0)) //B線倒計(jì)時(shí)時(shí)間結(jié)束且A線剩余3s
- {
- NS=3;
- EW=3;
- i=3;
- }
- if((NS==0)&&(EW==0)&&(i==3)) //AB線倒計(jì)時(shí)時(shí)間結(jié)束且剛結(jié)束第三種情況
- {
- NS=15;
- EW=18;
- i=4;
- }
- }
- display();
- }
復(fù)制代碼
所有資料51hei提供下載:
交通燈.rar
(103.78 KB, 下載次數(shù): 58)
2019-3-4 17:29 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
評(píng)分
-
查看全部評(píng)分
|