2729|1

2

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

请教高手:做51格力空调遥控器,解了码后不知为何空调没反应,附程序如下。 [复制链接]

#include
#define uchar unsigned char
#define uint unsigned int
sbit   output = P1^0;
sbit KEY1=P3^0;
sbit KEY2=P3^1;
sbit KEY3=P3^2;
sbit KEY4=P3^3;
static bit OP;        //红外发射管的亮灭

static unsigned int count;       //延时计数器

static unsigned int endcount; //终止延时计数

static unsigned char flag;      //红外发送标志

void SendIRdata(char p_irdata1,char p_irdata2,char p_irdata3,char p_irdata4,char p_irdata5);

void delay();
uchar KEY();

void Delay(uint del)
{
        uint i,j;
        for(i=0; i         for(j=0; j<1827; j++)   
        ;
}
void main(void)

{
        uchar t;
    count = 0;

    flag = 0;

    OP = 0;

    output = 0;

    EA = 1; //允许CPU中断

    TMOD = 0x11; //设定时器0和1为16位模式1

    ET0 = 1; //定时器0中断允许

    TH0 = 0xFF;

    TL0 = 0xE8; //设定时值0为38K 也就是每隔26us中断一次 ,晶振11.0592M

    TR0 = 1;//开始计数

    do{
                t=KEY();
                                switch(t)
                   {
                                   case 0:
                                        break;
                                case 1:
                                        SendIRdata(25,2,224,80,4);         //                1900e0514
                                        break;
                                case 2:
                                        SendIRdata(17,0,160,80,4);                 //
                                        break;
                                case 3:
                                        SendIRdata(25,1,224,80,4);         //
                                        break;
                                case 4:
                                        SendIRdata(25,2,224,80,4);   //
                                        break;
                   }

        

    }while(1);

}

//定时器0中断处理

void timeint(void) interrupt 1

{

    TH0=0xFF;

    TL0=0xE8; //设定时值为38K 也就是每隔26us中断一次

    count++;

    if (flag==1)

    {

        OP=~OP;

    }

    else

    {

        OP = 0;

    }

    output = OP;

}

void SendIRdata(char p_irdata1,char p_irdata2,char p_irdata3,char p_irdata4,char p_irdata5)

{

    int i;

    char irdata;

    //发送9ms的起始码

    endcount=250;

    flag=1;

    count=0;

    do{}while(count
    //发送4.5ms的结果码

    endcount=117;

    flag=0;

    count=0;

    do{}while(count
    //发送十六位地址的前八位

    irdata=p_irdata1;

    for(i=0;i<8;i++)

    {

        //先发送0.56ms的38KHZ红外波(即编码中0.56ms的高电平)

        endcount=12;

        flag=1;

        count=0;

        do{}while(count
        //停止发送红外信号(即编码中的高电平)

        if(irdata-(irdata/2)*2)  //判断二进制数个位为1还是0

        {

            endcount=45;  //1为宽的低电平

        }

        else

        {

            endcount=15;   //0为窄的低电平

        }

        flag=0;

        count=0;

        do{}while(count
        irdata=irdata>>1;

    }

    //发送十六位地址的后八位

    irdata=p_irdata2;

    for(i=0;i<8;i++)

    {

        endcount=12;

        flag=1;

        count=0;

        do{}while(count
        if(irdata-(irdata/2)*2)

        {

            endcount=45;

        }

        else

        {

            endcount=15;

        }

        flag=0;

        count=0;

        do{}while(count
        irdata=irdata>>1;

    }

    //发送八位数据

    irdata=p_irdata3;

    for(i=0;i<8;i++)

    {

        endcount=12;

        flag=1;

        count=0;

        do{}while(count
        if(irdata-(irdata/2)*2)

        {

            endcount=45;

        }

        else

        {

            endcount=15;

        }

        flag=0;

        count=0;

        do{}while(count
        irdata=irdata>>1;

    }

    //发送八位数据2

    irdata=p_irdata4;

    for(i=0;i<8;i++)

    {

        endcount=12;

        flag=1;

        count=0;

        do{}while(count
        if(irdata-(irdata/2)*2)

        {

            endcount=45;

        }

        else

        {

            endcount=15;

        }

        flag=0;

        count=0;

        do{}while(count
        irdata=irdata>>1;

    }
        //发送35位数据中最后三位数据
         

    irdata=p_irdata5;
        irdata=irdata>>1;  //因为从低位开始发

    for(i=0;i<3;i++)

    {

        endcount=12;

        flag=1;

        count=0;

        do{}while(count
        if(irdata-(irdata/2)*2)

        {

            endcount=45;

        }

        else

        {

            endcount=15;

        }

        flag=0;

        count=0;

        do{}while(count
        irdata=irdata>>1;

    }

    endcount=12;

    flag=1;

    count=0;

    do{}while(count
    flag=0;

}

void delay()

{

    int i,j;

    for(i = 0; i < 400; i++){

        for(j = 0; j < 200; j++){

        }

    }

}

uchar KEY()
{
        if(KEY1 == 0 || KEY2 == 0 || KEY3 == 0 || KEY4 == 0)
        {
                Delay(2);
                if(KEY1 == 0)
                {
                        while(1)
                        {
                                if(KEY1 == 1)
                                {
                                        Delay(2);
                                        if(KEY1 == 1)
                                        {
                                                break;
                                        }
                                }
                        }
                        return 1;
                }
                if(KEY2 == 0)
                {
                        while(1)
                        {
                                if(KEY2 == 1)
                                {
                                        Delay(2);
                                        if(KEY2 == 1)
                                        {
                                                break;
                                        }
                                }
                        }
                        return 2;
                }
                if(KEY3 == 0)
                {
                        while(1)
                        {
                                if(KEY3 == 1)
                                {
                                        Delay(2);
                                        if(KEY3 == 1)
                                        {
                                                break;
                                        }
                                }
                        }
                        return 3;
                }
                if(KEY4 == 0)
                {
                        while(1)
                        {
                                if(KEY4 == 1)
                                {
                                        Delay(2);
                                        if(KEY4 == 1)
                                        {
                                                break;
                                        }
                                }
                        }
                        return 4;
                }
        }
        return 0;
}
此帖出自51单片机论坛

最新回复

额,代码好长,不过你感觉有人会看吗  详情 回复 发表于 2013-10-27 23:27
点赞 关注
 

回复
举报

63

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
额,代码好长,不过你感觉有人会看吗
此帖出自51单片机论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表