找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3872|回复: 18
收起左侧

stc8h单片机做的红外遥控器程序,带休眠电流0.4ua,带电池电压检测,带串口调试

  [复制链接]
ID:82809 发表于 2022-7-10 13:47 | 显示全部楼层 |阅读模式
stc8h做的红外遥控器,休眠电流0.4ua,带电池电压检测,带串口调试,注释齐全,和大家探讨一下!
原理图和布线如下:
pcb.PNG 原理图.PNG pcb3d.PNG

单片机源程序如下:

//---------------------注意!!!!!--------------------------
//下载时,下载界面"硬件选项"中下面的项要设置如下:
//   1. 设置用户EEPROM大小为 >1K。
//   2. 在程序的结束处添加重要测试参数
//   3. 不勾选  允许低压复位(禁止低压中断)。
//   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; //设置为准双向口
        P1M1 = 0x00;
        P1M0 = 0x00; //设置为准双向口
        P2M1 = 0x00;
        P2M0 = 0x00; //设置为准双向口
        P3M1 = 0x00;
        P3M0 = 0x00; //设置为准双向口
        P4M1 = 0x00;
        P4M0 = 0x00; //设置为准双向口
        P5M1 = 0x00;
        P5M0 = 0x00; //设置为准双向口
        P6M1 = 0x00;
        P6M0 = 0x00; //设置为准双向口
        P7M1 = 0x00;
        P7M0 = 0x00; //设置为准双向口

        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;                 //风速25%
        Delay1ms(300);
        LD1_25 = 1;                 //风速25%
        LD2_50 = 0;                 //风速50%
        Delay1ms(300);
        LD2_50 = 1;                 //风速50%
        LD3_75 = 0;                 //风速75%
        Delay1ms(300);
        LD3_75 = 1;                 //风速75%
        LD4_100 = 0;                 //风速100%
        Delay1ms(300);
        LD4_100 = 1;                 //风速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();                    //定时器0初始化
        timer1_init();                    //定时器1初始化
        timer3_init();                    //定时器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 已上电次数:");        //串口1
  uart1_Sendword(PownOn_cnt / 1000 + 48); //发送用户码千位
        uart1_Sendword(PownOn_cnt % 1000 / 100 + 48); //发送用户码百位
        uart1_Sendword(PownOn_cnt % 100 / 10 + 48); //发送用户码十位
        uart1_Sendword(PownOn_cnt % 10 + 48);   //发送用户码个位
  
        while(1)
        {
                WDT_CONTR = (D_EN_WDT + D_CLR_WDT + D_WDT_SCALE_32);//1.13s喂狗
                KeyScan();
                key_gongneng();                 //键功能
                ir_tx_data();                   //发射一帧数据

                fs_led();                       //风速显示
        }
}

/*******************  功能说明  测试OK *************************/
//模拟NEC编码,红外发射程序,能设置用户码.
//使用PWM4产生38KHZ载波, 1/3占空比, 每个38KHZ周期发射管发射9us,关闭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脉冲计数, 红外频率为38KHZ=周期26.3us

unsigned char  user_data;                            //用户数据码, 0-255
unsigned char  user_data_time;    //用户数据码发送间隔时间
void ir_init()                    //红外PWM初始化
{
  P3M1 &= 0x10;                   //P34
        P3M0 &= 0x10;                   //设置为准双向口
  IR_TX = 1;                                                          //关闭发射io口
  
        P_SW2 |= 0x80;
        PWMA_CCER2 = 0x00;                                             //写 CCMRx 前必须先清零 CCxE 关闭通道
        PWMA_CCMR4 = 0x60;                                             //设置 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;   //设置周期时间0x0123=291,0x0124=292
                                                                                                                                        //11.0592MHz/(37.9K/38K)=38KHz/291.03=37.9KHz/292(291.8)
        PWMA_CCR4 = MAIN_Fosc/IR_Fosc/2;//设置占空比时间291/3=97,33%
        PWMA_ENO = 0x40;                                                     //使能 PWM4P 输出
        PWMA_BKR = 0x80;                                                     //使能主输出
  IP2 |= 0x04;                    //1级中断优先级
        PWMA_CR1 |= 0x01;                                             //PWMA开始计时
}

