找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

stc8h單片機(jī)做的紅外遙控器程序,帶休眠電流0.4ua,帶電池電壓檢測,帶串口調(diào)試

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:82809 發(fā)表于 2022-7-10 13:47 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
stc8h做的紅外遙控器,休眠電流0.4ua,帶電池電壓檢測,帶串口調(diào)試,注釋齊全,和大家探討一下!
原理圖和布線如下:


單片機(jī)源程序如下:

//---------------------注意!。。!--------------------------
//下載時(shí),下載界面"硬件選項(xiàng)"中下面的項(xiàng)要設(shè)置如下:
//   1. 設(shè)置用戶EEPROM大小為 >1K。
//   2. 在程序的結(jié)束處添加重要測試參數(shù)
//   3. 不勾選  允許低壓復(fù)位(禁止低壓中斷)。
//   4. 低壓檢測電壓  2.00V
//-------------------------------------------------------------

#include  "MAIN.H"
#include  "TIMER.H"
#include  "key.h"
#include  "urat1.h"
#include  "led.h"
#include  "ir_tx.h"
#include  "BAT_AD.H"
#include  "PownOn_Save.H"

void Delay1ms(unsigned int n)      //n*1ms 11.0592MHz,STC-Y6
{
        unsigned char i, j;
        while(n)
        {
                i = 15;
                j = 90;
                do
                {
                        while (--j);
                }
                while (--i);
                n--;
        }
}

void main(void)
{
        P0M1 = 0x00;
        P0M0 = 0x00; //設(shè)置為準(zhǔn)雙向口
        P1M1 = 0x00;
        P1M0 = 0x00; //設(shè)置為準(zhǔn)雙向口
        P2M1 = 0x00;
        P2M0 = 0x00; //設(shè)置為準(zhǔn)雙向口
        P3M1 = 0x00;
        P3M0 = 0x00; //設(shè)置為準(zhǔn)雙向口
        P4M1 = 0x00;
        P4M0 = 0x00; //設(shè)置為準(zhǔn)雙向口
        P5M1 = 0x00;
        P5M0 = 0x00; //設(shè)置為準(zhǔn)雙向口
        P6M1 = 0x00;
        P6M0 = 0x00; //設(shè)置為準(zhǔn)雙向口
        P7M1 = 0x00;
        P7M0 = 0x00; //設(shè)置為準(zhǔn)雙向口

        P0 = 0XFF;
        P1 = 0XFF;
        P2 = 0XFF;
        P3 = 0XFF;
        P4 = 0XFF;
        P5 = 0XFF;
        P6 = 0XFF;

        IR_TX  = 0;                                                //IR+LED5
        Delay1ms(300);
        IR_TX  = 1;
        LD1_25 = 0;                 //風(fēng)速25%
        Delay1ms(300);
        LD1_25 = 1;                 //風(fēng)速25%
        LD2_50 = 0;                 //風(fēng)速50%
        Delay1ms(300);
        LD2_50 = 1;                 //風(fēng)速50%
        LD3_75 = 0;                 //風(fēng)速75%
        Delay1ms(300);
        LD3_75 = 1;                 //風(fēng)速75%
        LD4_100 = 0;                 //風(fēng)速100%
        Delay1ms(300);
        LD4_100 = 1;                 //風(fēng)速100%

        WDT_CONTR = (D_EN_WDT + D_CLR_WDT + D_WDT_SCALE_32);//1.13s喂狗
        led_init();                                                      //led IO初始化
        ir_init();                        //紅外PWM初始化
        key_init();                       //按鍵IO初始化
        timer0_init();                    //定時(shí)器0初始化
        timer1_init();                    //定時(shí)器1初始化
        timer3_init();                    //定時(shí)器3初始化
        uart1_init();                                                          //串口1初始化
        BAT_AD_init();                    //BAT_AD初始化
  EEPROM_init();                    //EEPROM初始化
  
        EA = 1;                                       //打開總中斷

        Delay1ms(20);
        uart1_SendString("\r\n yaokong_IR-Tx V1.0 遙控器");//串口1
        uart1_SendString("\r\n PCB: LXWP-003 V1.0 ");//串口1
  uart1_SendString("\r\n 軟件版本: V1.1 2021/12/29");//串口1
  uart1_SendString("\r\n 已上電次數(shù):");        //串口1
  uart1_Sendword(PownOn_cnt / 1000 + 48); //發(fā)送用戶碼千位
        uart1_Sendword(PownOn_cnt % 1000 / 100 + 48); //發(fā)送用戶碼百位
        uart1_Sendword(PownOn_cnt % 100 / 10 + 48); //發(fā)送用戶碼十位
        uart1_Sendword(PownOn_cnt % 10 + 48);   //發(fā)送用戶碼個(gè)位
  
        while(1)
        {
                WDT_CONTR = (D_EN_WDT + D_CLR_WDT + D_WDT_SCALE_32);//1.13s喂狗
                KeyScan();
                key_gongneng();                 //鍵功能
                ir_tx_data();                   //發(fā)射一幀數(shù)據(jù)

                fs_led();                       //風(fēng)速顯示
        }
}

