找回密码
 立即注册

QQ登录

只需一步,快速开始

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

关于1T单片机STC8G1K08的红外通信数据解码问题,求大佬们赐教!

[复制链接]
跳转到指定楼层
楼主
ID:792404 发表于 2020-11-19 08:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

   下面是红外通信数据解码程序,功能是:按遥控器上的按键,使按键的数据以16进制的方式在数码管上显示出来,当某个按键按下时执行相应的功能。此代码放在12T的STC89C52上运行正常,但是放在1T的STC8G1K08上就出现问题了,现象是:只有几个按键的数据可以解码出来,大部分的按键无效,两款单片机的运行速度不一样,延时函数的时间调了也是没用,难道是STC的12T和1T的单片机内核不一样吗?求大佬们赐教!!




#include"stc8g.h"
typedef unsigned int u16;          //对数据类型声明定义
typedef unsigned char u8;

sbit Relay=P5^5;
sbit IRIN=P3^2;           //定义红外接收INT0输入口

u8 IrValue[4];
u8 Time;
u8 DisplayData[4];
u8 code smgduan[18]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
                     0x88,0x83,0xc6,0xa1,0x86,0x8e,0x89,0xff};
                    //0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F、H的显示码


void delay(u16 z)          //z=1时,大约延时10us
{
        u16 x,y;
        for(x=z;x>0;x--)       
                for(y=110;y>0;y--);
}


void DigDisplay()        //数码管显示函数
{
        u8 i;
        P1=0xff;                        //消隐
        P3&=0x0f;                        //位清0
        P1=DisplayData[i];        //段码
        P3|=0x10<<i;                //位码
        i++;
        i%=4;               
}

void IrInit()           //初始化红外线接收
{
        IT0=1;  //下降沿触发
        EX0=1;  //打开中断0允许
        EA=1;        //打开总中断
        IRIN=1; //初始化端口
}

void main()
{       
    P1M0=0x00;
        P1M1=0x00;
        P3M0=0xff;        //P3口设置为强推挽
        P3M1=0x00;
        P5M0=0x00;
        P5M1=0x00;
        IrInit();
        while(1)
        {       
                DisplayData[3] = smgduan[17];                           //此位不显示
                DisplayData[2] = smgduan[IrValue[2]/16];      //显示解码后的16进制的数据值
                DisplayData[1] = smgduan[IrValue[2]%16];
                DisplayData[0] = smgduan[16];                           //显示H,表示16进制的意思
                DigDisplay();

                if(IrValue[2]==0x10)   //接收到某个数值时,执行的功能
                {
                   Relay=~Relay;
                }               
        }               
}

void ReadIr() interrupt 0          //解码红外数值的中断函数
{
        u8 j,k;
        u16 err;
        Time=0;                                         
        delay(700);          
        if(IRIN==0)          
        {                        
                err=1000;                                                           
                while((IRIN==0)&&(err>0))                         
                {                       
                        delay(1);
                        err--;
                }
                if(IRIN==1)                       
                {
                        err=500;
                        while((IRIN==1)&&(err>0))                 
                        {
                                delay(1);
                                err--;
                        }
                        for(k=0;k<4;k++)                //共有4组数据
                        {                               
                                for(j=0;j<8;j++)        //接收一组数据
                                {

                                        err=60;               
                                        while((IRIN==0)&&(err>0))
                                        {
                                                delay(1);
                                                err--;
                                        }
                                        err=500;
                                        while((IRIN==1)&&(err>0))          
                                        {
                                                delay(10);          
                                                Time++;
                                                err--;
                                                if(Time>30)
                                                {
                                                        return;
                                                }
                                        }
                                        IrValue[k]>>=1;          //k表示第几组数据
                                        if(Time>=8)                         
                                        {
                                                IrValue[k]|=0x80;
                                        }
                                        Time=0;                                                                        
                                }
                        }
                }
                if(IrValue[2]!=~IrValue[3])
                {
                        return;
                }
        }                       
}

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

使用道具 举报

沙发
ID:213173 发表于 2020-11-19 10:24 | 只看该作者
1.注意延时函数要修改
/***延时子程序ms(11.0592MHz 12T)****/
void delayms(uint k)
{
        uint i,j;
        for(i=k;i>0;i--)
                for(j=110;j>0;j--);
}
/***延时子程序ms(11.0592MHz 1T)****/
void delayms(uint k)
{
        uint i,j;
        for(i=k;i>0;i--)
                for(j=829;j>0;j--);
}
2.端口写数据后不能立即读,要等待至少1us,否则可能出错。例如:       
        P1=0x0f;//赋值
    _nop_();//延时
    _nop_();
    _nop_();
    _nop_();
        if(P1==0x0f)//判断
        {

        }
