|
51PWM精確輸出按鍵可調(diào)輸出周期占空比,誤差可以達(dá)到零點(diǎn)幾以內(nèi)。1602顯示當(dāng)前輸出PWM周期占空比。
單片機(jī)源程序如下:
- #include <reg51.h>
- #include <intrins.h>
- #include "lcd.h"
- unsigned char code ASCII[10] = {'0','1','2','3','4','5','6','7','8','9'};
- unsigned char period[]="Period:";
- unsigned char high[]="Duty:";
- unsigned char disbuff[10];
- unsigned int peri =1000;
- unsigned int value=600; //初始占空比為60% 周期為1ms
- sbit PWM=P2^1; //PWM輸出口
- sbit K1=P1^0; //占空比增加鍵
- sbit K2=P1^1; //占空比減小鍵
- sbit K3=P1^2; //周期增加鍵
- sbit K4=P1^3; //周期減小鍵
- void TimerInit()
- {
- TMOD=0X11;
- TH0 = (unsigned int)(65536-peri)/256;
- TL0 = (unsigned int)(65536-peri)%256; //1ms周期
- TH1 = (unsigned int)(65536-value)/256;
- TL1 = (unsigned int)(65536-value)%256; //600us高電平時(shí)間
-
- ET0=1;//打開(kāi)定時(shí)器0中斷允許
- ET1=1;
- TR0=1;//打開(kāi)定時(shí)器
- TR1=0;//打開(kāi)定時(shí)器
-
- EA=1;//打開(kāi)總中斷
- }
- void delay(unsigned int i)
- {
- while(i--);
- }
- void Key_Scan()
- {
- if(K1==0)
- {
- delay(1000);
- if(K1==0)
- {
- value+=20; //占空比增加
- if(value>=peri)
- {
- value=peri;
- }
- }
- while(!K1);
- }
- if(K2==0)
- {
- delay(1000);
- if(K2==0)
- {
- value-=20; //占空比減小
- if(value<=0)
- {
-
- value=0;
- }
- }
- while(!K2);
- }
- if(K3==0)
- {
- delay(1000);
- if(K3==0)
- {
- peri+=100;//周期增加100us
- }
- while(!K3);
- }
- if(K4==0)
- {
- delay(1000);
- if(K4==0)
- {
- peri-=100; //周期減小100us
- }
- while(!K4);
- }
-
- }
-
- void main(void)
- {
- InitLcd1602();
- TimerInit();
-
- while(1)
- {
- int zhanbi;
- Key_Scan();
- LcdShowStr(0,0,period); //顯示周期
- LcdShowStr(0,1,high); //顯示占空比
- disbuff[0]=peri/10000;
- disbuff[1]=peri%10000/1000;
- disbuff[2]=peri%1000/100;
- disbuff[3]=peri%100/10;
- disbuff[4]=peri%10;
- DisplayOneChar(7,0,ASCII[disbuff[0]]);
- DisplayOneChar(8,0,ASCII[disbuff[1]]);
- DisplayOneChar(9,0,ASCII[disbuff[2]]);
- DisplayOneChar(10,0,ASCII[disbuff[3]]);
- DisplayOneChar(11,0,ASCII[disbuff[4]]);
- DisplayOneChar(12,0,'u');
- DisplayOneChar(13,0,'s');
- zhanbi=(value/10*100)/(peri/10);
- disbuff[0]=zhanbi/10;
- disbuff[1]=zhanbi%10;
- DisplayOneChar(7,1,ASCII[disbuff[0]]);
- DisplayOneChar(8,1,ASCII[disbuff[1]]);
- DisplayOneChar(9,1,'%');
- }
- }
- void Time0(void) interrupt 1
- {
- TH0 = (unsigned int)(65536-peri+30)/256; //加30彌補(bǔ)中斷事件,具體可通過(guò)調(diào)節(jié)數(shù)值達(dá)到彌補(bǔ)效果
- TL0 = (unsigned int)(65536-peri+30)%256; //通過(guò)改變peri改變周期大小
- PWM=1;
- TR1=1;
- }
-
- void Time1(void) interrupt 3
- {
- TH1 = (unsigned int)(65536-value+20)/256; //加20彌補(bǔ)中斷事件,具體可通過(guò)調(diào)節(jié)數(shù)值達(dá)到彌補(bǔ)效果
- TL1 = (unsigned int)(65536-value+20)%256; //通過(guò)改變value改變占空比
- PWM=0;
- TR1=0;
- }
- //經(jīng)示波器測(cè)定占空比誤差百分之一左右通過(guò)自己調(diào)節(jié)彌補(bǔ)值大小可以達(dá)到誤差百分之零點(diǎn)五以下
復(fù)制代碼
所有資料51hei提供下載:
PWM輸出修改版.zip
(55.03 KB, 下載次數(shù): 195)
2018-12-26 23:57 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
評(píng)分
-
查看全部評(píng)分
|