红外遥控串口连接舵机

使用的郭天祥51板,sg90舵机。
用两个单片机用R,T串口连接,一个红外遥控,一个接收驱动舵机,但是舵机不转,可是用P1小灯是可行的。
红外遥控

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int

#define DataPort P0        //取位码
sbit IR=P3^2;  //红外接口端
sbit dula=P2^6;
sbit wela=P2^7;    //定义段选位选端

//uchar code table[]={
//0x3f,0x06,0x5b,0x4f,
//0x66,0x6d,0x7d,0x07,
//0x7f,0x6f,0x77,0x7c,
//0x39,0x5e,0x79,0x71};  //0123456789
uchar irtime;     //红外用全局变量
bit irpro_ok,irok;
uchar IRcord[4];  //用户码1+用户码2+操作码+操作反码
uchar irdata[33]; //1+8+8+8+8=33
uchar Val;

/****函数定义****/
void TIM0init() //定时器0,1初始化
{
    TMOD=0x22;    //定时器0,1工作方式2,TH0是重装值,TL0是初值
    TH0=0x00;    //重装值
    TL0=0x00;    //初始化值
    ET0=1;        //开中断
    TR0=1;
    
}
void Usart_Init()
{
    TH1=0xF3;         //计数器初始值设置,注意波特率是4800
    TL1=0xF3;
    TR1=1;//打开定时器
    SM0=0;//设置串口工作方式
    SM1=1;
    EA=1;//打开总中断
    ES=1;//打开串口中断
}
void EX0init()    //外部中断0初始化
{
    IT0=1;        //指定外部中断0下降沿触发 
    EX0=1;        //使能外部中断
    EA=1;        //开总中断
}
/******************产生下降沿********************/

void tim0_isr() interrupt 1 using 1      //定时器0中断处理
{
    irtime++;   //用于计数2个下降沿之间的时间,一次中断236us
}

void EX0_ISR() interrupt 0   //外部中断0服务函数
{
    static unsigned char i;  //接收红外信号处理
    static bit startflag;    //是否开始处理标志位,默认值为0

    if(startflag)
    {
        if(irtime<63&&irtime>=33) //引导码头码,判断引导码时长在9ms+4.5ms之间
            i=0;                  //开始计数
            irdata[i]=irtime;     //irdata存储每个电平的持续时间,用于以后判断是0还是1
            irtime=0;              //重新计时
            i++;                  //下一个电平
            if(i==33)              //1+8+8+8+8=33
            {
                irok=1;              //红外码接收中止
                i=0;    
            }
    }
    else
    {
        irtime=0;                                                                                      
        startflag=1;
    }
}
void Send_Data(uchar Key_val)
{
    SBUF=Key_val;      //将要发送的数据存入发送缓冲器中
    while(!TI);        //若发送中断标志位没有置1(正在发送数据),就等待
    TI=0;              //若发送完成,TI自动置1,这里把它清零
}
void Ircordpro()           //红外码值处理函数
{
    uchar i,j,k;
    uchar cord,value;        //value默认值为0
    k=1;                    //因为第一位引导码不需要,所以之间从用户码进入
    for(i=0;i<4;i++)        //处理4个字节
    {
        for(j=1;j<=8;j++)   //处理1个字节8位
        {
            cord=irdata[k]; //存放每一位
            if(cord>7)        //两次下降沿间隔大于1.9ms
                value|=0x80;//将真值的第一位置1
            if(j<8)
            {
                value>>=1; //向右移位8bit
            }
            k++;
        }
    IRcord[i]=value;   //存放每一字节
    value=0;
    }
    irpro_ok=1;        //处理完毕标志位置1
}

