找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2994|回复: 8
收起左侧

C51单片机发射红外信号控制空调,开不了机,大神帮我看一下程序哪里出错了?

[复制链接]
ID:514901 发表于 2019-4-18 16:58 | 显示全部楼层 |阅读模式
10黑币
论坛新人,求大神帮我解决
首先,我要控制的是我宿舍的空调,美的的,型号如下:
IMG_20190415_223009.jpg

然后听说美的空调红外协议是R05d,然后就根据协议写了一个程序

以下是我程序的具体内容:
1,端口和延时函数
端口延时.png
2,中断程序,产生38khz脉冲
中段.png
3,引导码程序
引导码程序.png
引导.png
4,分隔符程序
间隔符.png
分隔.png
5,数据发送程序(发送char型数据和它的反码)
void senddata_data(char x)
{
    char irdata,i;
    irdata=x;
    for(i=0;i<8;i++)
    {
        endcount=14;
        flag=1;
        count=0;
        do{}while(count<endcount);
        if(irdata-(irdata/2)*2)
        {
            endcount=42;
        }
        else
        {
            endcount=14;
        }
        flag=0;
        count=0;
        do{}while(count<endcount);
        irdata=irdata>>1;
    }
    irdata=~x;
    for(i=0;i<8;i++)
    {
        endcount=14;
        flag=1;
        count=0;
        do{}while(count<endcount);
        if(irdata-(irdata/2)*2)
        {
            endcount=42;
        }
        else
        {
            endcount=14;
        }
        flag=0;
        count=0;
        do{}while(count<endcount);
        irdata=irdata>>1;
    }
}
开机.png
6,终止程序
结束符.png
终止.png
7,以下是主函数,发送开机编码
主函数.png
8,附带程序源码
#include <reg52.h>
sbit   P3_4 = P2^1;   //???????
sbit   key=P2^0;   //?????
static bit OP;    //????????0??1
static unsigned int count;    //???????
static unsigned int endcount;  //??????????????
static unsigned char flag;    //?????????
void delay()
{
    int i,j;
    for(i = 0; i < 400; i++){
        for(j = 0; j < 200; j++){
        }
    }
}
void sendbegin();
void senddata_data(char x);
void sendend();
void sendS();
void main(void)
{
count = 0;
    flag = 0;
    OP = 0;
    P3_4 = 0;
    EA = 1; //????CPU?ж?
    TMOD = 0x11; //?趨???0??1?16λ??1
    ET0 = 1; //?????0?ж?????
    TH0 = 0xFF;
    TL0 = 0xE8; //?趨??0?38K ????????26us?ж????  
    TR0 = 1;//???????
    do{
    if(key==0)
    {
     while(key==0);
        delay();
        sendbegin();
  senddata_data(0xb2);
  senddata_data(0x9f);
  senddata_data(0x00);
  sendS();
  sendbegin();
  senddata_data(0xb2);
  senddata_data(0x9f);
  senddata_data(0x00);
  sendend();
  }
    }while(1);
}

void timeint(void) interrupt 1
{
    TH0=0xFF;
    TL0=0xE8;
    count++;
    if (flag==1)
    {
        OP=~OP;
    }
    else
    {
        OP = 0;
    }
    P3_4 = OP;
}

void sendbegin()
{
    endcount=114;
    flag=1;
    count=0;
    do{}while(count<endcount);
    endcount=114;
    flag=0;
    count=0;
    do{}while(count<endcount);
}
void sendS()
{
    endcount=12;
    flag=1;
    count=0;
    do{}while(count<endcount);
    endcount=135;
    flag=0;
    count=0;
    do{}while(count<endcount);
}
void senddata_data(char x)
{
    char irdata,i;
    irdata=x;
    for(i=0;i<8;i++)
    {
        endcount=14;
        flag=1;
        count=0;
        do{}while(count<endcount);
        if(irdata-(irdata/2)*2)
        {
            endcount=42;
        }
        else
        {
            endcount=14;
        }
        flag=0;
        count=0;
        do{}while(count<endcount);
        irdata=irdata>>1;
    }
    irdata=~x;
    for(i=0;i<8;i++)
    {
        endcount=14;
        flag=1;
        count=0;
        do{}while(count<endcount);
        if(irdata-(irdata/2)*2)
        {
            endcount=42;
        }
        else
        {
            endcount=14;
        }
        flag=0;
        count=0;
        do{}while(count<endcount);
        irdata=irdata>>1;
    }
}
void sendend()
{
    endcount=10;
    flag=1;
    count=0;
    do{}while(count<endcount);
    flag=0;
}



数据0,1.png
端口延时.png
回复

使用道具 举报

ID:514901 发表于 2019-4-18 17:01 | 显示全部楼层
暖一下
回复

使用道具 举报

ID:514901 发表于 2019-4-18 17:36 | 显示全部楼层
美的空调的编码规则...
美的R05d电控功能说明书.doc (629.89 KB, 下载次数: 17)
回复

使用道具 举报

ID:401564 发表于 2019-4-18 19:04 | 显示全部楼层
我手头上有两个美的的遥控器,编码的协议都不一样的,不通用的,你就别想这个了
如果你一定要搞,你首先要确定的是你的程序对不对,你得找到一个相同协议的接收器件来验证一下你的程序对不,再去遥控美的
程序不对,你按半天都没有用
等到你验证了你程序是对,按一下不行,就别再搞了,没有必要了
回复

使用道具 举报

ID:497670 发表于 2019-4-18 20:15 | 显示全部楼层
你好!1、你的单片机程序支离破碎,没有完整的工程文件
2、空调的红外控制本来就比较难的
3、我做过美的、奥的斯空调控制(家中只有这两个牌子空调)
4、具体技术问题,欢迎继续讨论
回复

使用道具 举报

ID:514901 发表于 2019-4-19 09:42 | 显示全部楼层
Y_G_G 发表于 2019-4-18 19:04
我手头上有两个美的的遥控器,编码的协议都不一样的,不通用的,你就别想这个了
如果你一定要搞,你首先要确定 ...

我的编码应该是对的,因为我换成nec协议,然后用第二个单片机写了一个接收程序,发送数据和接受数据对得上,可能是我的空调编码不行吧,搞了两个多星期了,学习型红外遥控也没搞成,哎……
回复

使用道具 举报

ID:160500 发表于 2019-4-19 10:17 | 显示全部楼层
你没有搞明白空调的具体编码,光是知道红外协议是不行的。就像说话,你说的是中文,听的人却只懂外文,就算听到了也是不明白什么意思。
回复

使用道具 举报

ID:497670 发表于 2019-4-19 17:09 | 显示全部楼层
你好!建议你做成学习型遥控器,通用型强一些
回复

使用道具 举报

ID:507641 发表于 2019-4-23 20:37 | 显示全部楼层
触码方与 NEC6222不一样
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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