找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 4736|回復(fù): 10
收起左側(cè)

關(guān)于1T單片機(jī)STC8G1K08的紅外通信數(shù)據(jù)解碼問(wèn)題,求大佬們賜教!

[復(fù)制鏈接]
ID:792404 發(fā)表于 2020-11-19 08:20 | 顯示全部樓層 |閱讀模式

   下面是紅外通信數(shù)據(jù)解碼程序,功能是:按遙控器上的按鍵,使按鍵的數(shù)據(jù)以16進(jìn)制的方式在數(shù)碼管上顯示出來(lái),當(dāng)某個(gè)按鍵按下時(shí)執(zhí)行相應(yīng)的功能。此代碼放在12T的STC89C52上運(yùn)行正常,但是放在1T的STC8G1K08上就出現(xiàn)問(wèn)題了,現(xiàn)象是:只有幾個(gè)按鍵的數(shù)據(jù)可以解碼出來(lái),大部分的按鍵無(wú)效,兩款單片機(jī)的運(yùn)行速度不一樣,延時(shí)函數(shù)的時(shí)間調(diào)了也是沒(méi)用,難道是STC的12T和1T的單片機(jī)內(nèi)核不一樣嗎?求大佬們賜教!!




#include"stc8g.h"
typedef unsigned int u16;          //對(duì)數(shù)據(jù)類型聲明定義
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時(shí),大約延時(shí)10us
{
        u16 x,y;
        for(x=z;x>0;x--)       
                for(y=110;y>0;y--);
}


void DigDisplay()        //數(shù)碼管顯示函數(shù)
{
        u8 i;
        P1=0xff;                        //消隱
        P3&=0x0f;                        //位清0
        P1=DisplayData[i];        //段碼
        P3|=0x10<<i;                //位碼
        i++;
        i%=4;               
}

void IrInit()           //初始化紅外線接收
{
        IT0=1;  //下降沿觸發(fā)
        EX0=1;  //打開(kāi)中斷0允許
        EA=1;        //打開(kāi)總中斷
        IRIN=1; //初始化端口
}

void main()
{       
    P1M0=0x00;
        P1M1=0x00;
        P3M0=0xff;        //P3口設(shè)置為強(qiáng)推挽
        P3M1=0x00;
        P5M0=0x00;
        P5M1=0x00;
        IrInit();
        while(1)
        {       
                DisplayData[3] = smgduan[17];                           //此位不顯示
                DisplayData[2] = smgduan[IrValue[2]/16];      //顯示解碼后的16進(jìn)制的數(shù)據(jù)值
                DisplayData[1] = smgduan[IrValue[2]%16];
                DisplayData[0] = smgduan[16];                           //顯示H,表示16進(jìn)制的意思
                DigDisplay();

                if(IrValue[2]==0x10)   //接收到某個(gè)數(shù)值時(shí),執(zhí)行的功能
                {
                   Relay=~Relay;
                }               
        }               
}

void ReadIr() interrupt 0          //解碼紅外數(shù)值的中斷函數(shù)
{
        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組數(shù)據(jù)
                        {                               
                                for(j=0;j<8;j++)        //接收一組數(shù)據(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表示第幾組數(shù)據(jù)
                                        if(Time>=8)                         
                                        {
                                                IrValue[k]|=0x80;
                                        }
                                        Time=0;                                                                        
                                }
                        }
                }
                if(IrValue[2]!=~IrValue[3])
                {
                        return;
                }
        }                       
}

回復(fù)

使用道具 舉報(bào)

ID:213173 發(fā)表于 2020-11-19 10:24 | 顯示全部樓層
1.注意延時(shí)函數(shù)要修改
/***延時(shí)子程序ms(11.0592MHz 12T)****/
void delayms(uint k)
{
        uint i,j;
        for(i=k;i>0;i--)
                for(j=110;j>0;j--);
}
/***延時(shí)子程序ms(11.0592MHz 1T)****/
void delayms(uint k)
{
        uint i,j;
        for(i=k;i>0;i--)
                for(j=829;j>0;j--);
}
2.端口寫(xiě)數(shù)據(jù)后不能立即讀,要等待至少1us,否則可能出錯(cuò)。例如:       
        P1=0x0f;//賦值
    _nop_();//延時(shí)
    _nop_();
    _nop_();
    _nop_();
        if(P1==0x0f)//判斷
        {

        }
回復(fù)

使用道具 舉報(bào)

ID:792404 發(fā)表于 2020-11-19 13:52 | 顯示全部樓層
wulin 發(fā)表于 2020-11-19 10:24
1.注意延時(shí)函數(shù)要修改
/***延時(shí)子程序ms(11.0592MHz 12T)****/
void delayms(uint k)

感謝師傅指點(diǎn),這樣改了之后,試了一下,現(xiàn)在是所有的按鍵都無(wú)效了。
回復(fù)

使用道具 舉報(bào)

ID:401564 發(fā)表于 2020-11-19 16:18 | 顯示全部樓層
單片機(jī)的運(yùn)行是依靠時(shí)鐘的
1T和12T運(yùn)行時(shí)鐘就不是一個(gè)速度的,那延時(shí)函數(shù)也肯定是不一樣的
紅外是用靠延時(shí)來(lái)判斷的,所以,時(shí)鐘不同,就會(huì)導(dǎo)致紅外不行
你去STC官方下載器那,自己修改一下void delay(u16 z)          //z=1時(shí),大約延時(shí)10us
下載器那有,可以設(shè)定好晶振和單片機(jī)型號(hào)之后復(fù)制使用就可以了
回復(fù)

