找回密码
 立即注册

QQ登录

只需一步,快速开始

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

初学者自己写的一个51的红外接收程序给位帮忙找下问题

[复制链接]
跳转到指定楼层
楼主
ID:76871 发表于 2015-4-24 22:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
RT/* 红外显示:将读取到的红外信号通过串口在计算机上显示*/
最终结果是用串口助手发到单片机并返回的值与发送的值不一样,也无法把红外信号发回到计算机的串口,初学51请给位帮忙看看是哪里的问题?
#include<reg51.h>

sbit IRIN=P3^2;

void usartconfig();
void  IrInConfig();
void Delay(unsigned char x);

unsigned char Irvalue[6];
unsigned char Time;

void main()
{
        IrInConfig();
        usartconfig();
        SBUF=Irvalue[6];
        while(1);
}

void usartconfig()
{
        SCON=0x50;
        TMOD=0x20;
        PCON=0x80;
        TH1=0xFF;
        TL1=0xF3;
        ES=1;
        EA=1;
        TR1=1;       
}

void IrInConfig()
{
        IT1=1;
        PX0=1;
        EX0=1;
        EA=1;
        IRIN=1;
}

void Delay(unsigned char x)
{
        unsigned char i;
        while(x--){
                for(i=0;i<13;i++)
                        ;
        }
}

void IrRead() interrupt 0
{
        unsigned char j,k;
        unsigned int err;
        Time=0;                                         
        Delay(70);

        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低电平过去
//                                        while (!IRIN)
                                        {
                                                Delay(1);
                                                err--;
                                        }
                                        err=500;
                                        while((IRIN==1)&&(err>0))         //计算高电平的时间长度。
                                        {
                                                Delay(1);//0.14ms
                                                Time++;
                                                err--;
                                                if(Time>30)
                                                {
                                                        EX0=1;
                                                        return;
                                                }
                                        }
                                        Irvalue[k]>>=1;         //k表示第几组数据
                                        if(Time>=8)                        //如果高电平出现大于565us,那么是1
                                        {
                                                Irvalue[k]|=0x80;
                                        }
                                        Time=0;                //用完时间要重新赋值                                                       
                                }
                        }
                }
                if(Irvalue[2]!=~Irvalue[3])
                {
                        return;
                }
        }                       
}

void Usart() interrupt 4
{
        unsigned char a[6];
        if(RI){
                a[6]=SBUF;
                RI=0;
                SBUF=a[6];
                while(!TI);
                TI=0;
        }
}

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

使用道具 举报

沙发
ID:76871 发表于 2015-4-26 18:59 | 只看该作者
为何无人问津?是我提问的方式哪里不对吗?欢迎各位指出。
回复

使用道具 举报

板凳
ID:75782 发表于 2015-4-27 08:38 | 只看该作者
先确定单片机串口发送接受是不是对的, TX和RX短接,看一下是否发射的数据就是接受的数据然后再分析是不是红外返回的数据是否有问题。

评分

参与人数 1黑币 +35 收起 理由
admin + 35 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

地板
ID:78187 发表于 2015-4-27 10:13 | 只看该作者
帮顶                                   
回复

使用道具 举报

5#
ID:78437 发表于 2015-4-29 16:05 | 只看该作者
要不要载波

评分

参与人数 1黑币 +35 收起 理由
admin + 35 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

6#
ID:76287 发表于 2015-5-2 21:49 | 只看该作者
虽然不懂,但还是赞一下,毕竟每个人都是从无到有,最终成就大神之路!!!!!!!!!!!!!
回复

使用道具 举报

7#
ID:76871 发表于 2015-5-3 17:01 | 只看该作者
自己又修改了一下,可还是有问题,逻辑上这样应该是通的吧?但是还是无法把数据发回串口,下面是我改过的代码,继续求助。。。
#include<reg51.h>

sbit IRIN=P3^2;

void usartconfig();
void IrInConfig();
void Delay(unsigned char x);

unsigned char Irvalue[6];
unsigned char Time;

void main()
{
        while(1){
        IrInConfig();
        }
}

void usartconfig()
{
        SCON=0x50;
        TMOD=0x20;
        PCON=0x80;
        TH1=0xF3;
        TL1=0xF3;
        ES=1;
        EA=1;
        TR1=1;       
}

