久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 6471|回復(fù): 13
打印 上一主題 下一主題
收起左側(cè)

關(guān)于51單片機(jī)輸出PWM波的問題

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:235664 發(fā)表于 2017-11-26 19:10 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
我用51單片機(jī)輸出PWM時(shí), 將PWM輸出部分放在中斷服務(wù)函數(shù)里面可以正常輸出; 但是如果放在其他部分就不可以了。這是為什么呢?

即, 如下方式可以正常輸出PWM波。


即如下方式不能正常輸出PWM波。




完整代碼如下:

#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int


sbit s1 = P3^1;
sbit s2 = P3^2;
sbit PWM1 = P1^0;


int  count1 = 150;
int time;
void delay_ms(uint z)
{
    uint x,y;
    for(x = z;x > 0;x--)
    for(y = 114;y > 0;y--);
}


void init0()
{
    TMOD = 0x10;//定時(shí)方式一
    TH1 = (65536 - 10) / 256;
    TL1 = (65536 - 10) % 256;
    TR1 = 1;
        EA = 1;
        ET1 = 1;
}


void timer_inter() interrupt 3
{


    TH1 = (65536 - 10) / 256;
    TL1 = (65536 - 10) % 256;


        time++;




        if(time == 250)
        {
                time = 0;
        }
}


void control()
{
        if(s1 == 0)
        {
                delay_ms(10);
                if(s1 == 0)        
                {
                        count1 -= 50;
                }
                while(!s1);
        }
        if(s2 == 0)
        {        
                delay_ms(5);
                if(s2 == 0)
                {
                        count1+= 50;
                }
                while(!s2);
        }
          if(time <= count1)
        {
                PWM1 = 1;        
        }
        else
        {
                PWM1 = 0;
        }
}


void main()
{
        init0();
        while(1)
        {
                control();
        }
}

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:253891 發(fā)表于 2017-11-26 20:17 | 只看該作者
不清楚,可能和c的規(guī)則有關(guān)系
回復(fù)

使用道具 舉報(bào)

板凳
ID:235664 發(fā)表于 2017-11-26 20:55 | 只看該作者
Yusutitsa 發(fā)表于 2017-11-26 20:17
不清楚,可能和c的規(guī)則有關(guān)系

給了我希望又讓我失望
回復(fù)

使用道具 舉報(bào)

地板
ID:219796 發(fā)表于 2017-11-26 21:40 來自手機(jī) | 只看該作者
while(!s1);while(!s2);去掉試試
回復(fù)

使用道具 舉報(bào)

5#
ID:164602 發(fā)表于 2017-11-27 09:06 | 只看該作者
你的說法是不對(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++;
}

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

就是那點(diǎn)不同,卻得到不同的結(jié)果。

分析程序可以知道:你和我都是用的time++,你用的判斷是<=,我作的>=。我們都沒有學(xué)匯編,對(duì)語句執(zhí)行的時(shí)間不了解,中斷在什么時(shí)候發(fā)生就不可預(yù)見。我的語句判斷,是大了就怎么樣,你的判斷是小了就怎么樣。大了,不論大多少,總是可以判斷到的,而小了的判斷,當(dāng)數(shù)據(jù)大了后,就無法判斷,這正是你的程序執(zhí)行不了的原因。
回復(fù)

使用道具 舉報(bào)

6#
ID:235664 發(fā)表于 2017-11-27 15:02 | 只看該作者
HC6800-ES-V2.0 發(fā)表于 2017-11-27 09:06
你的說法是不對(duì)的。
看我的程序:
#include       

首先謝謝你的解答。 但是 我是當(dāng)它小了之后輸出高電平, 大了之后輸出低電平啊。 無論大小都可以檢測(cè)到的啊。
回復(fù)

使用道具 舉報(bào)

7#
ID:235664 發(fā)表于 2017-11-27 15:04 | 只看該作者
謝謝大家的解答, 我今天試的時(shí)候又可以輸出PWM波了;我猜 是不是示波器的問題?  如果有知道答案的歡迎留言
回復(fù)

使用道具 舉報(bào)

