我用51单片机两个定时器产生两路PWM同时控制两个舵机转动,只能实现一个受控,另一个不受控制怎么回事?
单片机源程序如下:
#include "reg52.h"
typedef unsigned int u16;
typedef unsigned char u8;
//--定义使用的IO口--//
sbit PWM_v=P1^0;
sbit PWM_c=P1^1;
sbit jia_v=P3^0;
sbit jian_v=P3^1;
sbit jia_c=P3^2;
sbit jian_c=P3^3;
//定义变量
u16 value_v,value_c,timer,timer1;
//*******************************
void delay(u16 i)//延时10us
{
while(i--);
}
/*******************************************************************************
* 函 数 名 : Timer1Init
* 函数功能 : 定时器1初始化
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void Timer0Init()
{
TMOD|=0X01;
TH0 = 0xFF;
TL0 = 0x9C; //0.1ms
ET0=1;
EA=1;
TR0=1;
}
//************************************************************************************
void Timer1Init()
{
TMOD|=0X10;//选择为定时器1模式,工作方式1,仅用TR1打开启动。
TH1 = 0xFF;
TL1 = 0x9C; //0.1ms
ET1=1;//打开定时器1中断允许
EA=1;//打开总中断
TR1=1;//打开定时器
}
void keyscan()
{
if(jia_v==0)
{
delay(1000);
if(jia_v==0)
{
value_v++;
timer1=0;
if(value_v==25)
{
value_v=25;
}
}
}
while(!jia_v);
if(jian_v==0)
{
delay(1000);
if(jian_v==0)
{
value_v--;
timer1=0;
if(value_v==0)
{
value_v=0;
}
}
}
while(!jian_v);
//**************************************************
if(jia_c==0)
{
delay(1000);
if(jia_c==0)
{
value_c++;
timer1=0;
if(value_c==25)
{
value_c=25;
}
}
}
while(!jia_c);
if(jian_c==0)
{
delay(1000);
if(jian_c==0)
{
value_c--;
timer1=0;
if(value_c==0)
{
value_c=0;
}
}
}
while(!jian_c);
}
/*******************************************************************************
* 函 数 名 : main
* 函数功能 : 主函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void main()
{
value_v=5;
value_c=5;
Timer0Init(); //定时器0初始化
Timer1Init(); //定时器1初始化
value_v=5;
while(1)
{
keyscan();
}
}
/*******************************************************************************
* 函 数 名 : Time1
* 函数功能 : 定时器1的中断函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void Timer0() interrupt 1
{
TH1 = 0xFF;
TL1 = 0x9C; //0.1ms
timer=timer+1;
timer=timer%40;
if(timer <value_c)
{
PWM_c=1;
}
else
{
PWM_c=0;
}
}
//********************************************************************************************************************
void Time1(void) interrupt 3 //3 为定时器1的中断号 1 定时器0的中断号 0 外部中断1 2 外部中断2 4 串口中断
{
TH1 = 0xFF;
TL1 = 0x9C; //0.1ms
timer1=timer1+1;
timer1=timer1%40;
if(timer1 <value_v)
{
PWM_v=1;
}
else
{
PWM_v=0;
}
}
|