32控制舵机代码
时间: 2023-08-02 17:10:42 浏览: 49
32控制舵机的代码如下:
```c
#include <reg52.h>
#define FOSC 11059200L
#define BAUD 9600
#define TIMER_TH 0xFD
#define TIMER_TL 0xFD
typedef unsigned char u8;
typedef unsigned int u16;
sbit servo=P2^0;
void init_uart();
void init_timer0();
void uart_send_data(u8 dat);
void delay(u16 i);
void main()
{
init_uart();
init_timer0();
while(1)
{
servo = 1;
delay(1500); // 1.5ms
servo = 0;
delay(18500); // 18.5ms
}
}
void init_uart()
{
TMOD |= 0x20; // Timer1 Mode 2
TH1 = TL1 = -(FOSC/12/32/BAUD);
TR1 = 1; // Start Timer1
SM0 = 0;
SM1 = 1; // UART Mode 1
REN = 1; // Enable Receive
EA = 1; // Enable Interrupt
ES = 1; // Enable Serial Interrupt
}
void init_timer0()
{
TMOD &= 0xF0; // Timer0 Mode 1
TH0 = TIMER_TH;
TL0 = TIMER_TL;
ET0 = 1; // Enable Timer0 Interrupt
TR0 = 1; // Start Timer0
}
void uart_send_data(u8 dat)
{
SBUF = dat;
while(!TI);
TI = 0;
}
void delay(u16 i)
{
while(i--);
}
void uart() interrupt 4
{
if(RI) // Receive Interrupt
{
RI = 0;
}
if(TI) // Transmit Interrupt
{
TI = 0;
}
}
void timer0() interrupt 1
{
TH0 = TIMER_TH;
TL0 = TIMER_TL;
}
```
该代码使用定时器控制舵机转动角度,通过改变舵机输入的脉冲宽度来控制舵机转动的角度。其中,舵机控制的脉冲宽度为1.5ms,控制周期为20ms,因此在每个控制周期内,将舵机输入脉冲宽度设为1.5ms,该代码中使用定时器0来实现周期性控制。