求51单片机PWM程序:两按键K1、K2,两管脚输出频率为1KHZ,占空比在0%到100%的方波,K1、K2调节占空。

求51单片机PWM程序:两按键K1、K2,两管脚输出频率为1KHZ,占空比在0%到100%的方波,K1、K2调节占空。,第1张

这是我以前写的用51单片机控制舵机的程闷拦高序,也是调PWM的,两按键,一个开始一个暂停,自己去琢磨吧,希望对你有帮助

int main(void)

{

P2=0XFF

P0=0XFF

// P3=0X00

// P1=0X00

lcd1602_init()

TMOD=0x01 //方衡李式1,16位计数器方式

TH0=0xff

TL0=0xab //定时0.1ms

IE=0x82 //开定时器中蚂尺断

ET0=1

TR0=1

EA=1

while(1)

{

keyscan()

if(keyvalue&m_start)

{

lcd1602_nwd(0x00,1,disply1,13)

if(high_flag)

{

high_flag=0

if(i_d_flag)

{

hight_votage--

if(hight_votage<=5)

{

i_d_flag=0

delays(m_05s)

// delayms(1000)

// hight_votage=5

}

}

else

{

hight_votage++

if(hight_votage>=25)

{

i_d_flag=1

cont_flag=1

delays(m_05s)

// delayms(1000)

// high_votage=25

}

}

}

if(cont_flag)

{

cont_flag=0 //圈数计数标志位

date_inc(disply)

lcd1602_nwd(0x00,2,disply,5)

}

if(keyvalue&m_stop)

{

keyvalue=keyvalue&0xe7

}

}

}

}

void timer0() interrupt 1

{

// TH0=0xfe

// TL0=0x0b

TH0=0xff

TL0=0xa9

// flag_01ms=1

t_num++

// engine_pwm=~engine_pwm

if(t_num>=200)

{

time_20ms++

f_keytime=1

t_num=0

engine_pwm=1

flag_pwm=1

}

if(flag_pwm)t_cont++

if(flag_pwm&&(t_cont>hight_votage))

{

high_flag=1

flag_pwm=0

t_cont=0

engine_pwm=0

}

if(f_buzzle)buzzle=~buzzle

}

#include<reg52.h>

#define uint unsigned int

#define uchar unsigned char

uint count

uchar jd

sbit le1=P1^0//*光电传感器*//

sbit PWM=P3^5//舵机pwm//

init()

{

TMOD=0x01//设定定时器

TH0 = 0xFE

TL0 = 0x0c//设定定时初始值

EA=1

ET0=1

TR0=1

}

void delay(uint z) //延时

{

uint x,y

for(x=zx>0x--)

for(y=125y>0y--)

}

void timer0() interrupt 1 //产生pwm信号控制舵机,周期20ms

{

TH0 = 0xFE

TL0 = 0x0c //设定定时初始值

if(count<jd) //判断0.5ms次数是否小于角度标识

{

PWM=1 //确定小于,pwm输出高电平

// delay(180) //延时一会,可以减慢舵机转速

}

else

PWM=0 //大于则输出低电平

count=count+1 //0.5ms次数加1

count=count%40 //次数始终保持为40即保持周期为20ms

}

void xunji()//循迹函数,读取拆塌光电管状扮御核态

{

if(le1!=0)

{

delay(10)

if(le1==0)

{

jd++

count=0

while(le1==0)

}

} //分析光电管状态,看你的电路检测到黑线输出1或者是0

else

{

count=0

jd=3 //舵机归中厅掘

}

}

void main()

{

jd=3 //角度初始化90°: 1=0.5ms 舵机为0° 2=1ms 舵机为45°3、4、5、同上

count=0 //初始化赋值零

init() //定时器初始化

while(1)

{

xunji() //舵机检测

}

}

定时器0表示的是脉冲总周期20ms,定时器1表示的是正脉冲宽度(如pwm_value = 1500时表示正缓简脉冲宽度为1.5ms), 而while循序只是为了改变正脉冲宽度。运行过程是:定时器0和定时器,1同时开启,此时pwm = 1,定时器1的时间到了之后pwm = 0,并关闭定时器1,等待脉冲总周期达到20ms即定时器0中断,在定时器0的中断服务中又将pwm赋值为1并开启定时器1……以这样的方式循环就可以控制舵机转动了芦哪竖陪大!


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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存