📄 ht1621.c
字号:
// STC 12T系列单片机红外接收NEC解码程序。适用于市场上用量最大的HT6121/6122及其兼容的IC编码。
// 使用外部中断0接收P3.2
//
#include <REGX52.H>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar code tab[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0X88,0X83,0XC6,0XA1,0X86,0X8E,0xFF};
sbit IR = P3^2;
uchar N[4]; //识别码,操作码存放
uchar X1,X2,X3,X4;
void XSQ(void);
void YS(uchar time);
/****************** 主函数 *******************/
void main(void)
{
X1=X2=X3=X4 = 0;
IT0 = 1;
EX0 = 1;
EA = 1;
while(1)
{
XSQ();
}
}
/**********************数码管显示函数************************/
void XSQ(void)
{
P2_7=1;P0=tab[X1];P2_0=0;YS(1); //识别码
P2_0=1;P0=tab[X2];P2_1=0;YS(1);
P2_1=1;P0=tab[16];P2_2=0;YS(1);
P2_2=1;P0=tab[16];P2_3=0;YS(1);
P2_3=1;P0=tab[16];P2_4=0;YS(1);
P2_4=1;P0=tab[16];P2_5=0;YS(1);
P2_5=1;P0=tab[X3];P2_6=0;YS(1); //操作码
P2_6=1;P0=tab[X4];P2_7=0;YS(1);
}
/********************** 外部中断函数************************/
void exint0() interrupt 0
{
uint cnt;
uchar i;
EX0 = 0;
cnt = 0;
while(!IR) cnt++; //记录引导码时间
if(cnt < 1000){EX0=1;return;} //9ms的计数值(12MHz:1000< cnt <1500)
cnt = 0;
while(IR) if(cnt++ > 400){EX0=1;return;} //防卡死,超时保护(12MHz: > 300)
if(cnt < 200){EX0=1;return;} //(12MHz不分频: <260)
for(i=0; i<32; i++) //读取32位位码
{
cnt = 0;
while(!IR);
while(IR) if(cnt++ > 200){EX0=1;return;} //超时保护(12MHz:>=200)
N[i/8] >>= 1;
if(cnt>60) N[i/8] |= 0x80; //0和1的计数界线(12MHz:< 109)
}
if(N[0] == ~N[1] && N[2] == ~N[3]) //校验识别码,操作码
{
X1 = N[0]/16;
X2 = N[0]%16;
X3 = N[2]/16;
X4 = N[2]%16;
}
EX0 = 1;
}
/***************************************************************
函数功能:按键消抖 延时程序
入口参数:1ms×time (晶振=12MHz)
***************************************************************/
void YS(uchar time)
{
uchar i,j;
for(i=0; i<time; i++)
for(j=0; j<247; j++)_nop_();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -