|
利用定時器計時,注釋非常詳細,可自己改變定時時間。
單片機源程序如下:
- #include "reg52.h"
- #define GPIO_TRAFFIC P2
- #define GPIO_DIG P0
- typedef unsigned char u8;
- typedef unsigned int u16;
- //3-8譯碼器引腳位定義
- sbit LSA = P1^0;
- sbit LSB = P1^1;
- sbit LSC = P1^2;
- //交通信號燈南北方向控制引腳位定義
- sbit GREEN10 = P2^0;
- sbit RED10 = P2^1;
- sbit GREEN11 = P2^2;
- sbit YELLOW11 = P2^3;
- sbit RED11 = P2^4;
- //交通信號燈東西方向控制引腳位定義
- sbit GREEN00 = P1^6;
- sbit RED00 = P1^7;
- sbit GREEN01 = P2^5;
- sbit YELLOW01 = P2^6;
- sbit RED01 = P2^7;
- u8 code smgduan[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,
- 0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //共陰
- u8 displaydata[8]; //儲存信號燈倒計時
- //定義一個全局變量
- u8 second;
- //各種函數(shù)的聲明
- void Timer0Init();
- void delay(u16 i);
- void Digdisplay();
- void trafficpros();
- /*******************************
- 主函數(shù):main
- *******************************/
- void main(void)
- {
- second = 1;
- Timer0Init(); //初始化定時器T0;
- while(1)
- {
- trafficpros();
- }
- }
- /*******************************
- 定時器T0配置函數(shù),只選擇TCON中TR
- 0觸發(fā),定時10ms。
- *******************************/
- void Timer0Init()
- {
- TMOD |= 0x01;
- TH0 = 0xd8;
- TL0 = 0xf0; //設(shè)定初值55536,定時10ms
- IE = 0x82; //開啟T0中斷和總中斷
- TR0 = 1; //開啟定時器T0
- }
- /*******************************
- 中斷處理函數(shù)
- *******************************/
- void Time0() interrupt 1
- {
- static u16 i;
- TH0 = 0xd8;
- TL0 = 0xf0; //重裝初值
- i++; //記下中斷的次數(shù),100次為一秒
- if(100 == i)
- {
- i = 0;
- second++;
- }
- }
- /*******************************
- 延時函數(shù),延時約10μs
- *******************************/
- void delay(u16 i)
- {
- while(i--);
- }
- /*******************************
- 8位數(shù)碼管位選函數(shù)
- *******************************/
- void Digdisplay()
- {
- u8 i;
- for(i = 0; i < 8; i++)
- {
- switch(i)
- {
- case 0:
- LSA = 0; LSB = 0; LSC = 0; break;
- case 1:
- LSA = 1; LSB = 0; LSC = 0; break;
- case 2:
- LSA = 0; LSB = 1; LSC = 0; break;
- case 3:
- LSA = 1; LSB = 1; LSC = 0; break;
- case 4:
- LSA = 0; LSB = 0; LSC = 1; break;
- case 5:
- LSA = 1; LSB = 0; LSC = 1; break;
- case 6:
- LSA = 0; LSB = 1; LSC = 1; break;
- case 7:
- LSA = 1; LSB = 1; LSC = 1; break;
- }
- GPIO_DIG = displaydata[i];
- delay(100);
- GPIO_DIG = 0x00; //消影
- }
- }
- /*******************************
- 交通信號燈控制函數(shù)
- *******************************/
- void trafficpros()
- {
- if(second > 74)
- {
- second = 1;
- }
- //南北方向通車和人行道
- if(second < 32)
- {
- displaydata[0] = 0x00; //第一位數(shù)碼管不顯示
- displaydata[1] = 0x00; //第二位數(shù)碼管不顯示
- displaydata[2] = smgduan[(31 - second)/10];
- displaydata[3] = smgduan[(31 - second)%10];
- displaydata[4] = 0x00; //第五位數(shù)碼管不顯示
- displaydata[5] = 0x00; //第六位數(shù)碼管不顯示
- displaydata[6] = displaydata[2];
- displaydata[7] = displaydata[3];
- Digdisplay();
- //每次先所有的燈進行熄滅
- GPIO_TRAFFIC = 0xff;
- GREEN00 = 1;
- RED00 = 1;
- GREEN10 = 0; //人行道綠燈亮
- GREEN11 = 0; //車道綠燈亮
- RED00 = 0; //東西方向人行道紅燈亮
- RED01 = 0; //東西方向車道紅燈亮
- }
- //中間黃燈階段
- else if(second < 38)
- {
- displaydata[0] = 0x00; //第一位數(shù)碼管不顯示
- displaydata[1] = 0x00; //第二位數(shù)碼管不顯示
- displaydata[2] = smgduan[(37 - second)/10];
- displaydata[3] = smgduan[(37 - second)%10];
- displaydata[4] = 0x00; //第五位數(shù)碼管不顯示
- displaydata[5] = 0x00; //第六位數(shù)碼管不顯示
- displaydata[6] = displaydata[2];
- displaydata[7] = displaydata[3];
- Digdisplay();
- //每次先所有的燈進行熄滅
- GPIO_TRAFFIC = 0xff;
- GREEN00 = 1;
- RED00 = 1;
- RED10 = 0; //南北方向人行道紅燈亮
- YELLOW11 = 0; //南北方向車道黃燈亮
- RED00 = 0; //東西方向人行道紅燈亮
- RED01 = 0; //東西方向車道紅燈亮
- }
- //東西方向通車和人行道
- else if(second < 69)
- {
- displaydata[0] = 0x00; //第一位數(shù)碼管不顯示
- displaydata[1] = 0x00; //第二位數(shù)碼管不顯示
- displaydata[2] = smgduan[(68 - second)/10];
- displaydata[3] = smgduan[(68 - second)%10];
- displaydata[4] = 0x00; //第五位數(shù)碼管不顯示
- displaydata[5] = 0x00; //第六位數(shù)碼管不顯示
- displaydata[6] = displaydata[2];
- displaydata[7] = displaydata[3];
- Digdisplay();
- //每次先所有的燈進行熄滅
- GPIO_TRAFFIC = 0xff;
- GREEN00 = 1;
- RED00 = 1;
-
- GREEN00 = 0; //東西方向人行道綠燈亮
- GREEN01 = 0; //東西方向車道綠燈亮
- RED10 = 0; //南北方向人行道紅燈亮
- RED11 = 0; //南北方向車道紅燈亮
- }
- //中間黃燈階段
- else
- {
- displaydata[0] = 0x00; //第一位數(shù)碼管不顯示
- displaydata[1] = 0x00; //第二位數(shù)碼管不顯示
- displaydata[2] = smgduan[(74 - second)/10];
- displaydata[3] = smgduan[(74 - second)%10];
- displaydata[4] = 0x00; //第五位數(shù)碼管不顯示
- displaydata[5] = 0x00; //第六位數(shù)碼管不顯示
- displaydata[6] = displaydata[2];
- displaydata[7] = displaydata[3];
- Digdisplay();
- //每次先所有的燈進行熄滅
- GPIO_TRAFFIC = 0xff;
- GREEN00 = 1;
- RED00 = 1;
-
- RED00 = 0; //東西方向人行道紅燈亮
- YELLOW01 = 0; //東西方向車道黃燈亮
-
- RED10 = 0; //南北方向人行道紅燈亮
- RED11 = 0; //南北方向車道紅燈亮
- }
- }
復(fù)制代碼
所有資料51hei提供下載:
交通信號燈.rar
(24.3 KB, 下載次數(shù): 66)
2020-4-7 21:32 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|
|