标题:
单片机红外解码程序能每条代码都解释下么?看不懂
[打印本页]
作者:
清御
时间:
2023-12-21 08:17
标题:
单片机红外解码程序能每条代码都解释下么?看不懂
谢谢大家
//包含头文件
#include "REG51.h"
#include "stdio.h"
//定义数据类型
#define uchar unsigned char
#define uint unsigned int
//控制变量
uchar Buffer[20];
uint Old_HW = 0xff;
extern void delayms(uint x);
extern void Init_1602(void);
extern void Xian_String(uchar x,uchar y,uchar *p);
//定义引脚
sbit IRED=P3^2;
//红外控制变量
uchar gired_data[4];//存储4个字节接收码(地址码+地址反码+控制码+控制反码
/*******************************************************************************
* 函 数 名 : delay_10us
* 函数功能 : 延时函数,ten_us=1时,大约延时10us
* 输 入 : ten_us
* 输 出 : 无
*******************************************************************************/
void delay_10us(unsigned int ten_us)
{
while(ten_us--);
}
/*******************************************************************************
* 函 数 名 : ired_init
* 函数功能 : 红外端口初始化函数,外部中断0配置
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void ired_init(void)
{
IT0=1; //下降沿触发
EX0=1; //打开中断0允许
EA=1; //打开总中断
IRED=1; //初始化端口
}
//红外函数
void Hongwai(void)
{
if(gired_data[2] != Old_HW)
{
Old_HW = gired_data[2];
}
}
//显示函数
void Display(void)
{
sprintf(Buffer,"Key:0X%02X ",Old_HW);
Xian_String(0,0,Buffer);
}
//主函数
int main(void)
{
//初始化
uchar Old_ZhuangTai = 0xff;
ired_init();
Init_1602();
while(1)
{
Hongwai(); //红外
Display(); //显示
delayms(100); //延时
}
}
void ired() interrupt 0 //外部中断0服务函数
{
uchar ired_high_time=0;
unsigned int time_cnt=0;
uchar i=0,j=0;
if(IRED==0)
{
time_cnt=1000;
while((!IRED)&&(time_cnt))//等待引导信号9ms低电平结束,若超过10ms强制退出
{
delay_10us(1);//延时约10us
time_cnt--;
if(time_cnt==0)return;
}
if(IRED)//引导信号9ms低电平已过,进入4.5ms高电平
{
time_cnt=500;
while(IRED&&time_cnt)//等待引导信号4.5ms高电平结束,若超过5ms强制退出
{
delay_10us(1);
time_cnt--;
if(time_cnt==0)return;
}
for(i=0;i<4;i++)//循环4次,读取4个字节数据
{
for(j=0;j<8;j++)//循环8次读取每位数据即一个字节
{
time_cnt=600;
while((IRED==0)&&time_cnt)//等待数据1或0前面的0.56ms结束,若超过6ms强制退出
{
delay_10us(1);
time_cnt--;
if(time_cnt==0)return;
}
time_cnt=20;
while(IRED)//等待数据1或0后面的高电平结束,若超过2ms强制退出
{
delay_10us(10);//约0.1ms
ired_high_time++;
if(ired_high_time>20)return;
}
gired_data[i]>>=1;//先读取的为低位,然后是高位
if(ired_high_time>=8)//如果高电平时间大于0.8ms,数据则为1,否则为0
gired_data[i]|=0x80;
ired_high_time=0;//重新清零,等待下一次计算时间
}
}
}
if(gired_data[2]!=~gired_data[3])//校验控制码与反码,错误则返回
{
for(i=0;i<4;i++)
gired_data[i]=0;
return;
}
复制代码
作者:
heicad
时间:
2023-12-21 15:25
这里有详细的注释,你看他的解码函数 和你这个一样的
http://www.51hei.com/bbs/dpj-108717-1.html
http://www.51hei.com/bbs/dpj-29835-1.html
作者:
man1234567
时间:
2023-12-22 09:39
感觉这个已经注释得很清楚了
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1