void IrInConfig()
{
        IT0=1;
        EX0=1;
        EA=1;
        IRIN=1;
}

void Delay(unsigned char x)
{
        unsigned char i;
        while(x--){
                for(i=0;i<13;i++)
                        ;
        }
}

void IrRead() interrupt 0
{
        unsigned char j,k;
        unsigned int err;
        Time=0;                                         
        Delay(70);

        while(IRIN==1);
        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低电平过去
//                                        while (!IRIN)
                                        {
                                                Delay(1);
                                                err--;
                                        }
                                        err=500;
                                        while((IRIN==1)&&(err>0))         //计算高电平的时间长度。
                                        {
                                                Delay(1);//0.14ms
                                                Time++;
                                                err--;
                                                if(Time>30)
                                                {
                                                        EX0=1;
                                                        return;
                                                }
                                        }
                                        Irvalue[k]>>=1;         //k表示第几组数据
                                        if(Time>=8)                        //如果高电平出现大于565us,那么是1
                                        {
                                                Irvalue[k]|=0x80;
                                        }
                                        Time=0;                //用完时间要重新赋值                                                       
                                }
                        }
                        usartconfig();
                }
                if(Irvalue[2]!=~Irvalue[3])
                {
                       
                        return;
                }
        }                       

}

void Usart() interrupt 4
{
        if(RI){
                SBUF=Irvalue[2];
                while(!TI);
                TI=0;
        }
        return;
}

回复

使用道具 举报

8#
ID:76871 发表于 2015-5-3 17:17 | 只看该作者
XX,终于可以把数据发回来了,添加了一个对串口发送寄存器的赋值语句就好了,真是艰难,但是发回来的数据是乱码怎么破?是波特率不匹配吗?

#include<reg51.h>

sbit IRIN=P3^2;

void usartconfig();
void  IrInConfig();
void Delay(unsigned char x);

unsigned char Irvalue[6];
unsigned char Time;

void main()
{
        while(1){
        IrInConfig();
        }
}

void usartconfig()
{
        SCON=0x50;
        TMOD=0x20;
        PCON=0x80;
        TH1=0xF3;
        TL1=0xF3;
        ES=1;
        EA=1;
        TR1=1;       
}

void IrInConfig()
{
        IT0=1;
        EX0=1;
        EA=1;
        IRIN=1;
}

void Delay(unsigned char x)
{
        unsigned char i;
        while(x--){
                for(i=0;i<13;i++)
                        ;
        }
}

void IrRead() interrupt 0
{
        unsigned char j,k;
        unsigned int err;
        Time=0;                                         
        Delay(70);

        while(IRIN==1);
        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低电平过去
//                                        while (!IRIN)
                                        {
                                                Delay(1);
                                                err--;
                                        }
                                        err=500;
                                        while((IRIN==1)&&(err>0))         //计算高电平的时间长度。
                                        {
                                                Delay(1);//0.14ms
                                                Time++;
                                                err--;
                                                if(Time>30)
                                                {
                                                        EX0=1;
                                                        return;
                                                }
                                        }
                                        Irvalue[k]>>=1;         //k表示第几组数据
                                        if(Time>=8)                        //如果高电平出现大于565us,那么是1
                                        {
                                                Irvalue[k]|=0x80;
                                        }
                                        Time=0;                //用完时间要重新赋值                                                       
                                }
                        }
                        usartconfig();
                        SBUF=Irvalue[2];
                }
                if(Irvalue[2]!=~Irvalue[3])
                {
                       
                        return;
                }
        }                       

}

void Usart() interrupt 4
{
        while(~TI){
                SBUF=Irvalue[2];
        }
                TI=0;
        return;
}

回复

使用道具 举报

9#
ID:78776 发表于 2015-5-3 22:34 | 只看该作者
我有调试好的你要不?

评分

参与人数 1黑币 +35 收起 理由
admin + 35 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

10#
ID:76871 发表于 2015-5-4 23:53 | 只看该作者
cqhydpj 发表于 2015-5-3 22:34
我有调试好的你要不?

嗯嗯,谢谢你!私信或者直接回复都可以。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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