51单片机怎么产生pwm程序

51单片机怎么产生pwm程序,第1张

正则表达式替换 import java.util.regex.Matcherimport java.util.regex.Pattern public class $ { public static void main(String... _) { String sa = "<ABCDEFGHIJK>SDFER<EGD>FG"Pattern p = Pattern.compile("<([A-Z]|[a-z]){0,}>") Matcher match = p.matcher(sa) while (match.find()) { String str = match.group()sa = sa.replaceFirst(str, str.toLowerCase())} System.out.println(sa)} }

可以用一个定时器实现,也可以用两个定时器实现

一个定时器实现办法,如定时器定时50US中断一次,中断100次是5ms,即PWM的周期

每次中断,变量a加1,并且a与另一变量b比较,如果a<b,让某一管脚输出高电平,如果a>=b,则让其输出低电平,a等于100时清0,这样占空比是b/100,改变b的值,就可以改变占空比

缺点定时器定时时间不能太短,例如10us中断程序根本执行不完,若占空比调节精度要求较高,如要求百分之一,则a需大于100,这样PWM波的周期就比较大,频率比较低

两个定时器,如一个定时器0定时100us,另外一个定时器1定时小于100us,如b

us

定时器0中断时输出高电平,并打开定时器1,定时器1负责置低电平

这样,就可以产生周期100us,占空比是b/100的方波

频率可以比用一个定时器高一些

#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--

}

}

}


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/11088827.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-13
下一篇2023-05-13

发表评论

登录后才能评论

评论列表(0条)

    保存