欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索

關于51單片機輸出PWM波的問題

查看數: 6941 | 評論數: 13 | 收藏 0
關燈 | 提示:支持鍵盤翻頁<-左 右->
    組圖打開中,請稍候......
發(fā)布時間: 2017-11-26 19:10

正文摘要:

我用51單片機輸出PWM時, 將PWM輸出部分放在中斷服務函數里面可以正常輸出; 但是如果放在其他部分就不可以了。這是為什么呢? 即, 如下方式可以正常輸出PWM波。 完整代碼如下: #include<reg ...

回復

ID:482935 發(fā)表于 2020-5-15 17:25
你放到while(1)里就變成大概3微秒掃描到一次這部分,改變一次pwm高低信號 1或 0,你定時器里卻要10微秒才改變一次單位步進值time,不同步了。按道理你10微秒time加1,和10微秒進來改變pwm信號要一起做。你分開掃描一個在主函數里很快做,一個在定時器里10微秒才做肯定不行。
ID:478635 發(fā)表于 2019-7-7 15:12
應該也可以的,只是時間不對了
ID:93224 發(fā)表于 2019-7-7 13:31
中斷里面實時性高
ID:332444 發(fā)表于 2019-7-7 12:36
按鈕和PWM波都放到中斷外,不要什么都往中斷仍,中斷越輕量級越好https://bbs.csdn.net/topics/392742676
ID:564631 發(fā)表于 2019-7-7 11:20
注意的是不斷地產生中斷,對于按鍵的判斷還有外面的的執(zhí)行有一定的影響,畢竟每次中斷的時間都很短,所以建議在中斷服務程序里面首先停止中斷服務,等運行完任務后再開啟,這樣比較好
ID:508386 發(fā)表于 2019-7-7 08:25
sldx 發(fā)表于 2017-11-26 21:40
while(!s1);while(!s2);去掉試試

加上WHILE是因為等待按鍵結束,不過不加,就會一直判斷按下,一直執(zhí)行判斷
ID:235664 發(fā)表于 2017-11-27 15:06
sldx 發(fā)表于 2017-11-26 21:40
while(!s1);while(!s2);去掉試試

這個是按鍵松手檢測啊, 和定時器有什么問題嗎? 就算程序一直卡在這里, 無法執(zhí)行后面的, 但是也會進入中斷服務函數的,  而且我是在 沒有按按鍵的情況下輸出不了PWM波(這個不好意思, 問題沒有說清楚 /尷尬)
ID:235664 發(fā)表于 2017-11-27 15:04
謝謝大家的解答, 我今天試的時候又可以輸出PWM波了;我猜 是不是示波器的問題?  如果有知道答案的歡迎留言
ID:235664 發(fā)表于 2017-11-27 15:02
HC6800-ES-V2.0 發(fā)表于 2017-11-27 09:06
你的說法是不對的。
看我的程序:
#include       

首先謝謝你的解答。 但是 我是當它小了之后輸出高電平, 大了之后輸出低電平啊。 無論大小都可以檢測到的啊。
ID:164602 發(fā)表于 2017-11-27 09:06
你的說法是不對的。
看我的程序:
#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++;
}

看出我們的程序有什么不同了沒?

就是那點不同,卻得到不同的結果。

分析程序可以知道:你和我都是用的time++,你用的判斷是<=,我作的>=。我們都沒有學匯編,對語句執(zhí)行的時間不了解,中斷在什么時候發(fā)生就不可預見。我的語句判斷,是大了就怎么樣,你的判斷是小了就怎么樣。大了,不論大多少,總是可以判斷到的,而小了的判斷,當數據大了后,就無法判斷,這正是你的程序執(zhí)行不了的原因。
ID:219796 發(fā)表于 2017-11-26 21:40
while(!s1);while(!s2);去掉試試
ID:235664 發(fā)表于 2017-11-26 20:55
Yusutitsa 發(fā)表于 2017-11-26 20:17
不清楚,可能和c的規(guī)則有關系

給了我希望又讓我失望
ID:253891 發(fā)表于 2017-11-26 20:17
不清楚,可能和c的規(guī)則有關系

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表