unsigned
int
a=0
,b=10
void
main()
{
tmod=0x01
th0=(65536-50000)/256
tl0=(65536-50000)%256
ea=1
et0=1
tr0=1
}
void
pwm()
interrupt
1
{
th0=(65536-50000)/256
tl0=(65536-50000)%256
a++
p1^1=0
if(a=20)
{
a=0
}
if(a=b)
{
p1^1=1
}
}
调节a
,b的值即可调节占空比,程闭激序框架就是这样,具体自己改吧
,以下以和衫晌8为PWM波为例:塌旅8位的PWM波,一个周期有256个时间段,单片机定时器的中断频率为60*256=15360 Hz
T=0.651ms
以下为伪代码:
ISR_Time()定时器中断服务程序
{ if(i==255)
i=0
else
i++
if (i<k) // k=占空比*256
PORT=1 //端口输出唤锋高电平
else
PORT=0;
定时器计数载入();
}
以标准8051为例(晶振12M),计数脉冲为1us,需计651个脉冲,我们用定时器0,用Keil C编译
#include "reg52.h"
unsigned char k=255//k等于占空比乘以255,可以动态调整
unsigned char i=0
sbit PORT = P1^0//P1.0口输出
void main(void )
{
EA=0//关总中断
ET0=1//开定时器中断
TMOD=0x01//设置定时器为16为定时模式
TH0=0x02 //定时651个周期,0x028B=651
TL0=0x8B
EA=1//开中断
TR0=1 //开始定时
while(1)
}
void timer0 (void) interrupt 1 using 0//定时器中断服务程序
{ if(i==255)
i=0
else
i++
if (i<k) // k=占空比*256
PORT=1 //端口输出高电平
else
PORT=0
TH0=0x02
TL0=0x8B
TR0=1
}
#include<氏镇笑reg51.h>歼含#define uchar unsigned char
uchar pwm=50,cnt
sbit pluse=P1^0
sbit keyu=P1^4
sbit keyd=P1^5
void t0isr() interrupt 1
{
TH0=(65536-100)/256
TL0=(65536-100)%256
cnt++
if(pwm>0)
{
if(cnt>旅滑100)cnt=0
if(cnt<=pwm)pluse=1
else pluse=0
}
else pluse=0
}
main()
{
TMOD=0x01
TH0=(65536-100)/256
TL0=(65536-100)%256
TR0=1
ET0=1
EA=1
while(1)
{
if(keyu==0)
{
while(keyu==0)
pwm++
if(pwm>100)pwm=100
}
if(keyd==0)
{
while(keyd==0)
if(pwm>0)pwm--
}
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)