/*******************  功能說明  測試OK *************************/
//模擬NEC編碼,紅外發(fā)射程序,能設(shè)置用戶碼.
//使用PWM4產(chǎn)生38KHZ載波, 1/3占空比, 每個(gè)38KHZ周期發(fā)射管發(fā)射9us,關(guān)閉26.3us.
/***************************************************************/
#include  "ir_tx.h"
#include  "key.h"
#include  "urat1.h"
#include  "BAT_AD.H"

#define IR_Fosc     37900UL                          //定義IR頻率
unsigned int   tx_cnt;            //38KHZ脈沖計(jì)數(shù), 紅外頻率為38KHZ=周期26.3us

unsigned char  user_data;                            //用戶數(shù)據(jù)碼, 0-255
unsigned char  user_data_time;    //用戶數(shù)據(jù)碼發(fā)送間隔時(shí)間
void ir_init()                    //紅外PWM初始化
{
  P3M1 &= 0x10;                   //P34
        P3M0 &= 0x10;                   //設(shè)置為準(zhǔn)雙向口
  IR_TX = 1;                                                          //關(guān)閉發(fā)射io口
  
        P_SW2 |= 0x80;
        PWMA_CCER2 = 0x00;                                             //寫 CCMRx 前必須先清零 CCxE 關(guān)閉通道
        PWMA_CCMR4 = 0x60;                                             //設(shè)置 PWM4 模式1 輸出
  PWMA_PS = 0xC0; //4P_4 輸出腳選擇位, 0x00:P1.6, 0x40:P2.6, 0x80:P6.6, 0xC0:P3.4
        PWMA_ARR = MAIN_Fosc/IR_Fosc;   //設(shè)置周期時(shí)間0x0123=291,0x0124=292
                                                                                                                                        //11.0592MHz/(37.9K/38K)=38KHz/291.03=37.9KHz/292(291.8)
        PWMA_CCR4 = MAIN_Fosc/IR_Fosc/2;//設(shè)置占空比時(shí)間291/3=97,33%
        PWMA_ENO = 0x40;                                                     //使能 PWM4P 輸出
        PWMA_BKR = 0x80;                                                     //使能主輸出
  IP2 |= 0x04;                    //1級中斷優(yōu)先級
        PWMA_CR1 |= 0x01;                                             //PWMA開始計(jì)時(shí)
}

void IR_TxPulse(unsigned int pulse)                //發(fā)送脈沖函數(shù)
{
        P_SW2 |= 0x80;
        tx_cnt = pulse;
        PWMA_CCER2 = 0x00;                                             //寫 CCMRx 前必須先清零 CCxE 關(guān)閉通道
        PWMA_CCMR4 = 0x60;                                             //設(shè)置 PWM4 模式1 輸出
        PWMA_CCER2 = 0x30;                                             //低電平有效, 使能 CC4E 通道
        PWMA_SR1 = 0;                   //清標(biāo)志位
        PWMA_CNTR = 0;                  //清計(jì)數(shù)器
        PWMA_IER = 0x10;                                               //使能捕獲/比較 4 中斷  
        while(tx_cnt);
}

void IR_TxSpace(unsigned int pulse)                //發(fā)送空閑函數(shù)
{
        P_SW2 |= 0x80;
        tx_cnt = pulse;
        PWMA_CCER2 = 0x00;                                             //寫 CCMRx 前必須先清零 CCxE 關(guān)閉通道
        PWMA_CCMR4 = 0x40;                                             //設(shè)置 PWM4 強(qiáng)制為無效電平
        PWMA_CCER2 = 0x30;                                             //低電平有效,使能 CC4E 通道
        PWMA_SR1 = 0;                   //清標(biāo)志位
        PWMA_CNTR = 0;                  //清計(jì)數(shù)器
        PWMA_IER = 0x10;                                               //使能捕獲/比較 4 中斷
        while(tx_cnt);
}

