51單片機(jī)是可以輸出PWM的,相對(duì)麻煩。此時(shí)需要用到內(nèi)部定時(shí)器來(lái)實(shí)現(xiàn),可用兩個(gè)定時(shí)器實(shí)現(xiàn),也可以用一個(gè)定時(shí)器實(shí)現(xiàn)。 用兩個(gè)定時(shí)器的方法是用定時(shí)器T0來(lái)控制頻率,定時(shí)器T1來(lái)控制占空比。大致的的編程思路是這樣的:T0定時(shí)器中斷讓一個(gè)I0口輸出高電平,在這個(gè)定時(shí)器T0的中斷當(dāng)中起動(dòng)定時(shí)器T1,而這個(gè)T1是讓IO口輸出低電平,這樣改變定時(shí)器T0的初值就可以改變頻率,改變定時(shí)器T1的初值就可以改變占空比。 下面重點(diǎn)介紹用一個(gè)定時(shí)器的實(shí)現(xiàn)PWM的方法。以周期為0.1ms(10KHz)為例,要產(chǎn)生其它頻率的PWM波,程序中只需作簡(jiǎn)單修改即可。用一個(gè)定時(shí)器時(shí)(如定時(shí)器T0),首先要確定PWM的周期T和占空比D,確定了這些以后,就可以用定時(shí)器產(chǎn)生一個(gè)時(shí)間基準(zhǔn)t,比如定時(shí)器溢出n次的時(shí)間是PWM的高電平的時(shí)間,則D*T=n*t,類似的可以求出PWM低電平時(shí)間需要多少個(gè)時(shí)間基準(zhǔn)n。 下面的程序讓51單片機(jī)產(chǎn)生一個(gè)100KHz的PWM方波,使用按鍵加減速度,在實(shí)際調(diào)試中,發(fā)現(xiàn)占空比D達(dá)到17%時(shí)即可轉(zhuǎn)動(dòng),但是需要外力啟動(dòng),此時(shí)轉(zhuǎn)速最慢;在沒有外力的情況下,占空比需要達(dá)到75%才可以轉(zhuǎn)動(dòng),此時(shí)轉(zhuǎn)速已經(jīng)非常快;通過(guò)按鍵將占空比D調(diào)節(jié)到%17或%16時(shí)停止轉(zhuǎn)動(dòng)。占空比的值是LCD1602顯示的。附上代碼和演示視頻鏈接:鏈接:https://pan.baidu.com/s/1BqV4morVQeHN2uTd89DRWw 提取碼:kqew。
單片機(jī)源程序如下:
- //12MHz的晶振,產(chǎn)生頻率10KHz,占空比為x的PWM波
- #include "reg52.h"
- #include "lcd.h"
- typedef unsigned int u16;
- typedef unsigned char u8;
- sbit PWM_LED = P1^0;
- sbit KeyUp = P2^0;
- sbit KeyDown = P2^1;
- u8 value = 1;
- u8 Br, Sr, Gr;
- u8 str[] = {"Moto Speed Trim"};
- u8 str1[] = {"PWM:"};
- void delay(u16 i)
- {
- while(i--);
- }
- void Timer0_Init(void)
- {
- TMOD |= 0x01;
- TH0 = 0xFF;
- TL0 = 0x9C; //定時(shí)0.01ms
- TR0 = 1;
- ET0 = 1;
- EA = 1;
- }
- void datapros(u8 val)
- {
- Br = val / 100 + 0x30;
- Sr = val % 100 / 10 + 0x30;
- Gr = val % 10 + 0x30;
- }
- void main(void)
- {
- PWM_LED = 0;
- Timer0_Init();
- LcdInit();
- while(1)
- {
- if(KeyUp != 1)
- {
- delay(1000);
- if(KeyUp != 1)
- {
-
- }
- while(!KeyUp);
- value++;
- if(value == 100)
- {
- value = 1;
- }
- }
- if(KeyDown != 1)
- {
- delay(1000);
- if(KeyDown != 1)
- {
- }
- while(!KeyDown);
- value--;
- if(value == 0)
- {
- value = 1;
- }
- }
- datapros(value);
- LcdShowStr(0,0,str);
- LcdShowStr(0,1,str1);
- DisplayOneChar(5,1,Br);
- DisplayOneChar(6,1,Sr);
- DisplayOneChar(7,1,Gr);
- DisplayOneChar(8,1,'%');
- }
- }
- void Timer0() interrupt 1
- {
- static u8 time = 0;
- TR0 = 0; //關(guān)閉定時(shí)器
- TH0 = 0xFF;
- TL0 = 0x9C; //重裝初值
- TR0 = 1;
- time++;
- if(time > 100)
- {
- time = 0;
- }
- if(time < value)
- {
- PWM_LED = 1;
- }
- else
- PWM_LED = 0;
- }
復(fù)制代碼
所有程序51hei提供下載:
PWM波-按鍵控制電機(jī)速度.rar
(18.75 KB, 下載次數(shù): 44)
2020-5-5 15:17 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|