51PWM精确输出按键可调输出周期占空比,误差可以达到零点几以内。1602显示当前输出PWM周期占空比。
单片机源程序如下:
- #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高电平时间
-
- ET0=1;//打开定时器0中断允许
- ET1=1;
- TR0=1;//打开定时器
- TR1=0;//打开定时器
-
- EA=1;//打开总中断
- }
- 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弥补中断事件,具体可通过调节数值达到弥补效果
- TL0 = (unsigned int)(65536-peri+30)%256; //通过改变peri改变周期大小
- PWM=1;
- TR1=1;
- }
-
- void Time1(void) interrupt 3
- {
- TH1 = (unsigned int)(65536-value+20)/256; //加20弥补中断事件,具体可通过调节数值达到弥补效果
- TL1 = (unsigned int)(65536-value+20)%256; //通过改变value改变占空比
- PWM=0;
- TR1=0;
- }
- //经示波器测定占空比误差百分之一左右通过自己调节弥补值大小可以达到误差百分之零点五以下
复制代码
所有资料51hei提供下载:
PWM输出修改版.zip
(55.03 KB, 下载次数: 192)
|