void IR_TxByte(unsigned char dat)        //發(fā)送一個(gè)字節(jié)函數(shù)
{
        unsigned char i;
        for(i = 0; i < 8; i++)          //先發(fā)bit0
        {
    IR_TxPulse(21);                                                    //發(fā)送高電平脈沖,都是0.5625ms
                if(dat & 1)                   //對應(yīng)高電平位
                {
                        IR_TxSpace(63);             //發(fā)送空閑函數(shù),發(fā)送63個(gè)38khz脈沖
                }
                else                          //對應(yīng)低電平位
                {
                        IR_TxSpace(21);             //發(fā)送空閑函數(shù),發(fā)送21個(gè)38khz脈沖
                }
                dat >>= 1;                          //下一個(gè)位
        }
}

void ir_tx_data()                  //發(fā)射一幀數(shù)據(jù)
{
        if(user_data)                                                          //檢測到鍵碼
        {               
                //一幀數(shù)據(jù)最小長度 = 9 + 4.5+ 24 * 1.125 + 8 * 2.25 + 0.5625  = 59.0625 ms
                //一幀數(shù)據(jù)最大長度 = 9 + 4.5+ 8 * 1.125 + 24 * 2.25  + 0.5625 = 77.0625 ms
                IR_TxPulse(342);                                       //對應(yīng)9ms,                同步頭脈沖9ms
                IR_TxSpace(171);                                       //對應(yīng)4.5ms,        同步頭空閑4.5ms
   
                IR_TxByte(User_address % 256); //發(fā)用戶地址碼低字節(jié)
                IR_TxByte(User_address / 256); //發(fā)用戶地址碼高字節(jié)
                IR_TxByte(user_data);          //發(fā)用戶數(shù)據(jù)碼
                IR_TxByte(~user_data);         //發(fā)用戶數(shù)據(jù)反碼
   
    IR_TxPulse(21);                                        //結(jié)束碼,0.5625ms
   
    user_data_uart1();             //uart1顯示鍵功能
                user_data = 0;
                bat_uart();                    //發(fā)送電池電壓
        }
}

Keil代碼下載: Keil代碼.7z (79.92 KB, 下載次數(shù): 190)

評分

參與人數(shù) 1黑幣 +15 收起 理由
lkc8210 + 15 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評分

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

相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:161164 發(fā)表于 2022-7-11 10:32 | 只看該作者
感謝分享
最近也在弄紅外遙控
本來用delay來控制發(fā)射管的開關(guān)
但一改變晶振頻率就要修改delay函數(shù)
看到你的延時(shí)方法茅室頓開
收下了

另外,3V串100歐姆來驅(qū)動發(fā)射管
控制范圍有多遠(yuǎn)?

另另外,為什么用1/3占空比?
回復(fù)

使用道具 舉報(bào)

板凳
ID:82809 發(fā)表于 2022-7-11 13:33 | 只看該作者
lkc8210 發(fā)表于 2022-7-11 10:32
感謝分享
最近也在弄紅外遙控
本來用delay來控制發(fā)射管的開關(guān)

串100歐姆發(fā)射約7,8米,1/3占空比是為了發(fā)射時(shí)省電.

評分

參與人數(shù) 1黑幣 +15 收起 理由
lkc8210 + 15 回帖助人的獎(jiǎng)勵(lì)!

查看全部評分

回復(fù)

使用道具 舉報(bào)

地板
ID:161164 發(fā)表于 2022-7-12 15:01 | 只看該作者
pfdqwp 發(fā)表于 2022-7-11 13:33
串100歐姆發(fā)射約7,8米,1/3占空比是為了發(fā)射時(shí)省電.

明白~謝謝解答
回復(fù)

使用道具 舉報(bào)

5#
ID:89420 發(fā)表于 2022-12-4 17:53 | 只看該作者
感謝樓主的無私分享,剛好想幫RS Media做個(gè)遙控。編程底子不好,希望這個(gè)能用得上。
回復(fù)

使用道具 舉報(bào)

6#
ID:89420 發(fā)表于 2022-12-4 17:55 | 只看該作者
我有代碼和相關(guān)資料,如果樓主可以幫忙做一個(gè)專用的遙控那就更棒了。當(dāng)然,肯定要給辛苦費(fèi)的。
回復(fù)

使用道具 舉報(bào)

7#
ID:82809 發(fā)表于 2023-3-11 02:09 | 只看該作者
menwawork 發(fā)表于 2022-12-4 17:55
我有代碼和相關(guān)資料,如果樓主可以幫忙做一個(gè)專用的遙控那就更棒了。當(dāng)然,肯定要給辛苦費(fèi)的。

