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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

簡述STC15408AS單片機模擬38khz格力空調紅外遙控 源程序

  [復制鏈接]
跳轉到指定樓層
樓主
ID:296975 發表于 2019-8-7 12:06 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
本帖最后由 ccccc5321c 于 2019-8-9 00:42 編輯
用單片機做了個自動切換空調模式的電路,就順便簡化了下程序共大家參考:
1、紅外解碼
首先你需要一個紅外分析的基本工具 http://www.360doc.com/content/15/0416/18/54462_463694797.shtml
剛開始毫無頭緒,摸索之后發現紅外分析很重要,雖然網上有些講原理的帖子,但都有些漏洞,而且在調整高低電平間的延遲時,紅外信號的波形是必須有的。
再給一個格力空調的原理講解 https://blog.csdn.net/dddxxxx/article/details/53033748
我的遙控器型號為YB0FB2,所以說驗證碼的計算有些不一樣:模式(低3位逆序)+溫度(低4位逆序)+左右(1位)+換氣(1位)-開關(左移3位)+12,得到的二進制數據取低四位取反
定時部分有2段67位碼,前段測試家里的柜機能用,掛機必須2段相加,第二段驗證碼部分太復雜,沒分析出來。不過我設想可以把48個驗證碼的差值找出來列成數組的形式來編碼(值得注意的是驗證碼只有低4位,屏蔽掉的高4位要加上16的整數倍)

2、程序
網絡上能搜索到不少相關資源,不過不測試你還真不知道哪些是騙分的,有些甚至連38khz載波都沒有就發出來了。不多說了,比較簡單,因為我的板子只做了3個按鍵和2個led,功能只做了模式切換和溫度+-,不過最核心復雜的部分我已經做出來了。如果你的單片機是STCW408AS頻率調到22.1184MHZ,或許你可以直接使用。當然啦如果不是,你需要先完成第一步,然后根據波形調整延遲到準確值(簡單漫長),最后建議用高頻率速度快的單片機,因為編碼延遲要求比較精確。定時部分我用不上也有點復雜,哪位高人做出來記得分享。
附上驗證碼計算的excel和我得keil程序
附件默認扣分,不會設置,所以來個百度云:
游客,本帖隱藏的內容需要積分高于 1 才可瀏覽,您當前積分為 0

全部資料51hei下載地址:
38khz紅外模擬.rar (46.39 KB, 下載次數: 94)
格力空調紅外編碼.rar (56.53 KB, 下載次數: 72)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

來自 19#
ID:296975 發表于 2020-12-10 17:12 | 只看該作者
統一回復一下吧。今天找資料 無意間又來了,看到調試不成功的,于是我又把代碼編譯測試了一下。結果是可以控制空調的。至于調試失敗,我能想到的有幾點:
1、編程的時候要設置IRC頻率22.1184Mhz,并且注意編程的時候頻率有沒有設置成功。我的測試版波特率選太大的時候頻率設置會失敗。
2.沒有載波?,載波是按鍵觸發函數,打開定時器中斷程序發出的,我想到的是應該檢查紅外收發電路。
3、電路圖?我用洞洞板做的,沒畫。幾個相關引腳的是這樣的。芯片16腳輸出,串1k電阻用8050三極管驅動5mm940紅外三極管發射,14腳為模式切換開關,13、10腳為溫度+-按鍵(都是拉低觸發),1腳LED串1個適當電阻,或則接三極管驅動led。
4.不同批次的單片機可能有差異,代碼里的HighCode()和LowCode(),也就是邏輯1和0里的延遲數值就需要調整。這就需要從第1步開始,用空調原裝遙控器的波形對比做微調。
5、這玩意兒純屬分享,而且本人很少逛論壇說以說回復基本隨緣,或者說基本不回復。相信只要仔細一定能調試成功

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

沙發
ID:296975 發表于 2019-8-7 12:36 | 只看該作者
本帖最后由 ccccc5321c 于 2019-8-8 21:33 編輯

