找回密码
 立即注册

QQ登录

只需一步,快速开始

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

红外遥控继电器单片机程序求解 不知道错在哪里

[复制链接]
跳转到指定楼层
楼主
ID:198192 发表于 2017-5-19 16:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
编写了一个红外遥控继电器的程序,可是却不能完成预期任务,希望大神解释一下程序错在哪儿,程序如下:
#include "reg52.h"                         //此文件中定义了单片机的一些特殊功能寄存器
        

typedef unsigned int u16;          //对数据类型进行声明定义
typedef unsigned char u8;




sbit IRIN=P3^2;
sbit relay=P1^4;//继电器


u8 IrValue[6];
u8 Time;



void IrInit()
{
        IT0=1;//下降沿触发
        EX0=1;//打开中断0允许
        EA=1;        //打开总中断

        IRIN=1;//初始化端口
}

void delay(u16 i)
{
        while(i--);        
}







void ReadIr() interrupt 0
{
        u8 j,k;
        u16 err;
        Time=0;                                         
        delay(700);        //7ms
        if(IRIN==0)                //确认是否真的接收到正确的信号
        {         
               
                err=1000;                                //1000*10us=10ms,超过说明接收到错误的信号
                /*当两个条件都为真是循环,如果有一个条件为假的时候跳出循环,免得程序出错的时
                侯,程序死在这里*/        
                while((IRIN==0)&&(err>0))        //等待前面9ms的低电平过去                  
                {                        
                        delay(1);
                        err--;
                }
                if(IRIN==1)                        //如果正确等到9ms低电平
                {
                        err=500;
                        while((IRIN==1)&&(err>0))                 //等待4.5ms的起始高电平过去
                        {
                                delay(1);
                                err--;
                        }
                        for(k=0;k<4;k++)                //共有4组数据
                        {                                
                                for(j=0;j<8;j++)        //接收一组数据
                                {

                                        err=60;               
                                        while((IRIN==0)&&(err>0))//等待信号前面的560us低电平过去
                                        {
                                                delay(1);
                                                err--;
                                        }
                                        err=500;
                                        while((IRIN==1)&&(err>0))         //计算高电平的时间长度。
                                        {
                                                delay(10);         //0.1ms
                                                Time++;
                                                err--;
                                                if(Time>30)
                                                {
                                                        return;
                                                }
                                        }
                                        IrValue[k]>>=1;         //k表示第几组数据
                                        if(Time>=8)                        //如果高电平出现大于565us,那么是1
                                        {
                                                IrValue[k]|=0x80;
                                        }
                                        Time=0;                //用完时间要重新赋值                                                        
                                }
                        }
                }
                if(IrValue[2]!=~IrValue[3])
                {
                        return;
                }
        }                        
}



void main(){
            relay=0;
                        if(IrValue[2]=0x31){
                                     relay=~relay;
                                                           }
}//判断数据码,开关继电器

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

使用道具 举报

沙发
ID:82765 发表于 2017-5-19 17:35 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

板凳
ID:198192 发表于 2017-5-19 18:42 | 只看该作者
cjjcjj1 发表于 2017-5-19 17:35
你好!控制前,需要先读出你红外遥控器的编码,然后将编码写入程序

在中断程序里已经把数据码放到IrValue[2]中去了啊,在主程序的设计里,应该就只用对其进行判断就行了才对吧。所所以,应该是完成了读出了吧
回复

使用道具 举报

地板
ID:202721 发表于 2017-5-19 23:03 | 只看该作者
读取以后在调试
回复

使用道具 举报

5#
ID:202722 发表于 2017-5-19 23:15 | 只看该作者
主程序不对啊 要加循环
回复

使用道具 举报

6#
ID:202722 发表于 2017-5-19 23:18 | 只看该作者
void main()
{       
        IrInit();
        while(1)
        {       
         if(IrValue[2]==0x31)
         {
          relay=0;
         }
         if(IrValue[2]==0x46)
         {
           relay=1;
         }
}
回复

使用道具 举报

7#
ID:82765 发表于 2017-5-20 06:43 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

8#
ID:289956 发表于 2018-3-20 16:51 | 只看该作者
main加个while
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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