久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

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

QQ登錄

只需一步,快速開始

搜索
查看: 4972|回復(fù): 10
打印 上一主題 下一主題
收起左側(cè)

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

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:792404 發(fā)表于 2020-11-19 08:20 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式

   下面是紅外通信數(shù)據(jù)解碼程序,功能是:按遙控器上的按鍵,使按鍵的數(shù)據(jù)以16進(jìn)制的方式在數(shù)碼管上顯示出來,當(dāng)某個(gè)按鍵按下時(shí)執(zhí)行相應(yīng)的功能。此代碼放在12T的STC89C52上運(yùn)行正常,但是放在1T的STC8G1K08上就出現(xiàn)問題了,現(xiàn)象是:只有幾個(gè)按鍵的數(shù)據(jù)可以解碼出來,大部分的按鍵無效,兩款單片機(jī)的運(yùn)行速度不一樣,延時(shí)函數(shù)的時(shí)間調(diào)了也是沒用,難道是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;  //打開中斷0允許
        EA=1;        //打開總中斷
        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;
                }
        }                       
}

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
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.端口寫數(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)在是所有的按鍵都無效了。
回復(fù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

5#
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è)試過了,還是不行,按鍵無效,我估計(jì)是解碼中斷函數(shù)那里有問題,現(xiàn)在修改中,感謝師傅指點(diǎn)!!
回復(fù)

使用道具 舉報(bào)

6#
ID:401564 發(fā)表于 2020-11-19 18:53 | 只看該作者
YUANYUXING 發(fā)表于 2020-11-19 16:48
這個(gè)試過了,還是不行,按鍵無效,我估計(jì)是解碼中斷函數(shù)那里有問題,現(xiàn)在修改中,感謝師傅指點(diǎn)!!

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

使用道具 舉報(bào)

7#
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í)問題,奇怪的是這個(gè)代碼放在STC89C52上運(yùn)行一切正常,現(xiàn)在移植到STC8G1K08上就出問題了,正常來說,把延時(shí)函數(shù)改成1T模式就可以了,但是還是不行,很奇怪。
回復(fù)

使用道具 舉報(bào)

8#
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)推挽的
如果是仿真,那么這就沒意義了,仿真和實(shí)際是不一樣的,有時(shí)候壓根就沒關(guān)聯(lián)
在調(diào)試階段,最好是把紅外的幾個(gè)延時(shí)分開寫
我不知道delay(1)如果是10uS的話,delay(700)編譯后會(huì)不會(huì)是7mS
我不會(huì)C
你得看一下編譯后的匯編代碼才知道延時(shí)是不是一樣的
回復(fù)

使用道具 舉報(bào)

9#
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í)的地方出了問題,我在研究一下,等有結(jié)果了,發(fā)給大家一起分享
回復(fù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

11#
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先賦值再判斷好似沒啥意義吧,沒有沒見過這種.
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 成人精品一区亚洲午夜久久久 | 一区二区三区在线 | 欧 | 成人做爰www免费看视频网站 | 91精品国产综合久久香蕉922 | xx视频在线观看 | 91在线免费视频 | 亚洲网站在线观看 | 美女黄色在线观看 | 韩日av在线 | 三级黄色片在线观看 | av免费网站在线观看 | 黄色精品 | www国产精 | 欧美极品在线 | 97免费在线观看视频 | 黄色免费网 | 日韩欧美专区 | 中文字幕在线一区二区三区 | 中文字幕二区三区 | 国产一区免费 | 午夜精品一区 | 国产在线观 | 久久精品国产一区二区电影 | 国产激情在线 | 国产成人91视频 | 成人免费在线小视频 | 综合精品久久久 | 我要看黄色录像一级片 | 成人在线视频网 | 久久久久久成人 | 亚洲欧美在线观看 | 欧洲一区在线观看 | 欧美日本在线观看 | 野狼在线社区2017入口 | 久综合| 精品国产一区久久 | 日日夜夜操天天干 | 久久中文字幕一区 | 国产在线精品一区二区三区 | 国产精品视频 | 中文字幕视频一区二区 |