#include "STC15W408AS.h"
#include "intrins.h"
#define uchar unsigned char
#define uint unsigned int
uchar c_code[9]={0x98,0x70,0x04,0x8a,0x40,0x08,0x80,0x00,0x40};
uchar mode_code[5]={0x00,0x80,0x40,0xc0,0x20};
short lev,led_delay,key_delay,mode;
sbit key1=P3^7;
sbit key2=P3^6;
sbit key3=P3^1;
sbit out=P1^1;
sbit led1=P1^2;
void Delay5us(int t)        //@22.1184MHz
{
    unsigned char i;
    while(t--)
    {
        _nop_();
        i = 25;
        while (--i);
    }
}
void Delay100us(int t)        //@22.1184MHz
{
    unsigned char i, j;
    while(t--){
        i = 3;
        j = 35;
        do
        {
            while (--j);
        } while (--i);
    }
}
void Delay1ms(int t)        //@22.1184MHz
{
    uchar i, j;
    while(t--){
        _nop_();
        _nop_();
        i = 22;
        j = 128;
        do
        {
            while (--j);
        } while (--i);
    }
}
void HighCode()//邏輯1
{
    lev=1;
    Delay5us(44);
    lev=0;
    Delay5us(122);
}
void LowCode()//邏輯0
{
    lev=1;
    Delay5us(44);
    lev=0;
    Delay5us(44);
}
void StartCode()
{
    lev=1;
    Delay100us(78);
    lev=0;
    Delay100us(40);
}
void EndCode()
{
    lev=1;
    Delay5us(44);
    lev=0;
}
void ConnectCode()
{
    lev=1;
    Delay5us(44);
    lev=0;
    Delay1ms(18);
}
void SendCode()
{
    int i,j;
    uchar c_data;
    IE2 |=0xAF;//打開定時器2中斷(38khz載波)
    StartCode();//起始碼
    for(i=1;i<5;i++)//1-32位
    {   
        c_data=c_code[i-1];
        for(j =1;j<9;j++)
        {
            if(c_data&0x80)
                HighCode();
            else
                LowCode();
            c_data=c_data<<1;
        }
    }
    c_data=c_code[4];
    for(j =1;j<4;j++)//33-35位
    {
        if(c_data&0x80)
            HighCode();
        else
            LowCode();
        c_data=c_data<<1;
    }
    ConnectCode();//連接部分
    for(j =4;j<9;j++)//36-40位
    {
        if(c_data&0x80)
            HighCode();
        else
            LowCode();
        c_data=c_data<<1;
    }
    for(i=6;i<9;i++)//41-64位
    {   
        c_data=c_code[i-1];
        for(j =1;j<9;j++)
        {
            if(c_data&0x80)
                HighCode();
            else
                LowCode();
            c_data=c_data<<1;
        }
    }
    c_data=c_code[8];
    for(j =1;j<4;j++)//65-67位
    {
        if(c_data&0x80)
            HighCode();
        else
            LowCode();
        c_data=c_data<<1;
    }
    EndCode();//結尾
    IE2 |=0x04;//發送完成關閉定時器2(38khz載波)   
}
void Timer2Init(void)        //13微秒@22.1184MHz
{   
    EA=1;            //開總中斷
    AUXR |= 0x04;        //定時器時鐘1T模式
    T2L = 0xE0;        //設置定時初值
    T2H = 0xFE;        //設置定時初值
    AUXR |= 0x10;        //定時器2開始計時
}
void Timer2(void) interrupt 12
{
    if(lev)    //每13us觸發生成38khz載波。將數據調制到載波,lev高電平發送載波,lev低電平時空閑即完成調制發送
        out=~out;
    else
        out=0;            
}
uchar reverse(uchar dat)//8位逆序
{
    dat=(dat<<4)|(dat>>4);
    dat=((dat << 2)&0xcc)|((dat>>2)&0x33);
    dat=((dat << 1)&0xaa)|((dat>>1)&0x55);
    return dat;
}
void CodeCheck(void)//校驗碼計算
{//注:模式(低3位逆序)+溫度(4位逆序)+左右(1位)+換氣(1位)-開關(左移3位)+定時數據(低4位逆序)+12,得到的二進制數據取低四位取反
    uchar ckcode;
    ckcode=(reverse(c_code[0])&0x07)+reverse(c_code[1])+(c_code[4]&0x01)+(c_code[3]>>7)-((c_code[0]>>1)&0x08)+reverse(c_code[2]&0xf0)+12;
    ckcode = reverse(ckcode);
     c_code[7]=(c_code[7]&0xfe)+(ckcode>>7);
    c_code[8]=(ckcode<<1)&0xe0;//共67位,后5位用不到
}
void ModeChange()//改變模式和校驗碼
{
    if(mode<4)
        mode++;
    else
        mode=0;
    c_code[0]=(c_code[0]&0x1f)+mode_code[mode];
    CodeCheck();//重算校驗碼
    SendCode();//發送
}
void TempAdd()
{   
    uchar temputer=reverse(c_code[1]&0xf0);
    if(temputer<14)
    {
        temputer=temputer+1;
        c_code[1]=(c_code[1]&0x0f)+(reverse(temputer)&0xf0);
    }
    CodeCheck();
    SendCode();
}
void TempReduce()
{   
    uchar temputer=reverse(c_code[1]&0xf0);
    if(temputer>0)
    {
        temputer=temputer-1;
        c_code[1]=(c_code[1]&0x0f)+(reverse(temputer)&0xf0);
    }
    CodeCheck();
    SendCode();
}
void LedControl()
{
    if(led_delay==0)
    led1=0;           
    else
    {
    led_delay--;
    led1=~led1;
    }
}
void KeyScan()
{
    if(key_delay>=0)
        key_delay--;
    else
    {
        if(key1==0)//改變模式
        {
            ModeChange();
            key_delay=1;//按鍵間隔時間及消抖            
            led_delay=15;//按鍵后LED短暫閃爍
        }
        else if(key2==0)//溫度+
        {
            TempAdd();
            key_delay=1;//按鍵間隔時間及消抖                        
            led_delay=15;//按鍵后LED短暫閃爍
        }
        else if(key3==0)//溫度-
        {
            TempReduce();   
            key_delay=1;//按鍵間隔時間及消抖                        
            led_delay=15;//按鍵后LED短暫閃爍
        }
    }        
}
void init()
{
    lev=0;//電平信號變量
    led_delay=15;//led燈初始閃爍時間
    key_delay=0;//按鍵間隔
    out=0;//紅外輸出默認置0
    mode=0;//默認自動模式
    P1M1=0x00;P1M0=0x06;//P1 1、2 強推挽輸出
    P3M1=0x00;P3M0=0x00;//p3 1、6、7標準雙向
    led1=0;
    key1=1;key2=1;key3=1;
}
void main()
{
    int i=0;
    init();
    Timer2Init();
    while(1)
    {   
        Delay1ms(100);
        KeyScan();        
        LedControl();//開機后LED短暫閃爍
    }
}

