|
剛學(xué)51單片機(jī),寫了一個(gè)通過按鍵減小輸出方波的占空比的程序,按下K1在原有方波基礎(chǔ)上減小10%占空比,按下K2在原有方波基礎(chǔ)上減小20%的占空比,在未按任何按鍵之前有輸出周期為10ms的方波,晶振頻率為12Mhz。但是在按下按鍵之后占空比變化超出設(shè)計(jì),為什么會(huì)這樣呢?
- #include<reg52.h>
- unsigned char P10ms=0; //定義10ms計(jì)數(shù)器,并清零賦值
- typedef unsigned char u16;
- sbit K1=P3^1; //獨(dú)立按鍵K1的端口定義
- sbit K2=P3^2; //獨(dú)立按鍵K2的端口定義
- sbit P10=P2^0; //定義P1為P2^0從21引腳輸出
- void delay(u16 t) //延時(shí)函數(shù)
- {
- while(t--);
- }
- void keypress1() //定義按鍵1函數(shù)
- {
- if(K1==0) //判斷K1是否按下
- {
- delay(1000); //消抖
- if(K1==0)
- {
- TH1=0x06; //重置T1定時(shí)初值為25us
- TL1=0x06; //重置T1定時(shí)初值為25us
- if(P10==1) P10=0; //若P1.0為高電平,則P1.0轉(zhuǎn)為低電平
- else
- {
- P10ms++; //若1.0位低電平,則1ms計(jì)數(shù)
- if(P10ms==36) //判斷9ms是否滿足,及實(shí)現(xiàn)減小10%的占空比
- {
- P10=1; //滿足9ms,P1.0轉(zhuǎn)為高電平
- P10ms=0; //10ms計(jì)數(shù)器清零
- }
- }
- }
- }
- }
- void keypress2() //定義按建2函數(shù)
- {
- if(K2==0) //判斷K2是否按下
- {
- delay(1000); //消抖
- if(K2==0)
- {
- TH1=0x06; //重置T0定時(shí)初值為25us
- TL1=0x06; //重置T0定時(shí)初值為25us
- if(P10==1) P10=0; //若P1.0為高電平,則P1.0轉(zhuǎn)為低電平
- else
- {
- P10ms++; //若1.0位低電平,則1ms計(jì)數(shù)
- if(P10ms==32) //判斷是否達(dá)到8ms,即實(shí)現(xiàn)減小20%的占空比
- {
- P10=1; //滿足8ms,P1.0轉(zhuǎn)為高電平
- P10ms=0; //10ms計(jì)數(shù)清零
- }
- }
- }
- }
- }
- void main()
- {
- TMOD=0x20; //TMOD=00100000B,置T1定時(shí)器方式2
- TH1=0x06; //置T1定時(shí)初值250us
- TL1=0x06; //置T1定時(shí)初值250us
- IP=0x08; //IP=00001000B,置T1為高優(yōu)先級(jí)
- IE=0xff; //IE=11111111B,全部開中
- TR1=1; //T1運(yùn)行
- P10=0; //脈沖方波初始輸出為低電平
- while(1); //無限循環(huán),等待T1中斷
- }
- void t1() interrupt 3
- {
- if(K1==1&&K2==1) //判斷K1和K2是否按下,
- {
- P10ms++; //開始計(jì)數(shù)
- if(P10ms==20) //若10ms計(jì)數(shù)器到位,則
- {
- P10=!P10; //P1.0引腳端輸出電平取反(輸出周期10ms脈沖方波,占空比為50%)
- P10ms=0; //10ms計(jì)數(shù)器清0
- }
- }
- else
- {
- keypress1();
- keypress2();
- }
- }
復(fù)制代碼
|
|