哪位大神有STC8G1K08A 解码 VS1838 红外遥控信号并打印到串口的源代码?
网上找了很久,也问DS了,拿到的源代码,编译通过,但串口没有打印红外遥控的数据
STC8G1K08A引脚连接说明:
5,P3.0,RxD
6,P3.1,Txd
7,P3.2,IR红外接收管VS1838B 信号输入
8,P3.3,连接LED+,作为状态指示,上电常亮,接收并解码到遥控器(例如电视)数据后闪烁。
研究过程:
使用 STC8G-STC8H-LIB-DEMO-CODE\独立程序\05-串口1中断模式与电脑收发测试\ 的工程文件,编译下载,串口工具能发送和接收。
DS 提供的代码,并补全端口初始化代码,编译成功,商店指示灯常亮,但按电视遥控器按键时,串口没有打印数据。
- //#include <STC8G.H>
- //#include <intrins.h>
- #include "config.h"
-
- #define FOSC 11059200UL // 系统频率
- #define BAUDRATE 9600UL // 串口波特率
-
- // 红外接收引脚定义
- sbit IR_IN = P3^2; // 使用INT0引脚(P3.2)接收红外信号
- sbit LED = P3^3; // 使用INT0引脚(P3.3)连接指示灯
-
- // 全局变量
- unsigned char irCode[4]; // 存储解码后的4字节数据
- bit irFlag = 0; // 红外解码完成标志
-
- // 函数声明
- void PORT_Init(void);
- void UART_Init(void);
- void UART_SendByte(unsigned char dat);
- void UART_SendString(char *s);
- void IR_Init(void);
- void IR_Decode(void);
- void Delay10us(unsigned int n);
- void Delay100ms(unsigned int n)
-
-
- // 端口初始化
- void PORT_Init(void)
- {
- P3M0 = (P3M0 & ~0x04) | 0x08; P3M1 = (P3M1 & ~0x08) | 0x04;
- P3INTE = 0x04; //使能P3口中断
- P3IM0 = 0x00; //设置P3口中断模式 (00:下降沿, 01:上升沿)
- P3IM1 = 0x00; //设置P3口中断模式 (10:低电平, 11:高电平)
- P3WKUE = 0x00; //设置P3口中断唤醒省电模式
-
- }
- // 串口初始化
- void UART_Init(void)
- {
- SCON = 0x50; // 8位数据,可变波特率
- AUXR |= 0x40; // 定时器1时钟为Fosc,即1T
- AUXR &= 0xFE; // 串口1选择定时器1为波特率发生器
- TMOD &= 0x0F; // 清除定时器1模式位
- TMOD |= 0x20; // 设定定时器1为8位自动重装方式
- TL1 = 0xFC; // 设定定时初值
- TH1 = 0xFC; // 设定定时器重装值
- ET1 = 0; // 禁止定时器1中断
- TR1 = 1; // 启动定时器1
- }
-
-
- // 发送一个字节
- void UART_SendByte(unsigned char dat)
- {
- SBUF = dat;
- while(TI == 0);
- TI = 0;
- }
-
- // 发送字符串
- void UART_SendString(char *s)
- {
- while(*s != '\0')
- {
- UART_SendByte(*s++);
- }
- }
-
- // 红外初始化
- void IR_Init(void)
- {
- IT0 = 1; // 设置INT0下降沿触发
- EX0 = 1; // 使能INT0中断
- EA = 1; // 开启总中断
- IR_IN = 1; // 设置红外接收引脚为输入模式
- }
-
- // 10us延时函数
- void Delay10us(unsigned int n)
- {
- while(n--)
- {
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- }
- }
-
- void Delay100ms(unsigned int n) //@11.0592MHz
- {
- unsigned char data i, j, k;
- while(n--)
- {
- i = 5;
- j = 52;
- k = 195;
- do
- {
- do
- {
- while (--k);
- } while (--j);
- } while (--i);
- }
- }
-
-
- // INT0中断服务函数 - 红外解码
- void INT0_ISR() interrupt 0
- {
- unsigned char i, j;
- unsigned char byte;
- unsigned int time;
-
- // 等待起始信号9ms低电平
- while(IR_IN == 0);
-
- // 检测4.5ms高电平
- time = 0;
- while(IR_IN == 1)
- {
- Delay10us(1);
- time++;
- if(time > 500) // 超过5ms退出,防止死循环
- return;
- }
-
- // 开始解码4字节数据
- for(i = 0; i < 4; i++)
- {
- byte = 0;
- for(j = 0; j < 8; j++)
- {
- // 等待低电平结束
- while(IR_IN == 0);
-
- // 计算高电平持续时间
- time = 0;
- while(IR_IN == 1)
- {
- Delay10us(1);
- time++;
- if(time > 100) // 超过1ms退出
- break;
- }
-
- // 判断数据位是0还是1
- if(time > 8) // 高电平时间大于560us为1
- byte |= 0x80 >> j;
- }
- irCode[i] = byte;
- }
-
- irFlag = 1; // 设置解码完成标志
- }
-
- // 主函数
- void main(void)
- {
- unsigned char i;
- char buffer[10];
-
- // 初始化
- PORT_Init();
- UART_Init();
- IR_Init();
- LED = 1;
-
- UART_SendString("STC8G1K08A IR Decoder Ready!\r\n");
- while(1)
- {
- if(irFlag) // 如果红外解码完成
- {
- irFlag = 0; // 清除标志
-
- // 通过串口发送解码结果
- UART_SendString("IR Code: ");
-
- for(i = 0; i < 4; i++)
- {
- // 将字节转换为十六进制字符串
- sprintf(buffer, "%02X ", irCode[i]);
- UART_SendString(buffer);
- }
- UART_SendString("\r\n");
-
- // 显示用户码和键值码
- sprintf(buffer, "User: %02X%02X ", irCode[0], irCode[1]);
- UART_SendString(buffer);
-
- sprintf(buffer, "Key: %02X\r\n", irCode[2]);
- UART_SendString(buffer);
- LED = !LED;
- Delay100ms(5);
- LED = !LED;
-
- }
- }
- }
复制代码
|