基于51單片機的航標燈硬件部分 實驗原理圖 示波器模擬波形 ①第一種波形 Key1置’0’ Key0置’0’ ②第二種波形 Key1置’0’ Key0置’1’ ③第三種波形 Key1置’1’ Key0置’0’ ④第四種波形 Key1置’1’ Key0置’1’ 
單片機源碼:
- #include "reg51.h"
- #define COUNT_50MS 500 //focs=12MHz T=1us 50ms gcd:50ms的倍數
- #define D_OPEN 1 //開燈
- #define D_CLOSE !D_OPEN //關燈
- sbit D=P0^0; //燈輸出控制,高電平有效
- sbit OPCON=P1^2;//光照檢測 ,低電平有效(晚上)
- sbit Key0=P1^0;
- sbit Key1=P1^1;
- //結構體類型聲明1
- struct IALA
- {
- unsigned char gcd; //各時間間隔最大公約數
- unsigned char state[6]; //無符號字符型時間常數
- };
- unsigned int State[6];
- //結構體全局變量定義,code:常數
- struct IALA code IALA4[4]={
-
- { 0,0,0,0,0,0,0},
- {10,1,3,0,0,0,0},
- {10,1,1,1,7,0,0},
- {10,1,2,1,2,1,5}
- };
- //T0_初始化函數
- void T0_Init(void)
- {
- TMOD=(TMOD&0xf0)|0x01;
- TH0=(65536-COUNT_50MS)/256;
- TL0=(65536-COUNT_50MS)%256;
- ET0=1; //中斷使能
- EA=1;
- TR0=1; //T0啟動
- }
- //T0_ISR程序
- unsigned int it=0;
- void T0_ISR(void) interrupt 1
- {
- unsigned char j;
- TH0=(65536-COUNT_50MS)/256;
- TL0=(65536-COUNT_50MS)%256;
- if(OPCON==0)//黑夜、暗照度
- {
- it++;
- for(j=0;j<6;j++)
- { if(it==State[j])
- D=(j%2)?D_OPEN:D_CLOSE; //判斷是開燈還是關燈狀態
- }
- if(it>=State[5])
- {
- it=0;
- }
- }
- else //白天、亮照度
- {
- D=D_CLOSE;
- it = 0;
- }
- }
- //按鍵判斷
- unsigned char GetKey()
- {
- unsigned char key;
- if(Key1==0&&Key0==0)
- {
- key=0;
- }
- else if(Key1==0&&Key0==1)
- {
- key=1;
- }
- else if(Key1==1&&Key0==0)
- {
- key=2;
- }
- else if(Key1==1&&Key0==1)
- {
- key=3;
- }
- return(key);
- }
- void main(void)
- {
- unsigned char key,pre_key=0,i;
- unsigned int sum;
- T0_Init();
- D=0;
- while(1)
- {
- key=GetKey(); //獲取key1、Key0特征碼
- if(key!=pre_key) //若有新的按鍵,載入控燈時間
- {
- sum=0;
- for(i=0;i<6;i++)
- {
- sum=sum+IALA4[key].gcd*IALA4[key].state[i];
- State[i]=sum;
- }
- }
- pre_key=key;
- }
- }
復制代碼
完整的Word格式文檔51黑下載地址:
實驗三 航標燈.doc
(178.5 KB, 下載次數: 19)
2018-6-25 01:07 上傳
點擊文件名下載附件
航標燈 下載積分: 黑幣 -5
|