找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2553|回复: 1
打印 上一主题 下一主题
收起左侧

红外遥控

[复制链接]
跳转到指定楼层
楼主
ID:82732 发表于 2015-9-25 09:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#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;
        }

}


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:84745 发表于 2015-10-9 10:54 来自手机 | 只看该作者
看看好用不
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表