本帖最后由 TzMVP 于 2020-10-21 00:00 編輯
PWMPWM(脈沖寬度調(diào)制)對(duì)模擬信號(hào)電平進(jìn)行數(shù)字編碼的方法,計(jì)算機(jī)只能輸出0或5V的數(shù)字電壓值而不能輸出模擬電壓,而我們?nèi)绻氆@得一個(gè)模擬電壓值,則需通過(guò)使用高分辨率計(jì)數(shù)器,改變方波的占空比來(lái)對(duì)一個(gè)模擬信號(hào)的電平進(jìn)行編碼。
51單片機(jī)的Timer控制PWM需要用到定時(shí)器來(lái)生成不同占空比的波形,采用定時(shí)器中斷的方式。 1.IE寄存器 2. TCON寄存器 3. TMOD寄存器
4. Timer0/1計(jì)數(shù)寄存器 TL1 TH1 而當(dāng)TL0(TL1)和TH0(TH1)都滿了以后,此時(shí)如果定時(shí)中斷和總中斷都已經(jīng)打開(kāi),那么就會(huì)發(fā)生溢出中斷,同時(shí)這兩個(gè)寄存器清零。 運(yùn)用PWM完成呼吸燈硬件電路
程序設(shè)計(jì):
- unsigned char PWM_COUNT; //計(jì)數(shù)
- unsigned int HUXI_COUNT; //占空比更新時(shí)間
- unsigned char PWM_VLAUE; //占空比比對(duì)值
- bit direc_flag; //占空比更新方向
- void timer0_init()
- {
- TMOD = 0x02; //模式設(shè)置,00010000,定時(shí)器0,工作于模式2(M1=1,M0=0)
- TH0 = 0x47; //定時(shí)器溢出值設(shè)置,每隔200us發(fā)起一次中斷。
- TL0 = 0X47;
- TR0 =1; //定時(shí)器0開(kāi)始計(jì)時(shí)
- ET0 =1; //開(kāi)定時(shí)器0中斷
- EA = 1; //開(kāi)總中斷
- PWM_COUNT =0;
- }
- void time0() interrupt 1
- {
- PWM_COUNT++;
- HUXI_COUNT++;
- if(PWM_COUNT == PWM_VLAUE) //判斷是否到了點(diǎn)亮LED的時(shí)候
- LED = 1; //點(diǎn)亮LED
- if(PWM_COUNT == 10) //當(dāng)前周期結(jié)束
- {
- LED = 0; //熄滅LED
- PWM_COUNT = 0; //重新計(jì)時(shí)
- }
- if((HUXI_COUNT == 600) && (direc_flag == 0))
- {
- //占空比增加10%
- HUXI_COUNT = 0;
- PWM_VLAUE++;
- if(PWM_VLAUE == 9) //占空比更改方向
- direc_flag = 1;
- }
- if((HUXI_COUNT == 600) && (direc_flag == 1))
- {
- //占空比減少10%
- HUXI_COUNT = 0;
- PWM_VLAUE--;
- IF(PWM_VLAUE == 1) //占空比更改方向
- DIREC_FLAG = 0;
- }
- }
- void main()
- {
- HUXI_COUNT = 0;
- PWM_COUNT = 0;
- PWM_VLAUE = 5;
- direc_flag = 0;
- LED = 1; //默認(rèn)LED熄滅
- timer0_init(); //定時(shí)器0初始化
- while(1);
- }
復(fù)制代碼 |