51单片机输出几组pwm波形,程序简单,编译没错,但就是不输出,控制舵机
#include<reg52.h>//晶振11.0592sbitPWM=P2^0;typedefunsignedintuint;typedefunsignedcharuc...
#include <reg52.h> //晶振11.0592
sbit PWM = P2^0 ;
typedef unsigned int uint;
typedef unsigned char uchar;
typedef unsigned long ulong;
uint x;
uint value[]={1150,1290,1382,1474,1580,} ; //晶振11.0592,对应定时1.2ms,1.3ms,1.5ms,1.7ms,1.8ms
void delay_ms(uint y) //延时程序
{
uint j;
while(y--)
for(j=0;j<125;j++);
}
void conpwm(uint x)// x为高电平持续时间
{
TMOD=0x01;//开定时器0,1//uint value[]={1150,1290,1382,1474,1580,};//定义1.2ms,1.4ms,1.5ms,1.6ms,1.75ms;
TH0=(65536-x)/256; //定时高电平,x ms
TL0=(65536-x)%256;
EA=1;//开总断
TR0=1;//开定时器0
ET0=1;
PWM=1;
}
void Tim_0() interrupt 1
{
if(PWM==1)
{
TH0 = (65536-(18432-x))/256; //定时低电平持续时间为20ms-x
TL0 = (65536-(18432-x))%256;
PWM =~PWM; //电平翻转
}
else
{
TH0 = (65536-x)/256; //定时1.5ms
TL0 = (65536-x)%256;
PWM =~PWM;
}
}
void main()
{
while(1)
{
uint i=0;
for(i=0;i<=4;i++)
{ conpwm(value[i]);
delay_ms(1000); }
}
}
想隔几秒输出几组高电平1.2ms,1.5ms。。。。
然后观察舵机旋转,但是舵机不转 展开
sbit PWM = P2^0 ;
typedef unsigned int uint;
typedef unsigned char uchar;
typedef unsigned long ulong;
uint x;
uint value[]={1150,1290,1382,1474,1580,} ; //晶振11.0592,对应定时1.2ms,1.3ms,1.5ms,1.7ms,1.8ms
void delay_ms(uint y) //延时程序
{
uint j;
while(y--)
for(j=0;j<125;j++);
}
void conpwm(uint x)// x为高电平持续时间
{
TMOD=0x01;//开定时器0,1//uint value[]={1150,1290,1382,1474,1580,};//定义1.2ms,1.4ms,1.5ms,1.6ms,1.75ms;
TH0=(65536-x)/256; //定时高电平,x ms
TL0=(65536-x)%256;
EA=1;//开总断
TR0=1;//开定时器0
ET0=1;
PWM=1;
}
void Tim_0() interrupt 1
{
if(PWM==1)
{
TH0 = (65536-(18432-x))/256; //定时低电平持续时间为20ms-x
TL0 = (65536-(18432-x))%256;
PWM =~PWM; //电平翻转
}
else
{
TH0 = (65536-x)/256; //定时1.5ms
TL0 = (65536-x)%256;
PWM =~PWM;
}
}
void main()
{
while(1)
{
uint i=0;
for(i=0;i<=4;i++)
{ conpwm(value[i]);
delay_ms(1000); }
}
}
想隔几秒输出几组高电平1.2ms,1.5ms。。。。
然后观察舵机旋转,但是舵机不转 展开
1个回答
展开全部
你这个程序 conpwm函数的形参 x 和全局变量 x 混淆了
conpwm(value[i]) 只是把时间参数给了 函数的形参x 在函数中用其给定时器赋初值。但是在后来的中断程序中,每次中断又会给定时器重新加载计数值,这个值里面的 x 是那个全局变量 x,而你的程序没有给这个 x 赋时间参数。所以PWM的波形应该不是你所希望的。
conpwm(value[i]) 只是把时间参数给了 函数的形参x 在函数中用其给定时器赋初值。但是在后来的中断程序中,每次中断又会给定时器重新加载计数值,这个值里面的 x 是那个全局变量 x,而你的程序没有给这个 x 赋时间参数。所以PWM的波形应该不是你所希望的。
更多追问追答
追问
怎么才行呢?
追答
有两种改法:
1)形参换个名字,比如叫 t;
void conpwm(uint t)
{
x=t; // 加一句,后面不变;
。。。
}
2) 在主程序中给 x 赋值
x=value[i];
conpwm(value[i]);
意法半导体(中国)投资有限公司
2021-01-14 广告
2021-01-14 广告
1、不是的,STC单片机全面兼容MCS-51单片机,可以用一般的编程器编程,但ISP功能更方便实用。 2、实验板的串口就是ISP下载用的吧。 4、汇编语言不一定要在keil里学,一般的教程都可以学。keil只是一个编译程序。因为keil编译...
点击进入详情页
本回答由意法半导体(中国)投资有限公司提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询