该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
#include "reg52.h"
#include"intrins.h"
typedef unsigned int u16;
typedef unsigned char u8;
u8 Duty_cycle,angle_PC,angle;
sbit pwmPIN=P2^0;
u8 map(u8 mapping,u8 in_min,u8 in_max,u8 out_min,u8 out_max) //将串口接收数据映射到PWM可调占空比范围5到25
{
return(mapping-in_min)*(out_max-out_min)/(in_max-in_min)+out_min;
}
void uartinit()
{
TMOD=0x20;//T1设定波特率
TH1=0xF3;
TL1=0xF3;
TR1=1;//打开T1
SCON=0x50;//配置通讯方式
PCON=0X00;
EA=1;//打开中断
ES=1;
PS=1;
}
void InitTimer0()//定时100us进入一次中断
{
TMOD=0x01;
TH0=0x0FF;
TL0=0x9C;
EA=1;
ET0=1;
TR0=1;
}
void main()
{
InitTimer0();
uartinit();
while(1);
}
void uart(void) interrupt 4
{
RI=0;
angle_PC=SBUF;
angle=map(angle_PC,0,180,5,25);
SBUF=angle_PC;
while(!TI);
TI=0;
}
void servo(void) interrupt 1 //产生舵机PWM波,占空比0.5MS到2.5MS可调。周期20MS
{
Duty_cycle++;
if(Duty_cycle>=angle)
pwmPIN=0;
else pwmPIN=1;
if(Duty_cycle>=200)
Duty_cycle=0;
TH0 = 0x0FF;
TL0 = 0x9C;
}