void Ir_work()           //红外键值散转程序
{
    switch(IRcord[2])  //判断第三个数码值
    {
        case 0x16:
        {
            Usart_Init();
            Val=0;;    
            Send_Data(Val);    
        }
        break; //0    显示相应的按键值
        case 0x0c:
        {
            Usart_Init();
            Val=1;;    
            Send_Data(Val);    
        }
            break; //1  
        case 0x18:
        {
            Usart_Init();
            Val=2;;    
            Send_Data(Val);    
        }
            break; //2
        case 0x5e:
        {
            Usart_Init();
            Val=3;;    
            Send_Data(Val);    
        }
        break; //3
        case 0x08:
        {
            Usart_Init();
            Val=4;;    
            Send_Data(Val);    
        }    
        break; //4
        case 0x1c:
        {
            Usart_Init();
            Val=5;;    
            Send_Data(Val);    
        }
        break; //5
        case 0x5a:
        {
            Usart_Init();
            Val=6;;    
            Send_Data(Val);    
        }
        break; //6
        case 0x42:
        {
            Usart_Init();
            Val=7;;    
            Send_Data(Val);    
        }
        break; //7
        case 0x52:
        {
            Usart_Init();
            Val=8;;    
            Send_Data(Val);    
        }
        break; //8
        case 0x4a:
        {
            Usart_Init();
            Val=8;;    
            Send_Data(Val);    
        }
        break; //9
        default:break;
    }
    irpro_ok=0; //处理完标志
}

//发送数据函数

void main()
{
    EX0init();   //初始化外部中断
    TIM0init();  //初始化定时器
    Usart_Init();
    DataPort=0xf3;  //取位码,第一位数码管选通,即11110011
    wela=1;      //位锁存
    wela=0;

    while(1)   
    {
        if(irok)      //如果接收好了进行红外处理
        {
            Ircordpro();  //红外码值处理函数
            irok=0;
        }

        if(irpro_ok)  //如果处理好后进行工作处理,如果按对应的按键后显示对应的数字
        {              
            Ir_work();
        }
    }
}

接收驱动舵机
```c
#include <reg52.h>    //单片机头文件

//宏定义
#define uint unsigned int
#define uchar unsigned char
     
//位声明
//sbit led0=P1^0;
//sbit led1=P1^1;
//sbit led2=P1^2;
//sbit led3=P1^3;
//sbit led4=P1^4;
//sbit led5=P1^5;
//sbit led6=P1^6;
//sbit led7=P1^7;
sbit duoji1=P3^2;
sbit duoji2=P3^3;
sbit duoji3=P3^4;
uchar pwm1,pwm2,pwm3;
uint xms,a,b,c;
//定义全局变量
uchar i;

//函数声明
void Uart_init();

//主函数
void main()
{
    Uart_init();        //串口初始化
    while(1);
}

//串口初始化函数
void Uart_init() 
{
    TMOD=0X21;//定时器1方式2
    TH0=(65536-100)/256;         //计数器初始值设置,注意波特率是4800
    TL0=(65536-100)%256;
    TH1=0xF3;         //计数器初始值设置,注意波特率是4800
    TL1=0xF3;
    ET0=1;
    TR1=1;//打开定时器
    SM0=0;//设置串口工作方式
    SM1=1;
    REN=1;
    EA=1;//打开总中断
    ES=1;//打开串口中断
}
void time3() interrupt 1
{
    TH0=(65536-100)/256;
    TL0=(65536-100)%256;

    a++;
    b++;
    c++;

    if(a>200)
        a=0;
    if(a<pwm1)
        duoji1=1;
    else duoji1=0;

    if(b>200)
        b=0;

    if(b<pwm2)
        duoji2=1;
    else duoji2=0;

    if(c>200)
        c=0;

    if(c<pwm3)
        duoji3=1;
    else duoji3=0;
    TR0=1;
}
//串口中断服务函数
void uart() interrupt 4
{
    uchar receiveData;
    i=SBUF;                   
     switch(i)
    {
        case 0:    //收到“0”
            {
//            led0=0;
            pwm1=12;
            pwm2=12;
            }
            break;
        
        case 1:    //收到“1”
            {
//            led1=0;
            pwm1=16;
            pwm2=16;
            }
            break;
        
        case 2:    //收到“2”
            {
//            led2=0;
            pwm3=9;
            }
            break;
        
        case 3:    //收到“3”
            {
//            led3=0;
            pwm3=18;
            }
            break;
        
        case 4:    //收到“4”
            {
//            led4=0;
            pwm1=14;
            pwm2=14;
            pwm3=14;
            }
            break;
        
        case 5:    //收到“5”
//            led5=0;
            break;
        
        case 6:    //收到“6”
//            led6=0;
            break;
        
        case 7:    //收到“7”
//            led7=0;
            break;
        
        default:
            P2=0XFF;
            break;
    }
    receiveData=SBUF;        //出去接收到的数据
    RI=0;                    //清除接收中断标志位
}