标题:
STC8A8K64单片机+H1838红外解码程序
[打印本页]
作者:
heryyy
时间:
2022-1-19 15:22
标题:
STC8A8K64单片机+H1838红外解码程序
1.png
(27.38 KB, 下载次数: 30)
下载附件
2022-1-19 17:07 上传
/*
此次开发 利用STC8A平台全面方面 实现了51单片机 学习 实验 设计 等功能
下面是接口整体介绍
TFT驱动IC为 ILI9341
tft
控制线:RS-P3^5; WR-P3^6; RD-P3^7; CS-P4^4; RST-P4^3
数据线: P7口低八位数据端口 P0口高八位数据端口(两个数据口都以选用 不可做其他)
触摸xpt2046
SPI总线 MOSI-P2^3 MISO-P2^4 SCLK-P2^5
CS-P6^2 PENIRQ-P6^3
红外解码实验
红外采用P3.2中断0口 读取H1838传来的红外信息并将其进行解码
NEC 码的位定义:一个脉冲对应560us 的连续载波,
逻辑1 应该是560us 低+1680us 高,
逻辑0 应该是560us 低+560us 高。
NEC 遥控指令的数据格式为:同步码头、地址码、地址反码、控制码、控制反码。
同步码 由一个9ms 的低电平和一个4.5ms 的高电平组成,地址码、地址反码、控制码、
控制反码均是 8 位数据格式。
具体解码过程请参考资料
*/
#include "stc8.h" //STC头文件
#include "def.h" //宏定义 常用函数
#include "delay.h" //延时函数
#include "tft.h" //TFT IC底层驱动
#include "gui.h"
#include "xpt2046.h"
#include "spi.h"
#include "h1838.h"
//真对 STC8A系列 IO口初始化
//除P3 P5口外 其他IO默认准双向IO口 所以当用的P3 P5口是要进行初始化一下
void IO_init(void)
{
P3M0 = 0X00;
P3M1 = 0X00;
P5M0 = 0X00;
P5M1 = 0X00;
}
void main()
{
IO_init(); //IO口初始化
Lcd_Init(); //tft初始化
Init_SPI(); //SPI初始化
GUI_Clear(White); //白色清屏
GUI_sprintf_hzstr16x(0,0,"infrared decoding test",White,1);
GUI_sprintf_hzstr16x(0,18,"IR-CODE: --H",Red,White);
hongw(); //红外解码测试函数
}
复制代码
#include "stc15f2k60s2.h"
#include "delay.h"
#include "tft.h"
#include "gui.h"
#include "xpt2046.h"
#include "h1838.h"
#include "gui.h"
u8 ma[2]; //红外解码数据
u8 hong=0; //红外 标志位
void hongw(void)
{
IT0=1; //边沿触发
EX0=1; //外部中断0 P3.2口
EA = 1; // 开总中断
while(1)
{
if(hong==1) //判断标志位 是否数据更新
{
GUI_sprintf_char(73,16,ma[0],White,Blue,0); //显示解码值
GUI_sprintf_char(81,16,ma[1],White,Blue,0);
hong=0; //清标志位等待下一次接收
}
}
}
/////////////////////////////////
//////////////////////////////////
//红外解码 外部P32口边沿触发中断
//同步码 由一个9ms 的低电平和一个4.5ms 的高电平组成
//逻辑1 是560us 低+1680us 高,逻辑0 是560us 低+560us 高
void IR_IN() interrupt 0
{
u8 j,k,N=0;
u8 IRCOM[4];
EX0 = 0; //进入中断后关闭中断 进行解码
delay_us(7700); //24M下大约7ms延时 9ms低电平前 检测P32状态
if (IRIN==1) //如果非0 说明红外错误 返回
{ EX0 =1;
return;
}
//确认IR信号出现
while(!IRIN); //等IR变为高电平,跳过9ms的前导低电平信号。
for (j=0;j<4;j++) //收集四组数据
{
for (k=0;k<8;k++) //每组数据有8位
{
while (IRIN); //等 IR 变为低电平,如果是第一次采集跳过4.5ms高电平信号。
while (!IRIN); //等 IR 变为高电平
while (IRIN) //计算IR高电平时长 犹豫单片机的运行 存在着计算时间
{
delay_us(280); //27M下大约300+us
N++;
if(N>=30)
{ EX0=1; //开中断
return;} //0.14ms计数过长自动离开。
} //高电平计数完毕
IRCOM[j]=IRCOM[j] >> 1; //数据最高位补“0”
if (N>=6)
{IRCOM[j]=IRCOM[j] | 0x80;} //数据最高位补“1”
N=0;
}
}
if (IRCOM[2]!=~IRCOM[3]) //控制码 控制反码进行比对 如果错误跳出
{ EX0=1;return; }
ma[1]=IRCOM[2] & 0x0F; //取键码的低四位
ma[0]=IRCOM[2] >> 4; //右移4位 取高四位值
if(ma[1]>9)
ma[1]=ma[1]+0x37; //A 从65开始 十六进制为0x41
else
ma[1]=ma[1]+0x30;
if(ma[0]>9)
ma[0]=ma[0]+0x37;
else
ma[0]=ma[0]+0x30;
hong=1; //打开标志位
EX0 = 1; //开中断
}
Keil代码下载:
红外解码.zip
(214.92 KB, 下载次数: 35)
2022-1-19 15:21 上传
点击文件名下载附件
下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1