|
stc8h做的红外遥控器,休眠电流0.4ua,带电池电压检测,带串口调试,注释齐全,和大家探讨一下!
原理图和布线如下:
单片机源程序如下:
//---------------------注意!!!!!--------------------------
//下载时,下载界面"硬件选项"中下面的项要设置如下:
// 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)
|
评分
-
查看全部评分
|