void IR_TxPulse(unsigned int pulse)                //发送脉冲函数
{
        P_SW2 |= 0x80;
        tx_cnt = pulse;
        PWMA_CCER2 = 0x00;                                             //写 CCMRx 前必须先清零 CCxE 关闭通道
        PWMA_CCMR4 = 0x60;                                             //设置 PWM4 模式1 输出
        PWMA_CCER2 = 0x30;                                             //低电平有效, 使能 CC4E 通道
        PWMA_SR1 = 0;                   //清标志位
        PWMA_CNTR = 0;                  //清计数器
        PWMA_IER = 0x10;                                               //使能捕获/比较 4 中断  
        while(tx_cnt);
}

void IR_TxSpace(unsigned int pulse)                //发送空闲函数
{
        P_SW2 |= 0x80;
        tx_cnt = pulse;
        PWMA_CCER2 = 0x00;                                             //写 CCMRx 前必须先清零 CCxE 关闭通道
        PWMA_CCMR4 = 0x40;                                             //设置 PWM4 强制为无效电平
        PWMA_CCER2 = 0x30;                                             //低电平有效,使能 CC4E 通道
        PWMA_SR1 = 0;                   //清标志位
        PWMA_CNTR = 0;                  //清计数器
        PWMA_IER = 0x10;                                               //使能捕获/比较 4 中断
        while(tx_cnt);
}

void IR_TxByte(unsigned char dat)        //发送一个字节函数
{
        unsigned char i;
        for(i = 0; i < 8; i++)          //先发bit0
        {
    IR_TxPulse(21);                                                    //发送高电平脉冲,都是0.5625ms
                if(dat & 1)                   //对应高电平位
                {
                        IR_TxSpace(63);             //发送空闲函数,发送63个38khz脉冲
                }
                else                          //对应低电平位
                {
                        IR_TxSpace(21);             //发送空闲函数,发送21个38khz脉冲
                }
                dat >>= 1;                          //下一个位
        }
}

void ir_tx_data()                  //发射一帧数据
{
        if(user_data)                                                          //检测到键码
        {               
                //一帧数据最小长度 = 9 + 4.5+ 24 * 1.125 + 8 * 2.25 + 0.5625  = 59.0625 ms
                //一帧数据最大长度 = 9 + 4.5+ 8 * 1.125 + 24 * 2.25  + 0.5625 = 77.0625 ms
                IR_TxPulse(342);                                       //对应9ms,                同步头脉冲9ms
                IR_TxSpace(171);                                       //对应4.5ms,        同步头空闲4.5ms
   
                IR_TxByte(User_address % 256); //发用户地址码低字节
                IR_TxByte(User_address / 256); //发用户地址码高字节
                IR_TxByte(user_data);          //发用户数据码
                IR_TxByte(~user_data);         //发用户数据反码
   
    IR_TxPulse(21);                                        //结束码,0.5625ms
   
    user_data_uart1();             //uart1显示键功能
                user_data = 0;
                bat_uart();                    //发送电池电压
        }
}

Keil代码下载: Keil代码.7z (79.92 KB, 下载次数: 150)

评分

参与人数 1黑币 +15 收起 理由
lkc8210 + 15 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:161164 发表于 2022-7-11 10:32 | 显示全部楼层
感谢分享
最近也在弄红外遥控
本来用delay来控制发射管的开关
但一改变晶振频率就要修改delay函数
看到你的延时方法茅室顿开
收下了

另外,3V串100欧姆来驱动发射管
控制范围有多远?

另另外,为什么用1/3占空比?
回复

使用道具 举报

ID:82809 发表于 2022-7-11 13:33 | 显示全部楼层
lkc8210 发表于 2022-7-11 10:32
感谢分享
最近也在弄红外遥控
本来用delay来控制发射管的开关

串100欧姆发射约7,8米,1/3占空比是为了发射时省电.

评分

