//-----------------------------------------------------------------
// 程序描述:
// 红外接收子程序
// 作者:薛小铃
// 开始日期:2008-10-30
// 完成日期:2008-10-30
// 修改日期:
// 版本:V1.0
// 调试工具:新作的最小板
// 说 明:
// (1)调试使用的工作晶振Fosc=12MHz;
// (2)LC7461使用PWM编码格式,以脉宽0.56ms、间隔0.565ms、周期1.125ms
// 的组合表示二进制的"0";以脉宽0.56ms、间隔1.685ms、周期2.25ms
// 的组合表示二进制的"1";
// (3)LC7461遥控器发射的红外线信号由42位数据构成:引导码由9ms的低电平和
// 4.5ms的高电平构成,系统识别码由13位原码和13位反码构成,数据码由8位
// 原码和8位反码构成
//-----------------------------------------------------------------
//-----------------------------------------------------------------
// 头文件包含
//-----------------------------------------------------------------
#include <reg52.h>
#include <intrins.h>
// 数据类型宏定义
//-----------------------------------------------------------------
#define uchar unsigned char
#define uint unsigned int
//-----------------------------------------------------------------
// I/O口定义
//-----------------------------------------------------------------
sbit HONGWAI = P3^2; // 红外接收数据线
//-----------------------------------------------------------------
// 全局变量:内RAM存储单元定义
//-----------------------------------------------------------------
int ch; // 红外原码数据存放单元
//-----------------------------------------------------------------
// 全局变量:内RAM位定义
//-----------------------------------------------------------------
bit intx0f; // 初始为0;为1表示响应外0中断
bit irvalidf; // 红外解码解码有效标志位,为1表示有效
//bit flag;
//void write_remote(uchar add,uchar date);
void WriteCommand(unsigned char c);
//void ds1302_write_time(void) ;
void ds1302_write_byte(unsigned char addr, unsigned char d) ;
//-----------------------------------------------------------------
// 功能程序区
//-----------------------------------------------------------------
//-----------------------------------------------------------------
// void Delay_1ms (unsigned char t)
//-----------------------------------------------------------------
//
// 函数功能: 时基为1ms的延时
// 例子提示: 调用Delay_1ms(20),得到20ms延时
// 入口参数: 无符号8bit整数
// 返回参数: 无
// 全局变量: 无
// 调用模块: 无
// 注意事项: 基于使用外12MHz晶振的标准8051(如AT89S51)单片机
/*
令x=165,y=2,n=1,则延时时间
={[3y+(n+2)xy+3]*t+5}T=(999t+5)T
单位: 1SYSCLK SYSCLK=12MHz 误差
Delay_1ms(1): 延时 1 004 1.004ms 4us
Delay_1ms(2): 延时 2 003 2.003ms 3us
Delay_1ms(3): 延时 3 002 3.002ms 2us
Delay_1ms(5): 延时 5 000 5.000ms 0us
Delay_1ms(10): 延时 9 995 9.995ms 5us
Delay_1ms(20): 延时 19 985 19.985ms 15us
Delay_1ms(40): 延时 39 965 39.965ms 35us
Delay_1ms(60): 延时 59 945 59.945ms 55us
Delay_1ms(100):延时 99 905 99.905ms 95us
Delay_1ms(200):延时 199 805 199.805ms 195us
Delay_1ms(255):延时 254 750 254.750ms 250us
*/
//-----------------------------------------------------------------
void Delay_1ms (unsigned char t)
{
unsigned char i,j;
do {
j = 2;
do {
i = 165;
do {
_nop_();
} while (--i);
} while (--j);
} while (--t);
}
//-----------------------------------------------------------------
// void Delay_882us (void)
//-----------------------------------------------------------------
//
// 函数功能: 时基为882us的延时
// 入口参数: 无
// 返回参数: 无
// 全局变量: 无
// 调用模块: 无
// 注意事项: 延时时间为881us,误差为1us
//-----------------------------------------------------------------
void Delay_882us (void)
{
uchar i,j;
for (i=20; i>0; i--)
{
for(j=20; j>0; j--)
{
;
}
}
for (i=5; i>0; i--)
{
_nop_();
}
}
//-----------------------------------------------------------------
// void Decoder (void)
//-----------------------------------------------------------------
//
// 函数功能: 遥控解码
// 入口参数: 无
// 返回参数: 无
// 全局变量: irvalidf:红外解码有效标志位,为1表示有效
// ch:红外原码数据存放单元
// 调用模块: Delay_882us();Delay_1ms(unsigned char)
// 注意事项:
//-----------------------------------------------------------------
void Decoder (void)
{
uchar i,j;
uchar tmp[2]; // tmp[0]:暂存原码数据;tmp[1]:暂存反码数据
irvalidf = 1; // 先设红外解码有效
for (i=0; i<10; i++) // 循环10次,检测在8.820ms内信号的电平状态
{
Delay_882us(); // 延时882us
if (HONGWAI) // 若信号为高电平,则为干扰信号
{
irvalidf = 0; // 红外解码解码无效
break;
}
}
if (irvalidf)
{
while (!HONGWAI); // 等待引导码中的9ms低电平结束
Delay_1ms(5); // 延时5ms,屏蔽引导码中的4.5ms高电平
for (j=0; j<26; j++) // 检测26位系统识别码
{
while (!HONGWAI); // 等待系统识别码第一位数据的上升沿
Delay_882us(); // 高电平开始后,用882us的时间尺检测信号的电平状态
if (HONGWAI) // 若该信号为高电平,则延时1ms等待高电平结束
{
Delay_1ms(1); // 延时1ms
}
}
for (i=0; i<2; i++) // 接收原码和反码数据并暂存
{
for (j=0; j<8; j++) // 循环8次,接收8位数据(原码或反码)
{
while (!HONGWAI); // 等待系统识别码第一位数据的上升沿
Delay_882us(); // 高电平开始后,用882us的时间尺读取信号的电平状态
tmp[i] >>= 1; // 先接收低位数据
if (HONGWAI) // 若该信号为高电平,则延时1ms等待高电平结束
{
Delay_1ms(1); // 延时1ms
tmp[i] = tmp[i] | 0x80; // 暂存信号此时的电平状态
}
}
}
if (~tmp[0] == tmp[1]) // 将原码取反后与反码进行比较,若两者的值相同则完成解码
{
ch = tmp[0]; // 保存原码数据
}
else
{
irvalidf = 0; // 若原码和反码不等,则本次接收的数据无效
}
}
}
/*void Display(void)
{
// 设置LCM显示DDRAM的起始地址
// 对高四位进行处理
if ((ch&0xF0)==0x00) // 屏蔽低四位后判断其值
{
write_remote(0x0a,0x00+'0'); // 若为0,则显示字符0
}
else
{
write_remote(0x0a,0x01+'0'); // 若为1,则显示字符1
}
// 对低四位进行处理
if ((ch&0x0F)<0x0a) // 屏蔽中间四位后判断其值
{
write_remote(0x0b,(ch&0x0F)+'0'); // 若小于10,则加上'0'后显示该值
}
else
{
write_remote(0x0b,((ch&0x0F)-0x09)+0x40); // 若大于或等于10,则加上'a'后显示该值
}
}*/
//-----------------------------------------------------------------
// 中断服务子程序
//-----------------------------------------------------------------
//-----------------------------------------------------------------
// void INTX0_ISR (void)
//-----------------------------------------------------------------
//
// 函数功能: 外0中断服务程序,接收到红外信号(下降沿)响应中断
// 入口参数: 无
// 出口参数: 无
// 全局变量: intx0f:初始为0;为1表示响应了外0中断
// 调用模块: 无
// 注意事项:
//-----------------------------------------------------------------
void INTX0_ISR (void) interrupt 0
{ unsigned char tmp;
_nop_(); // 目的:跳过尖峰干扰脉冲 // 为下一次外0中断作准备
EX0 = 0; // 接收外0中断信号后关外中断0
Decoder(); // 遥控解码
if (irvalidf) // irvalidf=1表示红外解码有效
{
irvalidf = 0; // 清除红外解码有效标志位
//Display();
红外遥控器遥控单片机程序
5星 · 超过95%的资源 需积分: 12 197 浏览量
2011-05-28
12:51:29
上传
评论 1
收藏 39KB RAR 举报
Ronquan
- 粉丝: 0
- 资源: 7
最新资源
- 筷手引流工具.apk
- 论文(最终)_20240430235101.pdf
- 基于python编写的Keras深度学习框架开发,利用卷积神经网络CNN,快速识别图片并进行分类
- 最全空间计量实证方法(空间杜宾模型和检验以及结果解释文档).txt
- 5uonly.apk
- 蓝桥杯Python组的历年真题
- 2023-04-06-项目笔记 - 第一百十九阶段 - 4.4.2.117全局变量的作用域-117 -2024.04.30
- 2023-04-06-项目笔记 - 第一百十九阶段 - 4.4.2.117全局变量的作用域-117 -2024.04.30
- 前端开发技术实验报告:内含4四实验&实验报告
- Highlight Plus v20.0.1
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