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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3127|回復: 11
打印 上一主題 下一主題
收起左側

51單片機定時器中斷問題

[復制鏈接]
跳轉到指定樓層
樓主
ID:917597 發表于 2021-12-2 11:32 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
新人,關于定時器中斷有些疑問。之前看一些教程會了一些簡單的使用,像用定時器中斷控制燈閃爍時間之類的。最近在嘗試控制直流電機,用PWM控制直流電機正反轉調速。因為89C51單片機沒有專門的PWM模塊嘛,要用定時器中斷來模擬PWM波。
我如果要任意的控制這個PWM波輸出腳,輸出一段時間低電平,然后輸出PWM波,一段時間后又低電平。這樣定時器中斷函數該怎么寫呢?在中斷函數里面用if條件判斷來執行不同的語句嗎?如果某標志位為1或者按鍵按下之類的,輸出低電平,否則就正常輸出PWM波?感覺如果邏輯比較復雜的話這個中斷函數好難寫。能不能將中斷函數寫成像普通函數一樣可以隨時調用的呢?之前看的一些簡單例程整段代碼就光只有定時器中斷,定時器中斷它是全局的獨立于主函數一直在跑(我是這么理解的),又不知道怎么可以讓他隨時調用。有沒有大佬能給我答疑解惑。
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:578842 發表于 2021-12-2 12:45 | 只看該作者
我只是說一點建議,定時計數器中斷最好不要放入太大的程序,最好用標志位軟件定時,PWM最好封裝一個函數,在主函數大循環中調用。然后你就可以自由使用了
回復

使用道具 舉報

板凳
ID:624769 發表于 2021-12-2 14:16 | 只看該作者
假定 你模擬 PWM  用的 T2, 控制P10口,

開多一個定時器,比如定時器0,優先級要低于 T2中斷,在中斷里面計數,計數時間到了之后。
TR2 = 0;
TF2 = 0;
P10 = 0;

過一段時間要繼續輸出 PWM 了 再 TR2 = 1; 即可
回復

使用道具 舉報

地板
ID:917597 發表于 2021-12-2 18:29 | 只看該作者
wps10025 發表于 2021-12-2 12:45
我只是說一點建議,定時計數器中斷最好不要放入太大的程序,最好用標志位軟件定時,PWM最好封裝一個函數, ...

定時器中斷函數不是放在整段程序最后面嗎?我想了一下不知道怎么把PWM封成一個函數。要如何操作?
回復

使用道具 舉報

5#
ID:612392 發表于 2021-12-2 19:30 | 只看該作者
jsezcyc 發表于 2021-12-2 18:29
定時器中斷函數不是放在整段程序最后面嗎?我想了一下不知道怎么把PWM封成一個函數。要如何操作?

他的意思是,增加一個PWM電平轉換的標志位,在定時器中斷函數里,只負責判斷是否進行電平轉換,然后將標志位置1,就退出中斷程序。再將你需要進行PWM的操作,單獨做一個子函數,在main函數里不斷地查詢這個PWM電平轉換標志位是否生效,生效則運行PWM子函數,不生效則不運行。
這樣程序運行效率高,不同的中斷之中不容易出現沖突,不會出現由于中斷程序過長,導致中斷程序還沒結束,下一次中斷又來了,卡在中斷里出不來了。
回復

使用道具 舉報

6#
ID:983476 發表于 2021-12-2 20:24 | 只看該作者
這個你在中斷服務函數里面設置一個計數器,每次中斷都給這個計數器加一,然后計數器會有一個值,你不是想一段時間輸出低電平嗎?那么你可以控制這個計數值如果這個計數值大于某個值的時候你就讓他輸出低電平,而這個低電平輸出的時間你仍然可以用一個計數的變量來實現,這樣就可以實現你要的功能了
回復

使用道具 舉報

7#
ID:401564 發表于 2021-12-2 20:50 | 只看該作者
unsigned int Duty,PWM;
bit HI;
sbit out;
void Time1() interrupt 3                //PWM調節
{                       
        unsigned int a;
        a=Duty;                                                   //
        if(HI==0)
        {                                                                                                 
                TH1=(65535-a)/256; //         高電平時間
                TL1=(65535-a)%256; //       
                HI=1;
                out=1;
                       
        }
                else
        {
                TH1=(65535-PWM+a)/256; //         低電平時間
                TL1=(65535-PWM+a)%256; //
                HI=0;
                out=0;         
        }                               
        TR1=1;
}



Duty調節占空比
HI為輸出電平標志位
out為控制引腳
PWM為PWM的周期
TR1.......這個不用解釋了吧

都這樣了,你還不知道怎么控制,那就沒話說了

回復

使用道具 舉報

