串口通信发送红外遥控器解码值_第1页
串口通信发送红外遥控器解码值_第2页
串口通信发送红外遥控器解码值_第3页
串口通信发送红外遥控器解码值_第4页
串口通信发送红外遥控器解码值_第5页
免费预览已结束,剩余8页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、串口通信发送红外遥控器解码值,单片机芯片使. 这是一整个本程序所用的原理图下载 : 点这里 用的 stc89c52 ;找到数码管的原理图即可 单片机开发板的电路图其他的忽略 .* file main.c* authorxr * date2014 年 3 月 31 日 10:26:47 * versionV1.2.3 * brief红外通信 NEC 协议进行红外遥控器解码 显示用户码和键码到数码管上* note单片机 STC89C52RC MC晶振 11.0592MHZ* */#include ;/ 红外输出数据口sbit IRD = P3A3;/外部中断引脚bit irflag = 0;uns

2、igned char ircode4;/ 接收解码得到的数据 unsigned char code LedTable = 0xC0, /"0"0xF9, /"1"0xA4, /"2"0xB0, /"3"0x99, /"4"0x92, /"5"0x82, /"6"0xF8, /"7"0x80, /&quo

3、t;8"0x90, /"9"0x88, /"A"0x83, /"B"0xC6, /"C"0xA1, /"D"0x86, /"E"0x8E/"F"unsigned char LedBuff6 = 0xFF, 0xFF, 0xFF,0xFF, 0xFF, 0xFF;/ 数码管显示缓冲区unsigned char thr0, tlr0

4、;void ConfigTimer0(unsigned int xms);void ConfigTimer1();void main()ConfigTimer0(1); /定时 1msConfigTimer1();while (1)if (irflag)/ 接收到红外数据,则刷新显示取用户码取用户码取键码的LedBuff5 = LedTableircode0 >> 4;/的高 4 位字节LedBuff4 = LedTableircode0 & 0x0F;/ 的低四位字节LedBuff1 = LedTableircode2 >> 4;/高四位取键码的LedBuff

5、0 = LedTableircode2 & 0x0F;/ 低四位/* brief定时器 T0 配置* param定时时间 xms* retval无*/void ConfigTimer0(unsigned int xms)unsigned int tmp;tmp = 65536-xms*11059200/12/1000; thr0 = (unsigned char)(tmp >> 8);tlr0 = (unsigned char)(tmp & 0x00FF);TMOD &= 0xF0;TMOD |= 0x01;/T0 方式 1TH0 = thr0;TL0 =

6、tlr0;TR0 = 1;EA = 1;ET0 = 1;/ 设置定时器 T0 的中断优先级高于外部中断的优先级/IP 中断优先级寄存器 PT2 PS PT1 PX1 PT0 PX0PTO = 1;/提高TO的优先级,优先进行数码管刷新,消除数码管显示抖动/* brief数码管刷新* param无* retval无*/void refresh()static unsigned char j = O;PO = OxFF;/ 消隐P1 = (OxO8 | j);/OOO O 1 ADDR2 ADDR1 ADDROP0 = LedBuffj+; if (j >= 6) j = 0;briefT0

7、 中断服务 param无retval 无*/void Timer0_ISP() interrupt 1TH0 = thr0;TL0 = tlr0;refresh();/ 数码管刷新/*/*brief配置定时器T1,开启外部中断,T1用来计数* param无* retval无*/void ConfigTimer1()TMOD &= 0x0F;/ 清零 T1 控制位TMOD |= 0x10;/T1 方式 1TH1 = 0;TL1= 0;/初始化计数值为 0TR1= 0;/在没有进入外部中断前,先关闭定时器ET1= 0;/关闭 T1 中断,只用来计数IT1 =1;/设置外部中断为下降沿触发中

8、断EX1= 1;/开启外部中断T1/* brief获得高电平时间 ( 空闲时间 )* param无retval无*/unsigned int getHeighTime()/ 在检测外部电平之前,先将红外检测引脚拉高释放IRD = 1;TH1 = 0;TL1 = 0;/ 重新清零TR1 = 1;/ 打开定时器 T1 开始计数while (IRD)/进行超时判断,若高电平时间大于9ms,即引导码时间,则直接退出if (TH1 > 0x40) /(0x40*256) * (12/11059200) s =17.7msbreak;/ 退出TR1 = 0;/ 关闭计数return (TH1*256

9、 + TL1);/ 返回 IRD 引脚持续的高电 平时 T1 计数值 * brief 获取低电平时间 ( 载波 )* param 无* retval 无*/unsigned int getLowTime()/ 释放 IRD 检测引脚IRD = 1;TH1 = 0;TL1 = 0;/ 清零 T1 计数值TR1 = 1;/ 启动 T1 计数while (!IRD)if (TH1 > 0x40) TL1计数满则进位 TH1,时间:TH1*256*12/11059200 s = 17.7ms /时间大于了 NEC协议的引导码载波时间 9ms?进行强制退出,避免假等待break;TR1 = 0;/

10、 关闭计数return (TH1*256 + TL1);/ 返回低电平持续的计数值 每计数一次是一个机器周期的时间即 1.08us /* brief外部中断服务,检测红外信号* param无* retval无*/void ExINT_ISP() interrupt 2 /外部中断 1 中断标号为2unsigned int time;/ 时间 unsigned char i, j;unsigned char byte = 0;time = getLowTime();/ 获取低电平 T1 计数值,即引 导码的9ms载波if (time ; 8755) / 范围 8.5-9.5msX=0.0085/

11、(12/11059200)/ 错误引导码IE1 = 0;/ 清零外部中断标志return;/ 退出中断/ 符合引导码的 9mstime = getHeighTime();/ 获取高电平时间if (time ; 4608) /范围 4ms-5ms/ 不是 4.5ms 的空闲IE1 = 0;/ 清零外部中断return;/ 退出中断/ 是正确的引导码for (i = 0; i ; 645) /范围 350us-700usIE1 = 0;/ 清零外部中断标志 return;/ 退出中断time = getHeighTime();/ 空闲时间if (time > 322) && (time

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论