如何叠加两路pwm信号使其分辨率翻倍

如何叠加两路pwm信号使其分辨率翻倍,第1张

我试了几次都传不上图去,我把管脚定义说一下稿宽世吧。P1.0—P1.4接5个对地键,分别作为:顺时针、逆时针、停止、加速和减速按键。P3.0接L294的IN1,P3.1接IN2。P3.7接ENA,也就是PWM输出口。另外你也可以用P0和P2口接LED或者LCD显示屏。晶振就用单片机流行键肢的12MHz就行了。我这是用C语言写程序Keil编译。#includesbitMA=P3^0sbitMB=P3^1sbitPWM=P3^7bitKeyFreeunsignedcharPWM_OUTvoidDelay(unsignedchar)//声明延时函数unsignedcharKeyScan(void)voidkeyProcess(unsignedchar)main(){TMOD=0x01TH0=-50000/256TL0=-50000%256IE=0x82TR0=1while(1){keyProcess(KeyScan())}}voidT0_INT()interrupt1//定时器函数控制PWM输出{TH0=-5000/巧升256TL0=-5000%256PWM=1//设置PWM输出Delay(PWM_OUT)PWM=0Delay(100-PWM_OUT)}voidDelay(unsignedcharx){uchariwhile(x--)for(i=0i<200i++)}unsignedcharKeyScan(void){P1|=0x1fif((P1&0x1f)!=0x1f){Delay(10)//延时去抖if((P1&0x1f)!=0x1f){returnP1&0x1f}}returnP1&0x1f}voidkeyProcess(uintkey){if(key==0x1f)/*******************/{/**/KeyFree=1/*软件松手检测*/}/**/else/**/{/**/if(KeyFree==1)/**/{/*******************/KeyFree=0/*******************************************/switch(key){case0x1e:{MA=1MB=0break}case0x1d:{MA=0MB=1break}case0x1b:{PWM_OUT=0break}case0x17:{if(PWM_OUT!=90){PWM_OUT+=30}break}case0x0f:{if(PWM_OUT!=30&&PWM_OUT!=0){PWM_OUT-=30}break}}/*******************************************/}}}

#include <reg51.H >

#include <intrins.h >

sbit K1 =P1^4//增加键

sbit K2 =P1^5//减少键

sbit lamp =P3^7 //闪烁灯

sbit CLK=P1^0

unsigned char PWM=0x7f //初值

void Lamp() //灯控制函数

void delayms(unsigned char ms) //延时变数

void delay(unsigned char t) //延时变数

void main()

{

CLK =1

lamp=0

TMOD=0x21

TH0=0xfc //1ms延时常数

TL0=0x66//频率调节

TH1=PWM//脉宽调节初值

TL1=0

EA=1

ET0=1

ET1=1

TR0=1

while(1)

{

do{

if(PWM!=0xff) //判断是否到达上限

{PWM++ delayms(10)}

else Lamp()

}

while(K1==0) //增加脉宽

do{

if(PWM!=0x01) //判断是否到达下限

{PWM-- delayms(10)}

else Lamp()

}

while(K2==0) /州码/减少脉宽

}

}

void T0X() interrupt 1 // 定时器0中断服务程序.

{

TR1=0

TH0=0xfc //赋初值

TL0=0x66

TH1=PWM

TR1=1

CLK=0 //启动输出

}

void T1X() interrupt 3 //册中哪培备 定时器1中断服务程序

{

TR1=0

CLK=1 //结束输出

}

void Lamp() //闪烁灯子程序

{

unsigned char i

for (i=0 i<5 i++)

{

delayms(100)

lamp=!lamp //lamp取反

}

lamp=0 //关闭闪烁灯

}

void delayms(unsigned char ms) // 延时子程序

{

unsigned char i

while(ms--)

{

for(i=0i<120i++)

}

}

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

}

}

}


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

原文地址: http://outofmemory.cn/yw/8267050.html

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

发表评论

登录后才能评论

评论列表(0条)

保存