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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2224|回復: 2
打印 上一主題 下一主題
收起左側

想擁有自已的315MHz遙控接收單片機解碼程序,又不會寫

[復制鏈接]
跳轉到指定樓層
樓主
ID:334440 發表于 2022-6-5 09:39 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
在網上找的資料,代碼編繹也沒問題,也下載到單片機內了,也不知道運行了沒有,反正P0的燈珠都不亮,不知道如何著手學習了。


/******************************************
******* 文件名:Decode.c
******* 描  述:對PT226的編碼信號進行解碼
*******         PT2262的輸出信號經三極管
*******            反向后送入單片機的中斷引腳
******* 代  碼:A0 -- A11 中的每bit用2bit表示:0碼:00 ;1碼:11
******* 硬  件:AT89S52 、S9013
******* 晶  振:11.0592
******* 日  期:2008-08-02
******* 備  注:PT2262輸出數據的順序:A0 A1 -- A10 A11+同步碼+A0 A1 -- A10 A11+同步碼,連續發四次
*******************************************/
#include<reg51.h>              //51系列頭文件
#include<intrins.h>               //方便調用_nop_();做延時用;
unsigned char Receive[3] ;       //解碼緩沖區:Receive[0]:A0 A1 A2 A3 ; Recdive[1]:A4 A5 A6 A7 ; Receive[2]: D3 D2 D1 D0
//Recdive[x]:xx xx xx xx 代表 4bit
bit flag = 0 ;                   //解碼完成標志位
sbit RemPin = P3^2 ;           //編碼信號輸入腳
/***************************************
******* 函數名:IntInitial( )
******* 描  述:中斷系統初始化
******* 參  數:輸入參數:無
輸出參數:無
****************************************/
void IntInitial( void )
{
    IT0 = 1 ;               //外部中斷0下降沿有效
    EX0 = 1 ;               //開外部中斷0
    EA =  1 ;                //開全局中斷
}
/******************************************************
******* 函數名:INT0_ISR( )
******* 描  述: 外部中斷0服務函數,實現對PT2262的解碼
******* 參  數:輸入參數:無
輸出參數:無
*******************************************************/
void INT0_ISR(void) interrupt 0 using 1
{
    unsigned char i = 0 ;
    unsigned char j = 0 ;
    unsigned int temp = 0x0000;
    EA = 0 ;
    TH0 = 0 ;
    TL0 = 0 ; //11.0592 最大值 71111us
    while( !RemPin)    ; //等待高電平的到來,檢測同步頭
    TR0 = 1 ; //啟動定時器0,開始測量高電平的寬度
    while( RemPin)
    {
        if( TF0 == 1 )
        {
            goto RemExit; //定時器超時溢出則退出
        }
    }
    TR0 = 0 ;
    temp = TH0 ;
    temp = temp << 8 ;
    temp = temp + TL0 ; //取得高電平的寬度
    if( ( 0x0D8F /*3471*/ < temp ) && ( temp < 0x0F8F /*3983*/) ) //檢測到同步頭
    {
        for( j = 0 ; j < 3 ; j ++) //循環3次
        {
            for( i = 0 ; i < 8; i ++ )
            {
                TH0 = 0 ;
                TL0 = 0 ;
                while( !RemPin); //等待高電平到來
                TR0 = 1 ; //開啟定時器0 ,測量高電平的寬度
                while( RemPin)
                {
                    if( TF0 == 1 )
                    {
                        goto RemExit; //定時溢出則退出
                    }
                }
                TR0 = 0 ;
                temp = TH0 ;
                temp = temp << 8 ;
                temp = temp + TL0 ; //取得高電平的寬度
                if( ( 0x60 /*96*/ < temp ) && (temp< 0x90 /*144*/ ) ) //判斷得窄脈沖:1表示
                {
                    Receive[j] = Receive[j] << 1 ;
                    Receive[j] = Receive[j] + 0x01 ;
                }
                else if( ( 0x0100 /*256*/ <temp) && (temp< 0x0200 /*512*/) ) //判斷得寬脈沖:0表示
                {
                    Receive[j] = Receive[j] << 1 ;
                }
                else return;                     
            }
        }
        flag = 1 ; //表示已解碼完畢
        return;
    }
    else
    {
        goto RemExit;
    }
RemExit:
    {
        TR0 = 0 ;
        EA = 1 ;
        TF0 = 0 ;
        RemPin = 1 ;
        return;
    }        
}
void main( void )
{
    unsigned char i = 0 ;
    unsigned  int j = 0 ;
    unsigned char Dat = 0x00;
    unsigned char RemDat = 0x00 ; //解碼后數據寄存器
    IntInitial( ); //中斷系統初始化
    //Init_uart(); //串口初始化
    while(1)
    {
        if( flag ) //解碼完畢
        {
            flag = 0 ;
            RemDat = 0x00;
            for( i = 0 ; i < 4 ; i ++)
            {
                Dat = Receive[2];
                Receive[2] = Receive[2] << 2 ;
                Dat = Dat & 0xC0; //判斷高2bit
                if( Dat == 0xC0 ) //高2bit:11 ;則為1碼 ;否則為0碼
                {
                    RemDat = RemDat << 1 ;
                    RemDat = RemDat + 0x01;
                }
                else
                {
                    RemDat = RemDat << 1 ;
                }
            }
            P0 = RemDat ; //將解碼后的數據送入P0口,通過開發板上的LED顯示出來
            for( i = 0 ; i < 2 ; i ++) //普通延時
            {
                for( j = 0  ; j < 0xFFFF ; j ++ )
                {
                    _nop_();
                }
            }
            TF0 = 0 ;
            EA = 1 ; //重開中斷
        }
    }
}

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

使用道具 舉報

沙發
ID:844772 發表于 2022-6-6 09:05 | 只看該作者
這個很難一下都說明白,建議你用arduino做,它有個switch庫,可以非常簡單實現。
回復

使用道具 舉報

板凳
ID:334440 發表于 2022-6-6 20:38 | 只看該作者
glinfei 發表于 2022-6-6 09:05
這個很難一下都說明白,建議你用arduino做,它有個switch庫,可以非常簡單實現。

51基礎還沒學扎實,直接學arduino會不會落下什么
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久久久久久久久久久久91 | 91爱啪啪| 欧美国产精品一区二区 | 国产精品久久久久久久久久免费看 | 成人在线视频一区 | 成人黄色电影在线播放 | 国产精品视频久久 | 九九综合 | 中文字幕国产一区 | 国产极品91 | 99久久免费精品 | 99久久99| 午夜影院网站 | 欧美日韩国产一区二区三区 | 日韩在线播放一区 | 中文字幕在线播放不卡 | 久草青青草 | 一级黄色毛片子 | 欧美精品一区二区三区在线 | 久久伊人精品 | 美日韩一区二区 | 日本亚洲一区 | 亚洲国产精久久久久久久 | 欧美日韩一区在线播放 | 久久久999精品 | 在线观看视频h | 久久88| 国产精品久久久久婷婷二区次 | 亚洲欧美视频在线观看 | 婷婷色网 | 免费激情 | 成人av一区 | 免费在线观看成年人视频 | 久久精品国产亚洲一区二区 | 天天玩天天干天天操 | 二区国产| www.五月婷婷.com | 欧美猛交 | 一区二区在线免费观看 | 中文字幕在线观看国产 | 成人精品国产免费网站 |