|
#include<12c5a.h>
#define QIANJIN a=1;b=0;c=1;d=0;
#define HOUTUI a=0;b=1;c=0;d=1;
#define ZUOZHUAN a=0;b=1;c=1;d=0;
#define YOUZHUAN a=1;b=0;c=0;d=1;
#define STOP a=1;b=1;c=1;d=1;
sbit wei =P0^6;
sbit duan=P0^7;
sbit ting =P2^7;
sbit xzdj1a =P0^0;//行走电机
sbit xzdj1b =P0^1;
sbit xzdj2a =P0^2;
sbit xzdj2b =P0^3;
sbit toua =P0^6;//头电机
sbit toub =P0^7;
sbit shoua =P1^0;//手电机
sbit shoub =P1^1;
sbit wana =P1^2;//腕电机
sbit wanb =P1^3;
sbit zhoua =P1^4;//肘电机
sbit zhoub =P1^5;
sbit zhou1a=P1^6;
sbit zhou1b=P1^7;
sbit jiana =P2^0;//肩电机
sbit jianb =P2^1;
sbit jian1a=P2^2;
sbit jian1b=P2^3;
uchar irtime; //红外时间
uchar startflag; //起始标志位
uchar irdata[33];//多少个数据
uchar bitnum; //第几位
uchar irreceok; //红外接收完成
uchar ircode[4]; //用户码和键值码4位
uchar irprosok; //红外接收结束
uchar disp[4]; //分离出4位数据显示
uchar code table[]={0xfe,0xfd,0xfb,0xf7};
// 0xef,0xbf,0xdf,0x7f};
uchar code smg[]={0xC0,0xF9,0xA4,0xB0,0x99,
0x92,0x82,0xf8,0x80,0x90,0x88,
0x83,0xC6,0xA1,0x86,0x8E};
/*void delay_50ms(uint t)//12m晶振50ms秒延时
{
uint j;
for(;t>0;t--)
for(j=6245;j>0;j--);
}
void delay_1ms(uint t)//12m晶振1ms秒延时
{
uint j,k;
for(j=t;j>0;j--)
for(k=120;k>0;k--);
}*/
void delay_50us(uint t)//12m晶振50us秒延时
{
uchar j;
for(;t>0;t--)
for(j=19;j>0;j--);
}
void timer0init() //定时器初始化
{
// TMOD=0X12;//T1方式1.T0方式2
TMOD=0X02;//T0方式2
TH0=0X00;//高8位清零
TL0=0X00;//低8位清零
EA=1;
ET0=1;
TR0=1;
}
void int0init()//外部中断1初始化
{
IT1=1; //下降沿触发
EX1=1; //打开外部中断1
EA=1; // 开总中断
}
void irwork()//分离16进制红外数据
{
disp[2]=ircode[0]/16;//键值码
disp[1]=ircode[0]%16;
disp[3]=ircode[2]/16;//识别码
disp[0]=ircode[2]%16;
}
void shoushen()
{
shoua=1;
shoub=0;
}
void shouzhua()
{
shoua=0;
shoub=1;
}
void wanzuo()
{
wana =1;
wanb=0;
}
void wanyou()
{
wana =0;
wanb=1;
}
void zhouzuo()
{
zhoua=1;
zhoub=0;
}
void zhouyou()
{
zhoua=0;
zhoub=1;
}
void zhoushang()
{
zhou1a=1;
zhou1b=0;
}
void zhouxia()
{
zhou1a=0;
zhou1b=1;
}
void xzqianjin()
{
xzdj1a =1;
xzdj1b =0;
xzdj2a =1;
xzdj2b =0;
}
void xzhoutui()
{
xzdj1a =0;
xzdj1b =1;
xzdj2a =0;
xzdj2b =1;
}
void xzzuozhuan()
{
xzdj1a =0;
xzdj1b =1;
xzdj2a =1;
xzdj2b =0;
}
void xzyouzhuan()
{
xzdj1a =1;
xzdj1b =0;
xzdj2a =0;
xzdj2b =1;
}
void jianshang()
{
jiana=1;
jianb=0;
}
void jianxia()
{
jiana=0;
jianb=1;
}
void jianqian()
{
jian1a=1;
jian1b=0;
}
void jianhou()
{
jian1a=0;
jian1b=1;
}
void tingsha()
{
P0=0Xff;
P2 =0XFF;
P1=0XFF;
}
void display()//显示
{
P2=0xfe;
wei=1;
wei=0;
delay_50us(50);
P2=smg[disp[0]];
delay_50us(50);
duan=1;
duan=0;
P2=0xff;
P2=0xfd;
wei=1;
wei=0;
delay_50us(50);
P2=smg[disp[1]];
delay_50us(50);
duan=1;
duan=0;
P2=0xff;
P2=0xfb;
wei=1;
wei=0;
delay_50us(50);
P2=smg[disp[2]];
delay_50us(50);
duan=1;
duan=0;
P2=0xff;
P2=0xf7;
wei=1;
wei=0;
delay_50us(50);
P2=smg[disp[3]];
delay_50us(50);
duan=1;
duan=0;
P2=0xff;
}
/*void display()//显示
{
uchar i;
for(i=0;i<4;i++)
{
duan=1;
duan=0;
P2=smg[disp[i]];
delay_50us(50);
wei=1;
wei=0;
P2=table[i];
delay_50us(20);
}
}*/
void irpros()//红外处理
{
uchar k,i,j;
uchar value; //红外数据值
k=1; //从第一个数据码开始
for(j=0;j<4;j++)//只取出4组码
{
for(i=0;i<8;i++)//8位数据循环8次
{
//右移一位。移动7次。从低位开始移
value=value>>1;
//循环这个判断语句8次.判断是1 还是0
//大于7为 1. 小于7为 0
if(irdata[k]>7)
{
value=value|0x80;
}
k++;
}
//把数据放到数组中
ircode[j]=value;
}
irprosok=1;
}
void main()
{
timer0init() ;
int0init();
while(1)
{
if(irreceok)
{
irpros();
irreceok=0;
}
if(irprosok)
{
irwork();
irprosok=0;
}
display();
switch(ircode[2])
{
// case 0x05: QIANJIN ;break;
// case 0x06: HOUTUI ;break;
// case 0x07: ZUOZHUAN;break;
// case 0x08: YOUZHUAN;break;
// case 0x04: STOP ; break;
case 0x02: xzqianjin(); break;//电视遥控器键值
case 0x0a: xzhoutui() ;break;//电视遥控器键值
case 0x07: xzzuozhuan();break;//电视遥控器键值
case 0x05: xzyouzhuan(); break;//电视遥控器键值
case 0x06: tingsha(); break;//电视遥控器键值
case 0x18: tingsha(); break;
case 0x17: shoushen(); break;
case 0x14: shouzhua(); break;
case 0x16: wanzuo(); break;
case 0x13: wanyou(); break;
case 0x15: zhoushang();break;
case 0x12: zhouxia(); break;
case 0x11: zhouzuo(); break;
case 0x1a: zhouyou(); break;
case 0x10: jianqian(); break;
case 0x0e: jianhou(); break;
case 0x0f: jianshang();break;
case 0x19: jianxia(); break;
default:break;
}
}
}
void timer0() interrupt 1//定时器0中断服务函数
{
irtime++; //加到255自动清零再加
}
void int0() interrupt 2//定时器1中断服务函数
{
if(startflag)
{
if(irtime>32)//检测引导码
{
bitnum=0;
}
irdata[bitnum]=irtime;
irtime=0;
bitnum++;
if(bitnum==33)
{
bitnum=0;
irreceok=1;//红外接收结束
}
}
else
{
startflag=1;
irtime=0;
}
}
|
|