不知你現(xiàn)在還需要不?可以幫你弄下。
回復(fù)

使用道具 舉報(bào)

8#
ID:235359 發(fā)表于 2023-3-11 10:14 | 只看該作者
pfdqwp 發(fā)表于 2023-3-11 02:09
不知你現(xiàn)在還需要不?可以幫你弄下。

你這個(gè)怎么喚醒的 沒有看明白
回復(fù)

使用道具 舉報(bào)

9#
ID:161164 發(fā)表于 2023-3-11 11:39 | 只看該作者
我比黑點(diǎn)子更黑 發(fā)表于 2023-3-11 10:14
你這個(gè)怎么喚醒的 沒有看明白


回復(fù)

使用道具 舉報(bào)

10#
ID:82809 發(fā)表于 2023-3-11 19:42 | 只看該作者
回復(fù)

使用道具 舉報(bào)

11#
ID:82809 發(fā)表于 2023-3-11 19:43 | 只看該作者
我比黑點(diǎn)子更黑 發(fā)表于 2023-3-11 10:14
你這個(gè)怎么喚醒的 沒有看明白

K_INT外部中斷。
回復(fù)

使用道具 舉報(bào)

12#
ID:235359 發(fā)表于 2023-3-11 23:21 | 只看該作者
我喚醒有一個(gè)按鍵忘記放在中斷了  放在普通IO口了  有沒有其他辦法可以喚醒 據(jù)說定時(shí)器中斷喚醒 可以這樣嗎  有沒有案列
回復(fù)

使用道具 舉報(bào)

13#
ID:82809 發(fā)表于 2023-3-12 18:58 | 只看該作者
我比黑點(diǎn)子更黑 發(fā)表于 2023-3-11 23:21
我喚醒有一個(gè)按鍵忘記放在中斷了  放在普通IO口了  有沒有其他辦法可以喚醒 據(jù)說定時(shí)器中斷喚醒 可以這樣嗎 ...

定時(shí)器中斷不行,如果忘記,可以看下io口中斷。stc8h支持的。
回復(fù)

使用道具 舉報(bào)

14#
ID:235359 發(fā)表于 2023-3-12 23:07 | 只看該作者
pfdqwp 發(fā)表于 2023-3-12 18:58
定時(shí)器中斷不行,如果忘記,可以看下io口中斷。stc8h支持的。

IO口中斷相關(guān)寄存器 我 研究下 好像這個(gè)寫的不明白
回復(fù)

使用道具 舉報(bào)

15#
ID:235359 發(fā)表于 2023-3-13 00:21 | 只看該作者

我給外部中斷0 1喚醒好奇怪  我開機(jī)要按開關(guān)10幾次 后面就能正常喚醒了  前面死活不行  不知道為什么 可以指導(dǎo)下嗎  
回復(fù)

使用道具 舉報(bào)

16#
ID:433219 發(fā)表于 2023-3-13 08:20 | 只看該作者
  簡單產(chǎn)品,做好接收器就好了(最多定做個(gè)PVC面板),買個(gè)現(xiàn)成的遙控器也才1¥
回復(fù)

使用道具 舉報(bào)

17#
ID:82809 發(fā)表于 2023-3-13 14:42 | 只看該作者
我比黑點(diǎn)子更黑 發(fā)表于 2023-3-13 00:21
我給外部中斷0 1喚醒好奇怪  我開機(jī)要按開關(guān)10幾次 后面就能正常喚醒了  前面死活不行  不知道為什么 可 ...

應(yīng)該是下降沿喚醒的,你看參考stc8h規(guī)格書。
回復(fù)

使用道具 舉報(bào)

18#
ID:388929 發(fā)表于 2023-3-13 15:19 | 只看該作者
樓主,能賣我兩塊板試試嗎
回復(fù)

使用道具 舉報(bào)

19#
ID:82809 發(fā)表于 2023-3-14 18:42 | 只看該作者
billaj 發(fā)表于 2023-3-13 15:19
樓主,能賣我兩塊板試試嗎

之前公司做過的產(chǎn)品,我現(xiàn)在手里沒有這個(gè)板子。
回復(fù)

使用道具 舉報(bào)

20#
ID:607642 發(fā)表于 2024-11-18 18:55 | 只看該作者
我正好需要 你正好有。
回復(fù)

使用道具 舉報(bào)

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

本版積分規(guī)則

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

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

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