- /**********************************************************
- 正确的外部中断1 P3^3红外接收 控制LED灯
- 并显示键值
- 红外遥控控制机械臂
- P0^6位使能。PO^7段使能。P2口输出数据
- 单片机:STC89C52
- 晶振:11.0592M
- 苏义江
- 2015年4月22日
- *********************************************************/
- #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;
- }
-
- }
复制代码 |