|
簡易交通燈【c語言+仿真圖】完整注釋
0.png (36.26 KB, 下載次數: 75)
下載附件
2017-5-3 03:02 上傳
0.png (64.4 KB, 下載次數: 99)
下載附件
2017-5-3 03:02 上傳
單片機源程序:
- #include<reg51.h>
- #include<absacc.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define PA XBYTE[0xf8ff] //定義A口
- #define PB XBYTE[0xf9ff] //定義B口
- #define PC XBYTE[0xfaff] //定義C口
- #define CTRL XBYTE[0xfbff] //ctrol簡寫為CTRL 定義控制口
- uint i = 0, cnt = 120, flag=0;
- uchar table[]={ //共陰極
- 0x3f,0x06,0x5b,0x4f,
- 0x66,0x6d,0x7d,0x07,
- 0x7f,0x6f,0x77,0x7c,
- 0x39,0x5e,0x79,0x71
- };
- void display(int x, int y, int m, int n, int a, int b, int c, int d);
- void delay(int);
- void main()
- {
- CTRL = 0x80; //1000 0000B 方式選擇控制字: A口方式0 A口位輸出 C口高4位輸出 B口方式0 B口輸出 C口低4位輸出
- IP = 0x05;
- TMOD = 0x01; //方式寄存器TMOD 0000 0001B 定時器0,方式1
- TH0 = (65536-50000)/256;
- TL0 = (65536-50000)%256; //定時50ms
- EA = 1; //開總中斷
- ET0 = 1; //允許定時器0中斷
- TR0 = 1; //開啟定時器0
- while(1)
- {
- if(cnt > 65) //120-cnt 小于55
- {
- XBYTE[PA] = 0x33; //0011 0011B PA2綠燈亮 PA3紅燈亮
- display(0xfe ,0xfd, 0xfb, 0xf7, (cnt-65)/10, (cnt-65)%10, (cnt-60)/10, (cnt-60)%10);
- } //1111 1110B,(P1.0) 1111 1101B,(P1.1) 1111 1011B,(P1.2) 1111 0111B,(p1.3)假設cnt=70即計數50次此時南北綠燈顯示05 東西紅燈顯示10;
- else if(cnt > 60 && cnt <= 65) //120-cnt介于 55與60之間
- {
- if(flag == 0)
- {
- XBYTE[PA] = 0x35;//0011 0101B PA1黃燈亮 PA3紅燈亮
- display(0xff ,0xff, 0xfb, 0xf7, (cnt-60)/10,(cnt-60)%10, (cnt-60)/10,(cnt-60)%10);
- } //1111 1111B,1111 1111B 1111 1011B 1111 0111B 假設cnt=62 即計數120-62=58次,此時南北黃燈顯示數字02 東西顯示紅燈02;
- if(flag == 1)
- {
- XBYTE[PA] = 0x35;//0011 0101B PA1黃燈亮 PA3紅燈亮
- display(0xfe ,0xfd, 0xfb, 0xf7, (cnt-60)/10,(cnt-60)%10, (cnt-60)/10,(cnt-60)%10);
- }//1111 1110B,1111 1101B,1111 1011B,1111 0111B 假設cnt=62 即計數120-62=58次,此時南北紅燈顯示數字02,東西顯示綠燈02;
- }
- else if(cnt <= 60 && cnt > 5) //120-cnt介于 60與115之間
- {
- XBYTE[PA] = 0x1e; //0001 1110B PA0紅燈亮 PA5綠燈亮
- display(0xfe ,0xfd, 0xfb, 0xf7, (cnt)/10,(cnt)%10, (cnt-5)/10,(cnt-5)%10);
- }//1111 1110B,1111 1101B,1111 1011B,1111 0111B 假設cnt=40 即計數120-40=80次,此時南北紅燈顯示數字40,東西綠燈顯示35;
- else if(cnt > 0 && cnt <= 5) //120-cnt 介于 115與120之間
- {
- if(flag == 0)
- {
- XBYTE[PA] = 0x2e;//0010 1110B PA0紅燈亮 PA4黃燈亮
- display(0xfe ,0xfd, 0xff, 0xff, (cnt)/10,(cnt)%10, (cnt)/10,(cnt)%10);
- }//1111 1110B,1111 1101B,1111 1111B,1111 1111B 假設cnt=3即計數120-3=117次,此時南北紅燈顯示數字03,東西黃燈顯示數字03
- if(flag == 1)
- {
- XBYTE[PA] = 0x2e;//0010 1110B PA0紅燈亮 PA4黃燈亮
- display(0xfe ,0xfd, 0xfb, 0xf7, (cnt)/10,(cnt)%10, (cnt)/10,(cnt)%10);
- }//1111 1110B,1111 1101B,1111 1101B,1111 0111B 假設cnt=3即計數120-3=117次,此時南北紅燈顯示數字03,東西黃燈顯示數字03
- }
- }
- }
- void display(int x, int y, int m, int n, int a, int b, int c, int d) //數碼管
- {
- P1 = x; //P1.0
- PB = table[a]; //南北方向高位數碼管顯示數字
- delay(1); //調用延時函數
- P1 = y; //P1.1
- PB = table[b]; //南北方向低位數碼管顯示數字
- delay(1); //調用延時函數
-
- P1 = m; //P1.2
- PC = table[c]; //東西方向高位數碼管顯示數字
- delay(1); //調用延時函數
- P1 = n; //P1.3
- PC = table[d]; //東西方向低位數碼管顯示數字
- delay(1); //調用延時函數
- }
- void delay(int z) //延時子程序
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
- void mytimer0() interrupt 1 //定時器中斷0
- {
- TH0 = (65536-50000)/256;
- TL0 = (65536-50000)%256; //定時50ms
- i++;
- if(i >= 10) //T=50ms*10=500ms
- {
- flag ++; //flag每0.5秒加1
- i = 0;
- }
- if(flag > 1)
- {
- flag=0;
- cnt --; //cnt每秒減1
- }
- …………限于本文篇幅 余下代碼請從51hei下載附件…………
復制代碼
下載:
NO.3.rar
(60.16 KB, 下載次數: 80)
2017-5-2 23:57 上傳
點擊文件名下載附件
簡易交通燈【c語言+仿真圖】完整注釋 下載積分: 黑幣 -5
|
評分
-
查看全部評分
|