#include<AT89x52.H>
#include <intrins.h>
typedef unsigned int u16; //数据类型声明
typedef unsigned char u8;
#define Sevro_moto_pwm4 P2_3 //舵机信号输入端
#define Sevro_moto_pwm1 P2_7
#define Sevro_moto_pwm2 P2_5
#define Sevro_moto_pwm3 P0_0
unsigned char pwm_val_left = 0;//变量定义
unsigned char push_val_left =20;
int sum=0;
int dj_select=0; // 舵机选择
/*******************************************************************************
* 函数名 :UsartInit()
*函数功能 :设置串口
*******************************************************************************/
void UsartInit() // 9600bps
{
SCON=0X50; //设置为工作方式1
//TMOD=0X20; //计数器工作方式2
PCON=0X80; //波特率加倍
//PCON &= 0x7F; //波特率不加倍
TH1=0XFA; //计数器初始值设置,波特率是4800
TL1=0XFA;
ES=1; //打开接收中断
ET1 = 0;
EA=1; //总中断
TR1=1; //计数器
}
/************************************************************************/
/* PWM信号产生控制舵机 */
/************************************************************************/
/* */
/*调节push_val_left的值改变舵机占空比 */
void pwm_Servomoto(void)
{
if(dj_select==0x01)//选择哪个舵机转动
{
if(pwm_val_left<=push_val_left)
Sevro_moto_pwm1=1;
else
Sevro_moto_pwm1=0;
if(pwm_val_left>=200)
{
pwm_val_left=0;sum++;
}
}
else if(dj_select==0x02)
{
if(pwm_val_left<=push_val_left)
Sevro_moto_pwm2=1;
else
Sevro_moto_pwm2=0;
if(pwm_val_left>=200)
{
pwm_val_left=0;sum++;
}
}
else if(dj_select==0x03)
{
if(pwm_val_left<=push_val_left)
Sevro_moto_pwm3=1;
else
Sevro_moto_pwm3=0;
if(pwm_val_left>=200)
{
pwm_val_left=0;sum++;
}
}
else if(dj_select==0x04)
{
if(pwm_val_left<=push_val_left)
Sevro_moto_pwm4=1;
else
Sevro_moto_pwm4=0;
if(pwm_val_left>=200)
{
pwm_val_left=0;sum++;
}
}
}
/***************************************************/
///*TIMER1中断服务子函数产生PWM信号*/
/***************************************************/
void time1()interrupt 1 using 2
{
TH0=(65536-100)/256; //100US定时
TL0=(65536-100)%256;
pwm_val_left++;
pwm_Servomoto();
}
/*******************************************************************************
* 函数名 : Usart() interrupt 4
* 函数功能 : 串口通信函数
*******************************************************************************/
void Usart() interrupt 4
{
u8 receiveData;
receiveData=SBUF;//出去接收到的数据
RI = 0;//清除接收中断标记位
SBUF=receiveData;//将接收到的数据放入发送寄存器
if(SBUF==0x01)
dj_select = 1;
else if(SBUF==0x02)
dj_select = 2;
else if(SBUF==0x03)
dj_select = 3;
else if(SBUF==0x04)
dj_select = 4;
else if(SBUF==0x00)
dj_select = 0;
while(!TI); //等待发送数据完成
TI=0; //清除发送完成标志位
}
void main(void)
{
TMOD=0X21;//根据器件手册选择想要的功能进行设置,我这里同时用了定时器0,1
TH0=(65536-100)/256; //100US
TL0=(65536-100)%256;
ET0= 1;
TR0= 1;//打开计数器
UsartInit();
push_val_left=20; //舵机归中
while(1) /*无限循环*/
{
if(sum==50)
{
sum=0;
push_val_left=25-push_val_left;//舵机来回转动
}
}
}
单片机同时控制4个舵机和一个串口通信
最新推荐文章于 2023-01-23 11:00:19 发布