参与人数 1黑币 +15 收起 理由
lkc8210 + 15 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:161164 发表于 2022-7-12 15:01 | 显示全部楼层
pfdqwp 发表于 2022-7-11 13:33
串100欧姆发射约7,8米,1/3占空比是为了发射时省电.

明白~谢谢解答
回复

使用道具 举报

ID:89420 发表于 2022-12-4 17:53 | 显示全部楼层
感谢楼主的无私分享,刚好想帮RS Media做个遥控。编程底子不好,希望这个能用得上。
回复

使用道具 举报

ID:89420 发表于 2022-12-4 17:55 | 显示全部楼层
我有代码和相关资料,如果楼主可以帮忙做一个专用的遥控那就更棒了。当然,肯定要给辛苦费的。
回复

使用道具 举报

ID:82809 发表于 2023-3-11 02:09 | 显示全部楼层
menwawork 发表于 2022-12-4 17:55
我有代码和相关资料,如果楼主可以帮忙做一个专用的遥控那就更棒了。当然,肯定要给辛苦费的。

不知你现在还需要不?可以帮你弄下。
回复

使用道具 举报

ID:235359 发表于 2023-3-11 10:14 | 显示全部楼层
pfdqwp 发表于 2023-3-11 02:09
不知你现在还需要不?可以帮你弄下。

你这个怎么唤醒的 没有看明白
回复

使用道具 举报

ID:161164 发表于 2023-3-11 11:39 | 显示全部楼层
我比黑点子更黑 发表于 2023-3-11 10:14
你这个怎么唤醒的 没有看明白

2023-03-11_113843.png
回复

使用道具 举报

ID:82809 发表于 2023-3-11 19:42 | 显示全部楼层
回复

使用道具 举报

ID:82809 发表于 2023-3-11 19:43 | 显示全部楼层
我比黑点子更黑 发表于 2023-3-11 10:14
你这个怎么唤醒的 没有看明白

K_INT外部中断。
回复

使用道具 举报

ID:235359 发表于 2023-3-11 23:21 | 显示全部楼层
我唤醒有一个按键忘记放在中断了  放在普通IO口了  有没有其他办法可以唤醒 据说定时器中断唤醒 可以这样吗  有没有案列
回复

使用道具 举报

ID:82809 发表于 2023-3-12 18:58 | 显示全部楼层
我比黑点子更黑 发表于 2023-3-11 23:21
我唤醒有一个按键忘记放在中断了  放在普通IO口了  有没有其他办法可以唤醒 据说定时器中断唤醒 可以这样吗 ...

定时器中断不行,如果忘记,可以看下io口中断。stc8h支持的。
回复

使用道具 举报

ID:235359 发表于 2023-3-12 23:07 | 显示全部楼层
pfdqwp 发表于 2023-3-12 18:58
定时器中断不行,如果忘记,可以看下io口中断。stc8h支持的。

IO口中断相关寄存器 我 研究下 好像这个写的不明白
回复

使用道具 举报

ID:235359 发表于 2023-3-13 00:21 | 显示全部楼层

我给外部中断0 1唤醒好奇怪  我开机要按开关10几次 后面就能正常唤醒了  前面死活不行  不知道为什么 可以指导下吗  
回复

使用道具 举报

ID:433219 发表于 2023-3-13 08:20 | 显示全部楼层
  简单产品,做好接收器就好了(最多定做个PVC面板),买个现成的遥控器也才1¥
1.jpg
回复

使用道具 举报

ID:82809 发表于 2023-3-13 14:42 | 显示全部楼层
我比黑点子更黑 发表于 2023-3-13 00:21
我给外部中断0 1唤醒好奇怪  我开机要按开关10几次 后面就能正常唤醒了  前面死活不行  不知道为什么 可 ...

应该是下降沿唤醒的,你看参考stc8h规格书。
回复

使用道具 举报

ID:388929 发表于 2023-3-13 15:19 | 显示全部楼层
楼主,能卖我两块板试试吗
回复

使用道具 举报

ID:82809 发表于 2023-3-14 18:42 | 显示全部楼层
billaj 发表于 2023-3-13 15:19
楼主,能卖我两块板试试吗

之前公司做过的产品,我现在手里没有这个板子。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表