8#
ID:235664 發(fā)表于 2017-11-27 15:06 | 只看該作者
sldx 發(fā)表于 2017-11-26 21:40
while(!s1);while(!s2);去掉試試

這個(gè)是按鍵松手檢測(cè)啊, 和定時(shí)器有什么問題嗎? 就算程序一直卡在這里, 無法執(zhí)行后面的, 但是也會(huì)進(jìn)入中斷服務(wù)函數(shù)的,  而且我是在 沒有按按鍵的情況下輸出不了PWM波(這個(gè)不好意思, 問題沒有說清楚 /尷尬)
回復(fù)

使用道具 舉報(bào)

9#
ID:508386 發(fā)表于 2019-7-7 08:25 | 只看該作者
sldx 發(fā)表于 2017-11-26 21:40
while(!s1);while(!s2);去掉試試

加上WHILE是因?yàn)榈却存I結(jié)束,不過不加,就會(huì)一直判斷按下,一直執(zhí)行判斷
回復(fù)

使用道具 舉報(bào)

10#
ID:564631 發(fā)表于 2019-7-7 11:20 | 只看該作者
注意的是不斷地產(chǎn)生中斷,對(duì)于按鍵的判斷還有外面的的執(zhí)行有一定的影響,畢竟每次中斷的時(shí)間都很短,所以建議在中斷服務(wù)程序里面首先停止中斷服務(wù),等運(yùn)行完任務(wù)后再開啟,這樣比較好
回復(fù)

使用道具 舉報(bào)

11#
ID:332444 發(fā)表于 2019-7-7 12:36 | 只看該作者
按鈕和PWM波都放到中斷外,不要什么都往中斷仍,中斷越輕量級(jí)越好https://bbs.csdn.net/topics/392742676
回復(fù)

使用道具 舉報(bào)

12#
ID:93224 發(fā)表于 2019-7-7 13:31 | 只看該作者
中斷里面實(shí)時(shí)性高
回復(fù)

使用道具 舉報(bào)

13#
ID:478635 發(fā)表于 2019-7-7 15:12 | 只看該作者
應(yīng)該也可以的,只是時(shí)間不對(duì)了
回復(fù)

使用道具 舉報(bào)

14#
ID:482935 發(fā)表于 2020-5-15 17:25 來自手機(jī) | 只看該作者
你放到while(1)里就變成大概3微秒掃描到一次這部分,改變一次pwm高低信號(hào) 1或 0,你定時(shí)器里卻要10微秒才改變一次單位步進(jìn)值time,不同步了。按道理你10微秒time加1,和10微秒進(jìn)來改變pwm信號(hào)要一起做。你分開掃描一個(gè)在主函數(shù)里很快做,一個(gè)在定時(shí)器里10微秒才做肯定不行。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 羞羞视频网站免费看 | 午夜精品在线 | 欧美亚洲视频在线观看 | 国产高清一区二区三区 | 2021天天躁夜夜看 | 亚洲综合精品 | 成人3d动漫一区二区三区91 | 国产成人精品免费视频大全最热 | 日韩欧美亚洲 | 中国xxxx性xxxx产国 | 91色站 | 亚洲成a| 国产精品国产三级国产aⅴ中文 | 毛片区 | 免费激情网站 | 亚洲综合大片69999 | 老牛嫩草一区二区三区av | 华人黄网站大全 | 国产精品久久久久久吹潮 | 一区二区三区四区国产精品 | 国产精品一区一区三区 | 中文字幕在线一区 | 91精品在线播放 | 久久久久久国产精品免费免费狐狸 | 成人免费在线视频 | 国产午夜精品一区二区三区四区 | 操操日| 欧美精品一区二区在线观看 | 97精品国产97久久久久久免费 | 日韩高清成人 | 黄色免费在线观看网址 | 国产精品久久久爽爽爽麻豆色哟哟 | 亚洲高清在线 | 我要看免费一级毛片 | 亚洲国产免费 | 亚洲 中文 欧美 日韩 在线观看 | 亚洲精品视频一区二区三区 | 精品久久久久香蕉网 | 日韩精品久久久久久 | 欧美国产日韩在线观看 | 精品美女 |