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(); //呼叫工作函式} 如果設好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的...51微控制器定時器T0能不能被同優先順序的外部中斷0所中斷
微控制器中定時器的時鐘與系統時鐘有什麼關係
微控制器片內定時器與計數器的主要區別是什麼