使用的郭天祥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; //清除接收中断标志位
}