红外摇控HS5104解码程序.doc_第1页
红外摇控HS5104解码程序.doc_第2页
红外摇控HS5104解码程序.doc_第3页
红外摇控HS5104解码程序.doc_第4页
免费预览已结束,剩余1页可下载查看

下载本文档

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

文档简介

红外摇控HS5104解码程序现在市面上,风扇摇控器都用HS5104作编码芯片,关键是以低格占据市场。用过HS5104的朋友都知道,它的工作电压比较高,在低电压3V以下工作时,经常会出错,很多朋友都说HS5104的接收程序不稳定。其实,大多数是HS5104工作不稳定引起的,只要你接收程序合理,多接收几次作比较,码宽的变动变化率允许大一点(我的程序允许码宽变动在百分之三十),然后再保证HS5104的工作电压在3V以上,那肯定是没问题的。下面一段程序,之所以接收程序会那么复杂,是针对HS5104不稳定而设计的。它放在中断里进行,希望能给使用合泰C开发的朋友提供参考,或者下载后稍作修改便可实现功能调试。/*红外摇控 ht48r05A-1 & HS5104/*Make in QUSUN at 2008-01-18/*LCSOME*#include #pragma vector isr_4 0x4#pragma vector isr_8 0x8#define uchar unsigned char#define ulint unsigned long int#pragma rambank0unsigned char rf_addr1;unsigned char rf_addr2;/12位地址码unsigned char rf_addr1_old;/unsigned char rf_addr2_old;unsigned char rf_cont;/接收次数,判断长按unsigned char rf_bitsum;/接收到的数据位的计数器unsigned char rf_0_sum;/接收到0的个数计数器unsigned char rf_mksum;/码宽计数器uchar time_s;/秒计数器uchar time_ms;/毫秒计数器uchar time_us;/微秒计数器/*bit rf_sta;/起始位有效标志有效bit rf_bdata;/前一个接收检测电平bit rf_ture;/接收成功标志有效bit rf_6ms ;/6毫秒低电平指示,1有效#define rf_in _pc1 /接收数据输入端#define rf_1_sum rf_0_sum#define SPEAKER _pb2/*void isr_4() /外部中断子程序 . /外部中断子程序 /*void isr_8()/计数器0中断子程序 if(!rf_sta)/如果起始位无效 /00 rf_1_sum+; if(rf_1_sum100)rf_cont=0;/如果释放按键则清计数器 if(!rf_6ms)/1 如果未满足6毫秒电平 if(!rf_in)rf_1_sum=0;/如果接收到的是低电平,则清计数 if(rf_1_sum40)/2 rf_6ms=1;/置6毫秒高电平有效 /2 /1 else /如果已满足6毫秒电平,则等待起始位 /003 if(!rf_in)/一收到有低电平,则判为有开始 rf_addr1=0; rf_6ms=0; rf_bdata=0; rf_bitsum=11;/初始化接收到的数据位,先接收11位,第12位独立接收 rf_0_sum=0;/ rf_mksum=0;/码宽计数器 rf_sta=1 ;/置起始位有效 /003 /00 else/起始位有效 /200 rf_mksum+;/码长计数器加 if(rf_bitsum=0) /如果已经接收完11位,则处理接收第12位数据 if(rf_in)/等待高电平 if(rf_mksum=5)_c=0;else _c=1;/判断最后一位数据 _rlc(&rf_addr1);_rlc(&rf_addr2);/移位存入数据,已经接收完12位数据 _rlc(&rf_addr1);_rlc(&rf_addr2);/修正ADDR2存5位数据 addr1存7位按键码 /addr1按键码存在高7位,第0位无意义 rf_sta=0;/ 置起始位无效,重新接收下一贞 if(rf_addr2=0x1b)&(rf_addr1_old=rf_addr1) rf_cont+; if(rf_cont=3)rf_ture=1; /如果与上一次接收相同 else rf_addr1_old=rf_addr1; rf_cont=0; /与上一次接收不相同,重新接收 rf_addr1=0;/清洗 goto timeret;/第12位数据,不处理低电平计数 /如果已经接收完11位,则处理接收第12位数据 if(!rf_in) /3 如果接收的是低电平则处理如下 if(!rf_bdata)goto timeret;/如果上次接收的是低电平,则退出 rf_bdata=0; if(rf_mksum13) rf_sta=0;goto timeret; /如果码太长,说明协议不同,放弃处理 rf_mksum=0;/码宽计数器重新开始计数 if(rf_1_sum=5)_c=1;else _c=0; _rlc(&rf_addr1);_rlc(&rf_addr2); rf_1_sum=0 ; rf_bitsum-; /3处理接收 else /如果接收的是高电平则如此处理 rf_bdata=1; rf_1_sum+;/计算高电平的宽度 /200 timeret: time_us+; /中断子程序/*void safeguard_init() /初始化 _tmr = 0x64;/150毫秒中断一次 _tmrc = 0x91;/内部定时,打开计数 分频比为1:4 . . . _intc=0x7;/允许定时0中断,允许外部中断,允许总中断 _wdts=0x0f;/WDT预分频1:128 /初始化/*void spbb(void)/蜂鸣器叫一声 . . . /*/*void main() uchar i,y; safeguard_init();/初始化 spbb();/上电时,蜂鸣器叫一声 /*while(1) /01主体 _clrwdt(); if(rf_ture)/接收有效 /123 switc

温馨提示

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

评论

0/150

提交评论