怎麼51微控制器定時器來模擬PWM波

2021-05-29 02:18:18 字數 4551 閱讀 1655

1樓:匿名使用者

pwm的意思是「脈衝寬度調製」

pwm有兩個最基本的引數:頻率、佔空比。

頻率就是每秒鐘電平高低變化的次數,佔空比是指高電平保持時間和整個脈衝週期中的比例關係。

對於用定時器來模擬,最基本的方法就是使用一個io口迴圈設定其輸出值為高電平和低電平。

只要做到這兩個時間的計時,那麼就可以實現基本的pwm了。

而要做到兩個時間的計時,有兩種方案:

1.單計時器方案

int i;//計時變數

timer1()

else if (i==100)

else if (i==0)

}2.雙計時器方案

//只需要設計好兩個計時器的初值和週期,即可完成交替亮滅timer1()

timer2()

2樓:匿名使用者

用定時器t1/t2的工作方式2吧(我也忘記了,就是能自動重灌初始值的那個),在定時器程式裡,讓一個i/o口取反輸出(例如sbit s=p1^0;s=~s;)通過改變定時時常就可以了

51微控制器如何用一個按鍵和一個定時器來模擬pwm控制一個led燈的亮度??

3樓:糊塗伊人笑

使用定時器t0產生pwm方波,

用按鍵調整佔空比,20級可調

控制led燈的亮度等級.

#include "my51.h"

#include "timer0.h"

#define grading 20 //亮度20級變化

sbit keys3=p3^5; //按鍵調整佔空比,pwm_keychange++

sbit keys4=p3^6; // pwm_keychange--

u8 pwm_keychange=10; //初值,按鍵調整在1~20之間變化

//佔空比 pwm_keychange/grading

void t0_work() //本函式由t0定時器中斷函式呼叫

if(timemultiple2flag)

} void main() //測試

initt0(1,pwm_keychange,grading);

}} else if(0==keys4)

initt0(1,pwm_keychange,grading); //佔空比減小

} }

else

}} c**

#ifndef _my51_h

#define _my51_h

#include

//#include

#include

#include

#include "mytype.h"

#ifndef _51led_

#define _51led_

#define led p1 //p1匯流排連8個led燈,燈連573鎖存器,p1置低電平點亮

#define led led

#define on(x) p1&(~(1<<(x))) //開啟某個燈,開多個燈用 on(m) & on(n)

#define off(x) p1|(1<<(x)) //關閉某個燈,關多個燈用 off(m)| off(n)

#define on(x) on(x) //包含大小寫

#define off(x) off(x)

#define ledon 0 //某個燈,開啟

#define ledoff 1 //某個燈,關閉

sbit led0=p1^0;

sbit led1=p1^1;

sbit led2=p1^2;

sbit led3=p1^3;

sbit led4=p1^4;

sbit led5=p1^5;

sbit led6=p1^6;

sbit led7=p1^7;

sbit ledlock=p2^5; //鎖定當前8個led的狀態,0鎖定 ,1不鎖定

#endif

/*************二進位制輸入巨集****************************/

#ifndef _longtobin_

#define longtobin(n) \

( \

((n >> 21) & 0x80) | \

((n >> 18) & 0x40) | \

((n >> 15) & 0x20) | \

((n >> 12) & 0x10) | \

((n >> 9) & 0x08) | \

((n >> 6) & 0x04) | \

((n >> 3) & 0x02) | \

((n ) & 0x01) \

) #define bin(n) longtobin(0x##n##l)

#define bin(n) bin(n)

#define b(n) bin(n)

#define b(n) bin(n)

#endif

/*************單個資料位的置位巨集*********************/

#ifndef _bit_

#define bit(n) (1<

#define bit(n) bit(n)

#endif

#define high 1 //高電平

#define low 0 //低電平

sbit beep=p2^3; //蜂鳴器

extern void delayms(u16 ms);

extern void delayxus(u8 us); //函式執行(8+6x)個機器週期, 即t=(8+6x)*1.085

#endif

c**#ifndef _timer0_h

#define _timer0_h

#include "my51.h"

extern u8 timemultiple1flag; //中斷時間複用置位標誌,須手動清零

extern u8 timemultiple2flag; //中斷時間複用置位標誌,須手動清零

extern void t0_work(); //該函式未實現,需外部實現

extern void initt0(u8 ms,u16 t_multiple1,u16 t_multiple2) ; //定時器初始化

#endif

c**#include "timer0.h"

u8 th0cout=0 ; //初值

u8 tl0cout=0 ;

u16 t0intcouts1=0; //中斷計數

u16 t0intcouts2=0; //中斷計數

u16 timemultiple1=0; //中斷複用時間的倍數

u16 timemultiple2=0; //中斷複用時間的倍數

u8 timemultiple1flag=0; //中斷時間複用置位標誌,須手動清零

u8 timemultiple2flag=0; //中斷時間複用置位標誌,須手動清零

//開啟定時器,定時完成後需要手動關閉tr0,否則將迴圈定時

//引數一是定時的毫秒數,引數二和三是定時基時的倍率數(定時複用)

void initt0(u8 ms,u16 t_multiple1,u16 t_multiple2) //定時器初始化設定,ms取值不超過65

if(0==t_multiple2) //0倍的基準時間是不合理的,至少1倍

timemultiple1=t_multiple1; //倍時

timemultiple2=t_multiple2; //倍時

tmod &= 0xf0; //清定時器0配置

tmod |= 0x01; //配置定時器0的工作方式為1

ea =open; //開啟總中斷

et0=open; //開啟定時器中斷

th0=th0cout; //定時器裝入初值

tl0=tl0cout;

tr0=start; //啟動定時器

} void t0_times() interrupt 1 //t0定時器中斷函式

if(++t0intcouts2==timemultiple2) //判斷是否複用定時器

t0_work(); //呼叫工作函式}

51微控制器定時器T0能不能被同優先順序的外部中斷0所中斷

如果設好bai是同級中斷的話肯定不能。du同級中斷是先來後zhi到的。如果硬要分個dao先後可以用不同級的嘛。一般來講,只要碰到中斷的執行都可以理解成硬體完成的。中斷優先順序 只是你設定這個優先順序的性質,當中斷衝突的時候cpu會按照你的設定決定先執行哪一個。其實你根本沒必要關心什麼 置位中斷優先順...

微控制器中定時器的時鐘與系統時鐘有什麼關係

微控制器的定時器可bai以使用 系統時du鍾,也可以使用zhi外接的dao晶震,如果使用系統時鐘專,系統的時鐘決屬定指令週期,經過分頻 比如4分頻 定時器計一個數要的時間就便成指令週期乘以4。使用內部時鐘還是外部時鐘 幾分頻就取決於各晶片的配置字。可以這樣理解,定時器是copy 一個bai可程式設計...

微控制器片內定時器與計數器的主要區別是什麼

1 模式控制暫存器tmod的d2或是d6位來控制。d2或d6位為0時,選擇定時工作方式 為1時選擇計數工作方式。2 在定時方式時,計數脈衝輸入訊號由內部時鐘提供 計數方式時計數脈衝來自於相應的外部輸入引腳。3 定時器是對微控制器的機器週期數進行計數 計數器對外部輸入脈衝訊號計數,當訊號產生由0到1的...