51單片機是可以輸出PWM的,相對麻煩。此時需要用到內部定時器來實現,可用兩個定時器實現,也可以用一個定時器實現。 用兩個定時器的方法是用定時器T0來控制頻率,定時器T1來控制占空比。大致的的編程思路是這樣的:T0定時器中斷讓一個I0口輸出高電平,在這個定時器T0的中斷當中起動定時器T1,而這個T1是讓IO口輸出低電平,這樣改變定時器T0的初值就可以改變頻率,改變定時器T1的初值就可以改變占空比。 下面重點介紹用一個定時器的實現PWM的方法。以周期為0.1ms(10KHz)為例,要產生其它頻率的PWM波,程序中只需作簡單修改即可。用一個定時器時(如定時器T0),首先要確定PWM的周期T和占空比D,確定了這些以后,就可以用定時器產生一個時間基準t,比如定時器溢出n次的時間是PWM的高電平的時間,則D*T=n*t,類似的可以求出PWM低電平時間需要多少個時間基準n。 下面的程序讓51單片機產生一個100KHz的PWM方波,使用按鍵加減速度,在實際調試中,發現占空比D達到17%時即可轉動,但是需要外力啟動,此時轉速最慢;在沒有外力的情況下,占空比需要達到75%才可以轉動,此時轉速已經非常快;通過按鍵將占空比D調節到%17或%16時停止轉動。占空比的值是LCD1602顯示的。附上代碼和演示視頻鏈接:鏈接:https://pan.baidu.com/s/1BqV4morVQeHN2uTd89DRWw 提取碼:kqew。
單片機源程序如下:
- //12MHz的晶振,產生頻率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; //定時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; //關閉定時器
- TH0 = 0xFF;
- TL0 = 0x9C; //重裝初值
- TR0 = 1;
- time++;
- if(time > 100)
- {
- time = 0;
- }
- if(time < value)
- {
- PWM_LED = 1;
- }
- else
- PWM_LED = 0;
- }
復制代碼
所有程序51hei提供下載:
PWM波-按鍵控制電機速度.rar
(18.75 KB, 下載次數: 44)
2020-5-5 15:17 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|