|
#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;//行走電機(jī)
sbit xzdj1b =P0^1;
sbit xzdj2a =P0^2;
sbit xzdj2b =P0^3;
sbit toua =P0^6;//頭電機(jī)
sbit toub =P0^7;
sbit shoua =P1^0;//手電機(jī)
sbit shoub =P1^1;
sbit wana =P1^2;//腕電機(jī)
sbit wanb =P1^3;
sbit zhoua =P1^4;//肘電機(jī)
sbit zhoub =P1^5;
sbit zhou1a=P1^6;
sbit zhou1b=P1^7;
sbit jiana =P2^0;//肩電機(jī)
sbit jianb =P2^1;
sbit jian1a=P2^2;
sbit jian1b=P2^3;
uchar irtime; //紅外時(shí)間
uchar startflag; //起始標(biāo)志位
uchar irdata[33];//多少個數(shù)據(jù)
uchar bitnum; //第幾位
uchar irreceok; //紅外接收完成
uchar ircode[4]; //用戶碼和鍵值碼4位
uchar irprosok; //紅外接收結(jié)束
uchar disp[4]; //分離出4位數(shù)據(jù)顯示
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秒延時(shí)
{
uint j;
for(;t>0;t--)
for(j=6245;j>0;j--);
}
void delay_1ms(uint t)//12m晶振1ms秒延時(shí)
{
uint j,k;
for(j=t;j>0;j--)
for(k=120;k>0;k--);
}*/
void delay_50us(uint t)//12m晶振50us秒延時(shí)
{
uchar j;
for(;t>0;t--)
for(j=19;j>0;j--);
}
void timer0init() //定時(shí)器初始化
{
// 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; //下降沿觸發(fā)
EX1=1; //打開外部中斷1
EA=1; // 開總中斷
}
void irwork()//分離16進(jìn)制紅外數(shù)據(jù)
{
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; //紅外數(shù)據(jù)值
k=1; //從第一個數(shù)據(jù)碼開始
for(j=0;j<4;j++)//只取出4組碼
{
for(i=0;i<8;i++)//8位數(shù)據(jù)循環(huán)8次
{
//右移一位。移動7次。從低位開始移
value=value>>1;
//循環(huán)這個判斷語句8次.判斷是1 還是0
//大于7為 1. 小于7為 0
if(irdata[k]>7)
{
value=value|0x80;
}
k++;
}
//把數(shù)據(jù)放到數(shù)組中
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//定時(shí)器0中斷服務(wù)函數(shù)
{
irtime++; //加到255自動清零再加
}
void int0() interrupt 2//定時(shí)器1中斷服務(wù)函數(shù)
{
if(startflag)
{
if(irtime>32)//檢測引導(dǎo)碼
{
bitnum=0;
}
irdata[bitnum]=irtime;
irtime=0;
bitnum++;
if(bitnum==33)
{
bitnum=0;
irreceok=1;//紅外接收結(jié)束
}
}
else
{
startflag=1;
irtime=0;
}
}
|
|