熱門(mén): 51單片機(jī) | 24小時(shí)必答區(qū) | 單片機(jī)教程 | 單片機(jī)DIY制作 | STM32 | Cortex M3 | 模數(shù)電子 | 電子DIY制作 | 音響/功放 | 拆機(jī)樂(lè)園 | Arduino | 嵌入式OS | 程序設(shè)計(jì)
![]() |
發(fā)布時(shí)間: 2017-11-26 19:10
正文摘要:我用51單片機(jī)輸出PWM時(shí), 將PWM輸出部分放在中斷服務(wù)函數(shù)里面可以正常輸出; 但是如果放在其他部分就不可以了。這是為什么呢? 即, 如下方式可以正常輸出PWM波。 完整代碼如下: #include<reg ... |
你放到while(1)里就變成大概3微秒掃描到一次這部分,改變一次pwm高低信號(hào) 1或 0,你定時(shí)器里卻要10微秒才改變一次單位步進(jìn)值time,不同步了。按道理你10微秒time加1,和10微秒進(jìn)來(lái)改變pwm信號(hào)要一起做。你分開(kāi)掃描一個(gè)在主函數(shù)里很快做,一個(gè)在定時(shí)器里10微秒才做肯定不行。 |
應(yīng)該也可以的,只是時(shí)間不對(duì)了 |
中斷里面實(shí)時(shí)性高 |
按鈕和PWM波都放到中斷外,不要什么都往中斷仍,中斷越輕量級(jí)越好https://bbs.csdn.net/topics/392742676 |
注意的是不斷地產(chǎn)生中斷,對(duì)于按鍵的判斷還有外面的的執(zhí)行有一定的影響,畢竟每次中斷的時(shí)間都很短,所以建議在中斷服務(wù)程序里面首先停止中斷服務(wù),等運(yùn)行完任務(wù)后再開(kāi)啟,這樣比較好 |
sldx 發(fā)表于 2017-11-26 21:40 加上WHILE是因?yàn)榈却存I結(jié)束,不過(guò)不加,就會(huì)一直判斷按下,一直執(zhí)行判斷 |
sldx 發(fā)表于 2017-11-26 21:40 這個(gè)是按鍵松手檢測(cè)啊, 和定時(shí)器有什么問(wèn)題嗎? 就算程序一直卡在這里, 無(wú)法執(zhí)行后面的, 但是也會(huì)進(jìn)入中斷服務(wù)函數(shù)的, 而且我是在 沒(méi)有按按鍵的情況下輸出不了PWM波(這個(gè)不好意思, 問(wèn)題沒(méi)有說(shuō)清楚 /尷尬) |
謝謝大家的解答, 我今天試的時(shí)候又可以輸出PWM波了;我猜 是不是示波器的問(wèn)題? 如果有知道答案的歡迎留言 |
HC6800-ES-V2.0 發(fā)表于 2017-11-27 09:06 首先謝謝你的解答。 但是 我是當(dāng)它小了之后輸出高電平, 大了之后輸出低電平啊。 無(wú)論大小都可以檢測(cè)到的啊。 |
你的說(shuō)法是不對(duì)的。 看我的程序: #include<reg51.h> #define LED P2 unsigned int T=0,Tt=500,i=0,Ii=100,j=0; bit A=1; void TimeConfig(); void main(void) { TimeConfig(); while(1) { if (T>=Tt) { T=0; } if (i>=Ii) { i=0; if (A==1) { j++; } else { j--; } } if (j==Tt) { A=0; } if (j==0) { A=1; } if (T<=j) { LED=0x00; } else { LED=0xff; } } } void TimeConfig() { TMOD = 0x01; TH0 = 0xff; TL0 = 0xff; EA = 1; ET0 = 1; TR0 = 1; } void Time0() interrupt 1 { TH0 = 0xff; TL0 = 0xff; T++; i++; } 看出我們的程序有什么不同了沒(méi)? 就是那點(diǎn)不同,卻得到不同的結(jié)果。 分析程序可以知道:你和我都是用的time++,你用的判斷是<=,我作的>=。我們都沒(méi)有學(xué)匯編,對(duì)語(yǔ)句執(zhí)行的時(shí)間不了解,中斷在什么時(shí)候發(fā)生就不可預(yù)見(jiàn)。我的語(yǔ)句判斷,是大了就怎么樣,你的判斷是小了就怎么樣。大了,不論大多少,總是可以判斷到的,而小了的判斷,當(dāng)數(shù)據(jù)大了后,就無(wú)法判斷,這正是你的程序執(zhí)行不了的原因。 |
while(!s1);while(!s2);去掉試試 |
Yusutitsa 發(fā)表于 2017-11-26 20:17 給了我希望又讓我失望 |
不清楚,可能和c的規(guī)則有關(guān)系 |
Powered by 單片機(jī)教程網(wǎng)