回復

使用道具 舉報

板凳
ID:386381 發表于 2019-8-8 13:58 來自手機 | 只看該作者
謝謝樓主分享,好資料,51黑有你更精彩!!!
回復

使用道具 舉報

地板
ID:385637 發表于 2019-8-8 17:30 | 只看該作者
謝謝樓主分享,我剛好用的就是STC15W408AS這款芯片
回復

使用道具 舉報

5#
ID:128463 發表于 2019-8-9 17:06 | 只看該作者
謝謝樓主分享!!
回復

使用道具 舉報

6#
ID:371958 發表于 2019-8-23 22:25 | 只看該作者
謝謝樓主分享!!
回復

使用道具 舉報

7#
ID:495323 發表于 2019-10-19 03:03 來自手機 | 只看該作者
請問下,發射紅外的模塊是什么?
回復

使用道具 舉報

8#
ID:663108 發表于 2019-12-13 10:56 | 只看該作者
用PWM生成載波是不是更方便些?
回復

使用道具 舉報

9#
ID:398219 發表于 2020-1-15 17:59 | 只看該作者
我調試后沒成功,你們有成功的嗎
回復

使用道具 舉報

10#
ID:684349 發表于 2020-2-4 16:58 | 只看該作者
你好,大佬 我想問下您用的芯片STCW408AS是STC15W408AS的全稱嗎?謝謝
回復

使用道具 舉報

11#
ID:72652 發表于 2020-8-5 14:20 | 只看該作者
我用VS1838做接收,用示波器和邏輯分析儀都沒有看到38K載波。
回復

使用道具 舉報

12#
ID:296975 發表于 2020-12-10 14:06 | 只看該作者
本帖最后由 ccccc5321c 于 2020-12-10 15:44 編輯
licong 發表于 2020-8-5 14:20
我用VS1838做接收,用示波器和邏輯分析儀都沒有看到38K載波。
我想你可能是沒細看代碼,載波是在按下按鍵的時候打卡定時器中斷,然后在中斷的執行程中間斷輸出高低電平來發送的,如果你看明白代碼,那么你就應該知道問題出在哪里。
我覺得你應該先檢查下發射電路,我沒有那么些儀器,用的只是一個洞洞板做的簡單的電路通過電腦上的音頻分析軟件看的波形,接收管用的和你一樣。發射電路我用接的是一個SS8050和1k電阻驅動5mm940紅外發射管

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

13#
ID:296975 發表于 2020-12-10 14:07 | 只看該作者
淮風煙火 發表于 2020-2-4 16:58
你好,大佬 我想問下您用的芯片STCW408AS是STC15W408AS的全稱嗎?謝謝

是的,某一個寶上最便宜的那個
回復

