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

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

QQ登錄

只需一步,快速開始

搜索
查看: 2406|回復(fù): 6
收起左側(cè)

51單片機(jī)利用定時(shí)器中斷產(chǎn)生PWM,有時(shí)無法進(jìn)入中斷服務(wù)程序

[復(fù)制鏈接]
ID:871316 發(fā)表于 2020-12-31 08:50 | 顯示全部樓層 |閱讀模式
我想通過51單片機(jī)控制舵機(jī),通過一個(gè)開關(guān)與一個(gè)距離傳感器控制舵機(jī)角度。程序運(yùn)行后,pwm正常輸出,但是經(jīng)過幾次角度改變后,pwm就無法產(chǎn)生了。請(qǐng)教一下是什么原因,下面是源代碼,希望大家多多指教,多謝了!

#include "reg51.h"
#include "intrins.h"

#define uint unsigned int;
#define lint long int;

uint jd , count , time;
lint S;

void delay1(unsigned int i)  //長延時(shí)函數(shù),ms級(jí),不準(zhǔn)確
{
  unsigned int j,k;
  for(j=i;j>0;j--)
    for(k=125;k>0;k--);
}

void delay()                                    //短延時(shí)函數(shù),us級(jí),相對(duì)精確,本函數(shù)為延時(shí)21us
{
        _nop_();
        _nop_();
        _nop_();
        _nop_();       
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
}

void Time_init()        //兩個(gè)計(jì)數(shù)器與定時(shí)器的初始化
{
        TMOD = 0x11;                     //Time1工作模式1,Time0工作模式1
        TH0 = 0xfe;      
        TL0 = 0x33;                      //設(shè)置time0計(jì)數(shù)初值,定時(shí)0.5ms
        TH1 = 0;
        TL1 = 0;                         //設(shè)置time1計(jì)數(shù)初值,等待觸發(fā)
        TR0 = 1;                         //Time0開始計(jì)數(shù)
        ET0 = 1;                         //打開Time0的中斷
        ET1 = 1;                        //打開Time1的中斷
        EA = 1;                         //開啟總中斷
}

long Distence()
{
        time = TH1*256+TL1;
        TH1 = 0;
        TL1 = 0;
        S = (long)(time*0.017);     //算出來是cm
        return S;
        //if(S >= 20)
        //        return 0;
        //else
        //        return 1;
}

void Time0_Int() interrupt 1   //定時(shí)器0的中斷服務(wù)程序
{
        TH0 = 0xfe;             //定時(shí)器重填,重新計(jì)時(shí)
        TL0 = 0x33;
        if(count < jd)              //判斷0.5ms計(jì)時(shí)的次數(shù)
                pwm = 1;                  //PWM輸出高電平,控制占空比
        else
                pwm = 0;                  //PWM輸出低電平,控制占空比
        count = (count + 1);          //控制脈沖周期為20ms
        count = count%41;
        WDT_CONTR = 0x35;            //目前解決定時(shí)中斷無法進(jìn)入的方法是添加看門狗,此行為喂狗
}

void keyscan()              //微動(dòng)開關(guān)與虛擬開關(guān)按鍵處理(微動(dòng)開關(guān),按下置0,松開置1)
{  
        if(D_SW == 0)               //如果超聲檢測(cè)到有物體
        {
                delay1(50);
                if(D_SW == 0)
                {
                        jd = 1;                 //高電平0.5ms,舵機(jī)角度為-90
                        led = 1;
                }
        }
        else if(S_SW == 0)          //微動(dòng)開關(guān)觸發(fā),檢測(cè)到有物體
        {
                delay1(20);
                if(S_SW == 0)
                {
                        jd = 3;                 //高電平1.5ms,舵機(jī)角度0
                        led = 0;
                }
        }
        else
        {
                jd = 1;
                led = 1;
        }
}

