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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4685|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 午夜欧美a级理论片915影院 | 中文字幕国产 | 中文字幕免费中文 | 午夜一区 | 天天躁人人躁人人躁狂躁 | 欧美性区 | 国产日韩欧美电影 | 韩日一区 | 日韩三级免费网站 | 中文字幕视频在线观看 | 久草在线在线精品观看 | 一级免费在线视频 | 久久久激情| 亚洲免费在线观看 | 精品亚洲一区二区三区 | 91精品国产乱码久久久久久久久 | 天天狠狠 | 久久综合影院 | 免费在线毛片 | 久久亚洲综合 | 自拍第一页 | 日韩福利在线 | 欧美成视频 | 成人精品免费视频 | 一区二区在线不卡 | 女生羞羞视频 | 超碰在线久 | 国产丝袜一区二区三区免费视频 | 91国产在线播放 | 亚洲一区在线日韩在线深爱 | 色综合色综合网色综合 | 午夜私人影院在线观看 | www.久久99| 成人在线视频网址 | 中文字幕亚洲精品 | 国产精品久久网 | 久久久久久综合 | 在线视频一区二区 | 久久天堂 | 黄色免费三级 | 久久天天躁狠狠躁夜夜躁2014 |