|
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, 下載次數: 190)
2022-7-10 14:44 上傳
點擊文件名下載附件
|
評分
-
查看全部評分
|