回复

使用道具 举报

板凳
ID:792404 发表于 2020-11-19 13:52 | 只看该作者
wulin 发表于 2020-11-19 10:24
1.注意延时函数要修改
/***延时子程序ms(11.0592MHz 12T)****/
void delayms(uint k)

感谢师傅指点,这样改了之后,试了一下,现在是所有的按键都无效了。
回复

使用道具 举报

地板
ID:401564 发表于 2020-11-19 16:18 | 只看该作者
单片机的运行是依靠时钟的
1T和12T运行时钟就不是一个速度的,那延时函数也肯定是不一样的
红外是用靠延时来判断的,所以,时钟不同,就会导致红外不行
你去STC官方下载器那,自己修改一下void delay(u16 z)          //z=1时,大约延时10us
下载器那有,可以设定好晶振和单片机型号之后复制使用就可以了
回复

使用道具 举报

5#
ID:792404 发表于 2020-11-19 16:48 | 只看该作者
Y_G_G 发表于 2020-11-19 16:18
单片机的运行是依靠时钟的
1T和12T运行时钟就不是一个速度的,那延时函数也肯定是不一样的
红外是用靠延时 ...

这个试过了,还是不行,按键无效,我估计是解码中断函数那里有问题,现在修改中,感谢师傅指点!!
回复

使用道具 举报

6#
ID:401564 发表于 2020-11-19 18:53 | 只看该作者
YUANYUXING 发表于 2020-11-19 16:48
这个试过了,还是不行,按键无效,我估计是解码中断函数那里有问题,现在修改中,感谢师傅指点!!

P3.2端口不能设置成强推挽模式,要设置普通模式,不然读取不要外部的电平
如果还不行的话,启用内部上拉电阻试一下
回复

使用道具 举报

7#
ID:792404 发表于 2020-11-19 19:40 | 只看该作者
Y_G_G 发表于 2020-11-19 18:53
P3.2端口不能设置成强推挽模式,要设置普通模式,不然读取不要外部的电平
如果还不行的话,启用内部上拉电 ...

谢谢总工,P3.2口设置成准双向模式后,可以读取到外部电平的变化了,但是还是读不到按键上的数据,应该还是数据解码中断函数中的延时问题,奇怪的是这个代码放在STC89C52上运行一切正常,现在移植到STC8G1K08上就出问题了,正常来说,把延时函数改成1T模式就可以了,但是还是不行,很奇怪。
回复

使用道具 举报

8#
ID:401564 发表于 2020-11-19 22:27 | 只看该作者
YUANYUXING 发表于 2020-11-19 19:40
谢谢总工,P3.2口设置成准双向模式后,可以读取到外部电平的变化了,但是还是读不到按键上的数据,应该还 ...

10uS的延时我在STC下载器上复制了,你对比一下是不是一样的
如果你只用一个延时函数的话,改变就可以了
如果是另的地方也用了其它的延时,也要做相应的改变
STC8G在很多地方和STC89系列是不同的
如果你使用了串口,那么P3.0和P3.1也是不能设定成强推挽的
如果是仿真,那么这就没意义了,仿真和实际是不一样的,有时候压根就没关联
在调试阶段,最好是把红外的几个延时分开写
我不知道delay(1)如果是10uS的话,delay(700)编译后会不会是7mS
我不会C
你得看一下编译后的汇编代码才知道延时是不是一样的
回复

使用道具 举报

9#
ID:792404 发表于 2020-11-20 06:59 | 只看该作者
Y_G_G 发表于 2020-11-19 22:27
10uS的延时我在STC下载器上复制了,你对比一下是不是一样的
如果你只用一个延时函数的话,改变就可以了
...

感谢总工,这个就是延时的地方出了问题,我在研究一下,等有结果了,发给大家一起分享
回复

使用道具 举报

10#
ID:708541 发表于 2021-4-19 15:59 | 只看该作者
STC8G系列可以和STC89C52程序兼容,嫌麻烦不改程序的情况下,直接配置时钟分频寄存器为12分频和传统51单片机一样,这样就可以了,程序是兼容了,但是速度没那么快了。
回复

使用道具 举报

11#
ID:894154 发表于 2021-4-20 09:53 | 只看该作者
wulin 发表于 2020-11-19 10:24
1.注意延时函数要修改
/***延时子程序ms(11.0592MHz 12T)****/
void delayms(uint k)

P1先赋值再判断好似没啥意义吧,没有没见过这种.
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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