使用道具 舉報(bào)

ID:792404 發(fā)表于 2020-11-19 16:48 | 顯示全部樓層
Y_G_G 發(fā)表于 2020-11-19 16:18
單片機(jī)的運(yùn)行是依靠時(shí)鐘的
1T和12T運(yùn)行時(shí)鐘就不是一個(gè)速度的,那延時(shí)函數(shù)也肯定是不一樣的
紅外是用靠延時(shí) ...

這個(gè)試過(guò)了,還是不行,按鍵無(wú)效,我估計(jì)是解碼中斷函數(shù)那里有問(wèn)題,現(xiàn)在修改中,感謝師傅指點(diǎn)!
回復(fù)

使用道具 舉報(bào)

ID:401564 發(fā)表于 2020-11-19 18:53 | 顯示全部樓層
YUANYUXING 發(fā)表于 2020-11-19 16:48
這個(gè)試過(guò)了,還是不行,按鍵無(wú)效,我估計(jì)是解碼中斷函數(shù)那里有問(wèn)題,現(xiàn)在修改中,感謝師傅指點(diǎn)。

P3.2端口不能設(shè)置成強(qiáng)推挽模式,要設(shè)置普通模式,不然讀取不要外部的電平
如果還不行的話,啟用內(nèi)部上拉電阻試一下
回復(fù)

使用道具 舉報(bào)

ID:792404 發(fā)表于 2020-11-19 19:40 | 顯示全部樓層
Y_G_G 發(fā)表于 2020-11-19 18:53
P3.2端口不能設(shè)置成強(qiáng)推挽模式,要設(shè)置普通模式,不然讀取不要外部的電平
如果還不行的話,啟用內(nèi)部上拉電 ...

謝謝總工,P3.2口設(shè)置成準(zhǔn)雙向模式后,可以讀取到外部電平的變化了,但是還是讀不到按鍵上的數(shù)據(jù),應(yīng)該還是數(shù)據(jù)解碼中斷函數(shù)中的延時(shí)問(wèn)題,奇怪的是這個(gè)代碼放在STC89C52上運(yùn)行一切正常,現(xiàn)在移植到STC8G1K08上就出問(wèn)題了,正常來(lái)說(shuō),把延時(shí)函數(shù)改成1T模式就可以了,但是還是不行,很奇怪。
回復(fù)

使用道具 舉報(bào)

ID:401564 發(fā)表于 2020-11-19 22:27 | 顯示全部樓層
YUANYUXING 發(fā)表于 2020-11-19 19:40
謝謝總工,P3.2口設(shè)置成準(zhǔn)雙向模式后,可以讀取到外部電平的變化了,但是還是讀不到按鍵上的數(shù)據(jù),應(yīng)該還 ...

10uS的延時(shí)我在STC下載器上復(fù)制了,你對(duì)比一下是不是一樣的
如果你只用一個(gè)延時(shí)函數(shù)的話,改變就可以了
如果是另的地方也用了其它的延時(shí),也要做相應(yīng)的改變
STC8G在很多地方和STC89系列是不同的
如果你使用了串口,那么P3.0和P3.1也是不能設(shè)定成強(qiáng)推挽的
如果是仿真,那么這就沒(méi)意義了,仿真和實(shí)際是不一樣的,有時(shí)候壓根就沒(méi)關(guān)聯(lián)
在調(diào)試階段,最好是把紅外的幾個(gè)延時(shí)分開(kāi)寫(xiě)
我不知道delay(1)如果是10uS的話,delay(700)編譯后會(huì)不會(huì)是7mS
我不會(huì)C
你得看一下編譯后的匯編代碼才知道延時(shí)是不是一樣的
回復(fù)

使用道具 舉報(bào)

ID:792404 發(fā)表于 2020-11-20 06:59 | 顯示全部樓層
Y_G_G 發(fā)表于 2020-11-19 22:27
10uS的延時(shí)我在STC下載器上復(fù)制了,你對(duì)比一下是不是一樣的
如果你只用一個(gè)延時(shí)函數(shù)的話,改變就可以了
...

感謝總工,這個(gè)就是延時(shí)的地方出了問(wèn)題,我在研究一下,等有結(jié)果了,發(fā)給大家一起分享
回復(fù)

使用道具 舉報(bào)

ID:708541 發(fā)表于 2021-4-19 15:59 | 顯示全部樓層
STC8G系列可以和STC89C52程序兼容,嫌麻煩不改程序的情況下,直接配置時(shí)鐘分頻寄存器為12分頻和傳統(tǒng)51單片機(jī)一樣,這樣就可以了,程序是兼容了,但是速度沒(méi)那么快了。
回復(fù)

使用道具 舉報(bào)

ID:894154 發(fā)表于 2021-4-20 09:53 | 顯示全部樓層
wulin 發(fā)表于 2020-11-19 10:24
1.注意延時(shí)函數(shù)要修改
/***延時(shí)子程序ms(11.0592MHz 12T)****/
void delayms(uint k)

P1先賦值再判斷好似沒(méi)啥意義吧,沒(méi)有沒(méi)見(jiàn)過(guò)這種.
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表