8#
ID:917597 發表于 2021-12-3 11:16 | 只看該作者
cjjdemon 發表于 2021-12-2 19:30
他的意思是,增加一個PWM電平轉換的標志位,在定時器中斷函數里,只負責判斷是否進行電平轉換,然后將標 ...

/***********PWM開關**********/
void PWM_select(bit a)   //不斷循環讀取PWM輸出標志,并影射至PWM輸出引腳,關閉即跳出循環,并給PWM引腳低電平
{

        while(a)//a=1PWM開,a=0PWM關
        {
        if (H_out==1) PWM0=1;
        if (H_out==0) PWM0=0;
        }
        PWM0=0;
}

請幫我看看是這個樣子嗎?我按照你的意思定時器中斷里面只改變H_out這個PWM輸出標志位的值,然后寫循環讀取標志位來改變PWM輸出腳的電平。但是我發現一旦進入PWM輸出這個循環就沒辦法跳出去了,除非再加一個按鍵的外部中斷。不知道是不是我理解的不對,這樣子也沒辦法把PWM寫成一個可以隨時調用的子函數。
回復

使用道具 舉報

9#
ID:57657 發表于 2021-12-3 11:29 | 只看該作者
wps10025 發表于 2021-12-2 12:45
我只是說一點建議,定時計數器中斷最好不要放入太大的程序,最好用標志位軟件定時,PWM最好封裝一個函數, ...

定時器0中斷里你放多大的程序都可以,只要沒有再次溢出。
  1. void Timer0Interrupt() interrupt 1{         //12Mhz 1mS定時器中斷
  2.     TH0 = 0xFC;
  3.     TL0 = 0x18;
  4.     Delay900us();
  5.     P1++;
  6.     if (_testbit_(TF0)) {
  7.         P1 = 0xAA;
  8.         PCON |= 0x02;
  9.         _nop_(); _nop_();
  10.         _nop_(); _nop_();
  11.     }
  12. }
復制代碼
回復

使用道具 舉報

10#
ID:917597 發表于 2021-12-3 12:33 | 只看該作者
Y_G_G 發表于 2021-12-2 20:50
unsigned int Duty,PWM;
bit HI;
sbit out;

謝謝大佬,看懂了,又學到一種生成PWM波的寫法,之前只會用定時器定一個標準溢出時間,然后計數4次溢出以后更改電平,計數10次溢出以后周期結束計數清零這種方式。如您這種方式,PWM一直在輸出,我怎么樣能將PWM波的輸出寫成像函數一樣可以隨便調用?只有調用的時候輸出腳才輸出PWM波。
回復

使用道具 舉報

11#
ID:401564 發表于 2021-12-3 12:46 | 只看該作者
jsezcyc 發表于 2021-12-3 12:33
謝謝大佬,看懂了,又學到一種生成PWM波的寫法,之前只會用定時器定一個標準溢出時間,然后計數4次溢出以 ...

你把控制的部分寫成一個函數不就可以了?
你也可以在定時器中斷中增加一個變量,用來記錄PWM輸出的次數,在主程序中通過檢測這個變量來進行控制
程序是死的,人是活的,要有想法,要動手,更改個三四百次的,自然你就會知道這些了
回復

使用道具 舉報

12#
ID:313854 發表于 2021-12-3 14:28 | 只看該作者
按鍵檢測在主函數,定時器中判斷標識輸出引腳電平,裸機程序可以這樣做
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美久久精品一级c片 | 久久日韩粉嫩一区二区三区 | 男人的天堂久久 | 久久国产精品无码网站 | 亚洲天堂成人在线视频 | 亚洲三区在线观看 | 丝袜一区二区三区 | 日本一区二区三区在线观看 | 亚洲成人中文字幕 | 永久网站| 91精品久久久久久久久 | 日韩精品久久久久久 | 亚洲精品久久久久久一区二区 | 91精品国产综合久久婷婷香蕉 | 中文字幕视频在线 | 久久国产精品免费视频 | 精品国产免费一区二区三区演员表 | 91se在线| 天天综合久久网 | 国产成人免费在线观看 | 国产精品毛片一区二区在线看 | 日韩蜜桃视频 | 红桃视频一区二区三区免费 | 国产资源在线观看 | 欧美lesbianxxxxhd视频社区 | 一区二区av | 国产精品久久久久久久午夜 | 国产精品久久久久久久久久 | 中文字幕精品一区久久久久 | 国产精品99久久久久久久久久久久 | 色综合久久天天综合网 | 成人影院av| 中文字幕视频在线观看 | 久久久99精品免费观看 | 久久久av中文字幕 | 日韩欧美在线一区 | 国产黄色av网站 | a级黄色毛片免费播放视频 国产精品视频在线观看 | 日韩一区精品 | 精品国产乱码久久久久久丨区2区 | 欧美自拍一区 |