使用道具 舉報

14#
ID:296975 發表于 2020-12-10 14:11 | 只看該作者
efan0 發表于 2019-12-13 10:56
用PWM生成載波是不是更方便些?

我沒想到和pwm能有啥關系 不是發送0 和 1嗎
回復

使用道具 舉報

15#
ID:296975 發表于 2020-12-10 14:12 | 只看該作者
有心插花花木蘭 發表于 2019-10-19 03:03
請問下,發射紅外的模塊是什么?

糾正一下 發射用的時候5mm 940 二極管 也就是遙控器上用的比較多的那個型號 某一個寶很便宜的
回復

使用道具 舉報

16#
ID:296975 發表于 2020-12-10 14:13 | 只看該作者
有心插花花木蘭 發表于 2019-10-19 03:03
請問下,發射紅外的模塊是什么?

5mm 940 紅外LED 某一個寶上 很便宜 和遙控器上的一樣
對了 我覺得有必要說一下 接了一個三極管來驅動它

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

17#
ID:296975 發表于 2020-12-10 14:16 | 只看該作者
本帖最后由 ccccc5321c 于 2020-12-10 15:39 編輯
herui2128 發表于 2020-1-15 17:59
我調試后沒成功,你們有成功的嗎

我看到好幾個都沒成功,代碼都是我之前自己用過的 我想你們應該檢查一下電路,我的電路比較簡單 就沒發圖,發射管我用了一個8050 接一個1k電阻 驅動 5mm 940紅外發射管

我想到還有一種可能 單片機的頻率有差異 導致延遲函數不準確,波形也就不準確

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

18#
ID:296975 發表于 2020-12-10 14:41 | 只看該作者
淮風煙火 發表于 2020-2-4 16:58
你好,大佬 我想問下您用的芯片STCW408AS是STC15W408AS的全稱嗎?謝謝

是全稱 很便宜的那款
回復

使用道具 舉報

20#
ID:819974 發表于 2020-12-15 13:01 | 只看該作者
能問一下如果我要發送開/關,安照表格是不是只要在數據碼第四位置1或置0
回復

使用道具 舉報

21#
ID:860558 發表于 2020-12-15 14:28 | 只看該作者
寫的好!
回復

使用道具 舉報

22#
ID:818895 發表于 2021-1-17 23:09 | 只看該作者
格力空調可以用這樣的遙控編程啊。
回復

使用道具 舉報

23#
ID:201160 發表于 2021-9-26 23:30 | 只看該作者

謝謝樓主分享,好資料,51黑有你更精彩!!!
回復

使用道具 舉報

24#
ID:136485 發表于 2021-9-27 08:50 | 只看該作者
剛好我們辦公室的是格力空調下載下來學習測試下
回復

使用道具 舉報

25#
ID:965189 發表于 2021-10-4 20:44 | 只看該作者
看看能不能利用。
回復

使用道具 舉報

26#
ID:1109276 發表于 2024-6-17 13:19 | 只看該作者
真的能用。不過怎么關機呢?
回復

使用道具 舉報

27#
ID:1109276 發表于 2024-6-18 09:39 | 只看該作者
doodigen 發表于 2024-6-17 13:19
真的能用。不過怎么關機呢?

c_code[0]=(c_code[0]&0x0f)+mode_code[mode];
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品视频久久 | 久久精品电影 | 免费久久精品 | 国产综合av | 91精品一区二区三区久久久久久 | 精品无码久久久久久国产 | 亚洲一区二区久久 | av网站在线播放 | 国产精品a久久久久 | 久久久久国产一区二区三区 | 久久久久久国产免费视网址 | 日韩国产欧美一区 | 成人三级电影 | 日韩欧美国产精品一区二区三区 | 国产aa | 黄色毛片网站在线观看 | 激情五月婷婷综合 | 日本黄色片免费在线观看 | 国产99久久精品一区二区永久免费 | 久久综合av| 中文字幕av在线 | 一区福利视频 | 国产高清一区二区三区 | 羞羞在线观看视频 | 国产午夜精品一区二区三区嫩草 | 在线亚洲免费视频 | 精久久| 91短视频网址 | 人人艹人人| 一级毛片视频 | 国产精品视频97 | 2019中文字幕视频 | 欧洲高清转码区一二区 | 欧美日韩在线观看一区 | 亚洲天堂一区 | 欧美亚洲一区二区三区 | 在线观看免费黄色片 | 成人国产精品色哟哟 | 国产精品亚洲一区二区三区在线 | 久久99精品久久久久久 | 久久久久久91香蕉国产 |