void main()
{
        long sw = 0;                                //變量初始化
        jd = 1;
        count = 0;
        time = 0;
        S = 0;
        Time_init();                                //定時(shí)器初始化
        WDT_CONTR = 0x35;   //看門狗初始化
        while(1)
        {
                TR0 = 1;
                ET0 = 1;
                TX = 1;
                delay();        
                TX = 0;            //使能超聲波模塊
                while(!RX);        //當(dāng)RX為零時(shí)等待
                TR1 = 1;           //開啟計(jì)數(shù)
                while(RX);         //當(dāng)RX為1計(jì)數(shù)并等待
                TR1 = 0;           //關(guān)閉計(jì)數(shù)
                sw = Distence();           //計(jì)算
                if(sw >= 20)
                        D_SW = 1;
                else
                        D_SW = 0;
                keyscan();
        }
}       

回復(fù)

使用道具 舉報(bào)

ID:390416 發(fā)表于 2020-12-31 10:36 | 顯示全部樓層
《人人學(xué)會(huì)單片機(jī)》視頻教程里面講過了超聲波測(cè)距。你應(yīng)該把定時(shí)器做成1mm的長度或者10mm的長度。
回復(fù)

使用道具 舉報(bào)

ID:390416 發(fā)表于 2020-12-31 10:37 | 顯示全部樓層
這樣,定時(shí)器中斷多少次,就直接表示多少mm了。這樣就不用 while(RX);這種死等代碼了。
回復(fù)

使用道具 舉報(bào)

ID:390416 發(fā)表于 2020-12-31 10:37 | 顯示全部樓層
你寫的這樣的代碼 最容易進(jìn)入死循環(huán)。
回復(fù)

使用道具 舉報(bào)

ID:871316 發(fā)表于 2020-12-31 10:51 | 顯示全部樓層
人人學(xué)會(huì)單片機(jī) 發(fā)表于 2020-12-31 10:37
你寫的這樣的代碼 最容易進(jìn)入死循環(huán)。

好的,我試一下,謝謝!
回復(fù)

使用道具 舉報(bào)

ID:871316 發(fā)表于 2020-12-31 10:53 | 顯示全部樓層
人人學(xué)會(huì)單片機(jī) 發(fā)表于 2020-12-31 10:37
你寫的這樣的代碼 最容易進(jìn)入死循環(huán)。

我還想問一個(gè)問題,程序進(jìn)入死循環(huán),定時(shí)器中斷就不起作用了嗎
回復(fù)

使用道具 舉報(bào)

ID:871316 發(fā)表于 2021-1-6 16:30 | 顯示全部樓層
人人學(xué)會(huì)單片機(jī) 發(fā)表于 2020-12-31 10:37
你寫的這樣的代碼 最容易進(jìn)入死循環(huán)。

我試了一下,很完美!多謝多謝!
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 成人3d动漫一区二区三区91 | 午夜极品| 美女艹b| 涩爱av一区二区三区 | 成人妇女免费播放久久久 | 国产精品久久久久久一区二区三区 | 视频一区二区三区中文字幕 | 蜜桃毛片| 日韩福利| 99视频在线免费观看 | 91av亚洲| 国产精品美女久久久久久久久久久 | 日韩视频中文字幕 | 夜夜骚| 日本电影一区二区 | 日韩视频免费看 | 精品一区二区三区在线观看国产 | 国产精品久久久久免费 | 国产美女在线观看 | 欧美一区二区三区在线看 | 中文字幕视频在线免费 | 成人在线观看亚洲 | 荷兰欧美一级毛片 | 日韩欧美一区在线 | 国产一区二区影院 | 久久久高清| 2022精品国偷自产免费观看 | 日韩中文字幕免费 | 黄色一级电影免费观看 | 中文字幕三区 | 色一级 | 精品日韩在线观看 | 国产美女在线播放 | 欧美精品久久久 | 九九热最新地址 | 亚洲a在线观看 | 久久久网 | 国产成人精品免费视频大全最热 | 欧美一级片在线播放 | 中文成人无字幕乱码精品 | 亚洲视频在线看 |