標題:
為什么程實現(xiàn)不了,是哪里有錯誤呢
[打印本頁]
作者:
查理九世
時間:
2019-3-9 23:32
標題:
為什么程實現(xiàn)不了,是哪里有錯誤呢
剛學51單片機,寫了一個通過按鍵減小輸出方波的占空比的程序,按下K1在原有方波基礎上減小10%占空比,按下K2在原有方波基礎上減小20%的占空比,在未按任何按鍵之前有輸出周期為10ms的方波,晶振頻率為12Mhz。但是在按下按鍵之后占空比變化超出設計,為什么會這樣呢?
#include<reg52.h>
unsigned char P10ms=0; //定義10ms計數(shù)器,并清零賦值
typedef unsigned char u16;
sbit K1=P3^1; //獨立按鍵K1的端口定義
sbit K2=P3^2; //獨立按鍵K2的端口定義
sbit P10=P2^0; //定義P1為P2^0從21引腳輸出
void delay(u16 t) //延時函數(shù)
{
while(t--);
}
void keypress1() //定義按鍵1函數(shù)
{
if(K1==0) //判斷K1是否按下
{
delay(1000); //消抖
if(K1==0)
{
TH1=0x06; //重置T1定時初值為25us
TL1=0x06; //重置T1定時初值為25us
if(P10==1) P10=0; //若P1.0為高電平,則P1.0轉為低電平
else
{
P10ms++; //若1.0位低電平,則1ms計數(shù)
if(P10ms==36) //判斷9ms是否滿足,及實現(xiàn)減小10%的占空比
{
P10=1; //滿足9ms,P1.0轉為高電平
P10ms=0; //10ms計數(shù)器清零
}
}
}
}
}
void keypress2() //定義按建2函數(shù)
{
if(K2==0) //判斷K2是否按下
{
delay(1000); //消抖
if(K2==0)
{
TH1=0x06; //重置T0定時初值為25us
TL1=0x06; //重置T0定時初值為25us
if(P10==1) P10=0; //若P1.0為高電平,則P1.0轉為低電平
else
{
P10ms++; //若1.0位低電平,則1ms計數(shù)
if(P10ms==32) //判斷是否達到8ms,即實現(xiàn)減小20%的占空比
{
P10=1; //滿足8ms,P1.0轉為高電平
P10ms=0; //10ms計數(shù)清零
}
}
}
}
}
void main()
{
TMOD=0x20; //TMOD=00100000B,置T1定時器方式2
TH1=0x06; //置T1定時初值250us
TL1=0x06; //置T1定時初值250us
IP=0x08; //IP=00001000B,置T1為高優(yōu)先級
IE=0xff; //IE=11111111B,全部開中
TR1=1; //T1運行
P10=0; //脈沖方波初始輸出為低電平
while(1); //無限循環(huán),等待T1中斷
}
void t1() interrupt 3
{
if(K1==1&&K2==1) //判斷K1和K2是否按下,
{
P10ms++; //開始計數(shù)
if(P10ms==20) //若10ms計數(shù)器到位,則
{
P10=!P10; //P1.0引腳端輸出電平取反(輸出周期10ms脈沖方波,占空比為50%)
P10ms=0; //10ms計數(shù)器清0
}
}
else
{
keypress1();
keypress2();
}
}
復制代碼
極速截圖201903092330.png
(61.81 KB, 下載次數(shù): 73)
下載附件
2019-3-9 23:31 上傳
作者:
zhb2004xp
時間:
2019-3-10 00:13
按鍵松開的動作沒有檢測
在30行和53行前插入 while(!k1);和 while(!k2);
作者:
黑黑—坤
時間:
2019-3-10 00:24
中斷函數(shù)運行delay()函數(shù)時間太長了吧!
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1