![]() |
發(fā)布時間: 2019-4-8 10:00
正文摘要:源程序如下,用示波器看,PWM頻率是2500Hz,不知道哪里出了問題。晶振設(shè)置的是11.0592MHz #include <reg51.h> #define uchar unsigned char #define uint unsigned int sbit PWM=P0^0; sbit k1=P2^0; uc ... |
可以用現(xiàn)成的定時器生成器! void Timer0Init(void) //100微秒@11.0592MHz { EA=1; ET0=1; AUXR &= 0x7F; //定時器時鐘12T模式 TMOD &= 0xF0; //設(shè)置定時器模式 TMOD |= 0x01; //設(shè)置定時器模式 TL0 = 0xA4; //設(shè)置定時初值 TH0 = 0xFF; //設(shè)置定時初值 TF0 = 0; //清除TF0標(biāo)志 TR0 = 1; //定時器0開始計時 } EA=1; ET0=1; 這兩句在開始位,如在結(jié)束位,有什么不同. |
hhh402 發(fā)表于 2019-4-10 13:30 多謝 |
只是51單片機(jī)速度太慢造成的,中斷時間太短還沒有運(yùn)算完。改成1kHZ頻率,如果仿真正常就說明這個判斷是對的,或者把單片機(jī)晶振改成30MHZ,如果這時示波器檢測的頻率大于2500HZ也能說明是51單片機(jī)速度太慢造成的。 |
LIZHIZHI1 發(fā)表于 2019-4-9 20:51 這個程序放那里?大佬 |
LIZHIZHI1 發(fā)表于 2019-4-9 20:51 我試試 |
可以用現(xiàn)成的定時器生成器! void Timer0Init(void) //100微秒@11.0592MHz { EA=1; ET0=1; AUXR &= 0x7F; //定時器時鐘12T模式 TMOD &= 0xF0; //設(shè)置定時器模式 TMOD |= 0x01; //設(shè)置定時器模式 TL0 = 0xA4; //設(shè)置定時初值 TH0 = 0xFF; //設(shè)置定時初值 TF0 = 0; //清除TF0標(biāo)志 TR0 = 1; //定時器0開始計時 } 這個很正確! |
robinsonlin 發(fā)表于 2019-4-9 13:10 我就是定的0.1ms啊 |
assor 發(fā)表于 2019-4-8 21:02 昨天回車鍵敲快了。 圖片沒有貼上去。 |
STC.jpg (206.75 KB, 下載次數(shù): 64)
wxxl 發(fā)表于 2019-4-8 12:15 不太懂 ![]() |
暖色系GD_ALIU 發(fā)表于 2019-4-8 15:19 模擬的就做不到10K嗎 |
robinsonlin 發(fā)表于 2019-4-8 12:49 初值怎么不對了,大佬。 |
定時器初值問題吧.下載工具里就有定時器代碼生成器,輸入?yún)?shù)直接復(fù)制就行了. |
你首先算一下10us的中斷周期,CPU執(zhí)行中斷里的語句時間夠不夠就明白是怎么回事了。 |
你這個是模擬PWM |
這個你需要考慮下進(jìn)入中斷的最小時間,如果最小時間計算不能做到10Khz,那就是不可以 |
另外,你的計時器初值好像也不對, 試試 |
中斷里面除法運(yùn)算,你以為這些都不占用時間的么? |
可以用現(xiàn)成的定時器生成器! void Timer0Init(void) //100微秒@11.0592MHz { EA=1; ET0=1; AUXR &= 0x7F; //定時器時鐘12T模式 TMOD &= 0xF0; //設(shè)置定時器模式 TMOD |= 0x01; //設(shè)置定時器模式 TL0 = 0xA4; //設(shè)置定時初值 TH0 = 0xFF; //設(shè)置定時初值 TF0 = 0; //清除TF0標(biāo)志 TR0 = 1; //定時器0開始計時 } |
飛機(jī)翻筋斗 發(fā)表于 2019-4-8 10:58 設(shè)置了其他的,也是一樣的。我程序沒寫錯吧 |
設(shè)置成50us電平翻轉(zhuǎn)試試![]() |
Powered by 單片機(jī)教程網(wǎng)