利用PCA捕获捕获红外发射脉冲高、低电平时间,送串口显示( 含NEC、RC5解码 )

上传人:沈*** 文档编号:68230189 上传时间:2022-04-02 格式:DOC 页数:43 大小:728.50KB
收藏 版权申诉 举报 下载
利用PCA捕获捕获红外发射脉冲高、低电平时间,送串口显示( 含NEC、RC5解码 )_第1页
第1页 / 共43页
利用PCA捕获捕获红外发射脉冲高、低电平时间,送串口显示( 含NEC、RC5解码 )_第2页
第2页 / 共43页
利用PCA捕获捕获红外发射脉冲高、低电平时间,送串口显示( 含NEC、RC5解码 )_第3页
第3页 / 共43页
资源描述:

《利用PCA捕获捕获红外发射脉冲高、低电平时间,送串口显示( 含NEC、RC5解码 )》由会员分享,可在线阅读,更多相关《利用PCA捕获捕获红外发射脉冲高、低电平时间,送串口显示( 含NEC、RC5解码 )(43页珍藏版)》请在装配图网上搜索。

1、程序如下:/* 作品:捕获红外发射脉冲高、低电平时间,送串口显示 单片机:STC12C5410 晶振:12M编译环境:Keil uVision4 V9.00 */ / 说明:1、适用于:1T系列含有PCA捕获的STC单片机/ 2、捕获引脚PCA2(也就是P2.0),3字节存放一个电平时间数据。/ 3、串口显示脉冲高低电平时间数据(串口:字符 57600bps 校验位N 数据位8 停止位1), / 4、含NEC、RC5解码,如需其它解码请自己加入。/ / NEC码:(芯片有 市场上用量最大的HT6121/6122及其兼容的IC芯片等)/ RC5码:(芯片有 SAA3006、SAA3010、SAA

2、3027、PCA8521、PT2210 等)#define uchar unsigned char #define uint unsigned int #define ulong unsigned long #include #include sbit IR = P20; /捕获引脚PCA2 uchar xdata v486; uchar N4; uint t; ulong nn; bit VT; /捕获完成标志bit B_Z; /丢弃第一次捕获标志void ChuanKou(); /串口发送主程序void IR_RC5(); /RC5解码/*函数:10ms n 延时程序 STC 1T12MH

3、z */ void YS10ms(uchar n) uchar i,j,k; for(i=n;i!=0;i-) for(j=198;j!=0;j-) for(k=150;k!=0;k-); /*函数:接收初始化*/void JS_Init(void) uint i; B_Z = 1; t = 0; for(i=0;i1) /设置允许溢出次数,131ms 终止捕获 CR = 0; CF = 0; CCAPM2 = 0; CCF2=0; VT=1; /捕获完成标志 vt=0; return; if(CCF2) /是否是电位跳变 CCF2 = 0; /必须软件清0 (PCA 模块2标志) CL =

4、0; /先赋值低位 CH = 0; if(B_Z) CR =1; /启动PCA定时器 B_Z=0; return; /丢弃第一次捕获数据 t+; vt=CCAP2H; /保存数据高字节 t+; vt=CCAP2L; /保存数据低字节 t+; if(t = 486) /捕获162个数据(1个电平时间3字节存放) CCAPM2 = 0; CCF2=0; CR = 0; CF = 0; VT = 1; /捕获完成标志 /*函数:串口发送主程序*/ void ChuanKou() uchar i; uint j,T; ZIFUC(rnrn * 接收完成 *); ZIFUC(rnrn ( 以下是遥控器发

5、射脉冲的波形数据 )); ZIFUC(rnrn 序号 高电平时间(us) 低电平时间(us)rnrn); i=0; for(j=0;j486;) (uchar *)&nn)0 = 0; (uchar *)&nn)1 = vj+; (uchar *)&nn)2 = vj+; (uchar *)&nn)3 = vj+; ZIFUC( ); JZ(i,10,2); /序号 ZIFUC( ); JZ(nn,10,8); /高电平时间 (uchar *)&nn)0 = 0; (uchar *)&nn)1 = vj+; (uchar *)&nn)2 = vj+; (uchar *)&nn)3 = vj+;

6、 ZIFUC( ); JZ(nn,10,8); /低电平时间 if( (i%8)=0 )ZIFUC(rnrn); else ZIFUC(rn); i+; / NEC解码 / j=9; /引导码丢弃 for(i=0;i= 1; if(T1000)Ni/8 |= 0x80; if(N2 = N3) /校验NEC操作码。错误则尝试RC5解码 ZIFUC(rn 【 NEC通用编码格式:引导码 + 32位编码(16位用户码+操作码正反码) 】rn); ZIFUC(rn 用户码(高8位):0x); JZ(N0,16,1); ZIFUC(rn 用户码(低8位):0x); JZ(N1,16,1); ZIFUC

7、(rnrn 操作码正码 :0x); JZ(N2,16,1); ZIFUC(rn); if(N0 = N1) ZIFUC(rnrn 经对比,16位用户码是正反码,用户码正码:0x); JZ(N0,16,1); return; / 初略分析是否是RC5编码 / j=0; for(i=0;i20;i+) j+; /最高位丢弃(1个数据3字节); (uchar *)&T)0 = vj+; (uchar *)&T)1 = vj+; if(T1800) /RC5码前20个脉冲数据600nn1800 ZIFUC(rn 【 解码失败,再试一试或者分析波形数据 】); return; / 将波形数据绘成图像 /

8、 ZIFUC(rn 【 RC5编码发射波形 】 发射顺序:(低位)-(高位)rn); ZIFUC(rn_); j=0; for(i=0;i2000)break; if(i%2 != 1) /如果i是偶数 if(T1000)ZIFUC(); else ZIFUC(); else if(T950)ZIFUC(_); else ZIFUC(_); ZIFUC(_); ZIFUC(rn rn); IR_RC5(); /RC5解码 ZIFUC(rn起始位空 系统位 数据位 rn); ZIFUC(rnrn 【 RC5通用编码格式:14位编码 】rn); ZIFUC(rn 起始位(2位):0x); JZ(N

9、0,16,1); ZIFUC( 二进制: ); JZ(N0,2,2); ZIFUC(rn 控制位(1位):); if(N1)ZIFUC( 1); else ZIFUC( 0); ZIFUC(rn 系统位(5位):0x); JZ(N2,16,1); ZIFUC( 二进制: ); JZ(N2,2,5); ZIFUC(rn 数据位(6位):0x); JZ(N3,16,1); ZIFUC( 二进制:); JZ(N3,2,6); /*函数:根据收集的脉冲数据进行RC5解码*/ void IR_RC5() bit B_v,BV; uchar x; uchar n; uint t; BV = 1; /BV=

10、1时检测(接收端)低电平时间,BV=0时检测(接收端)高电平时间。 x = 0; t = 0; N0=N1=N2=N3=0; for(n=0;n14;n+) /14位位码解码 x+; /最高位丢弃(1个数据3字节); (uchar *)&t)0 = vx+; (uchar *)&t)1 = vx+; /* 确认位码值 */ if(BV) if(t 950)B_v=1;x+=3; /BV=1时,如果t950uS,下次检测(接收端)高电平时间 else if(t 950)B_v=0;x+=3; else B_v=0;BV=1; /* 装载位码值 */ if(n = 1; if(B_v)N0 |=

11、0x02; else if(n=2) N1 = B_v; else if(n= 1; if(B_v)N2 |= 0x10; else if(n= 1; if(B_v)N3 |= 0x20; /* 发射位码值 */ ZIFUC( ); if(B_v)ZIFUC(1); else ZIFUC(0); #include 是什么呀?为什么我的keil编译不了还有AIFUC是起什么作用的 我的编译器报错了/* / 实验调试助手,串口字符显示(版本:2011/08/06)/ 串口说明:使用定时器1,字符发送,N,8,1/ ( 6MHz 1T) 28800bps / (11.0592MHz 1T)11520

12、0bps/ ( 12MHz 1T) 57600bps/ (22.1184MHz 1T)256000bps/ ( 6MHz 12T)2400bps/ (11.0592MHz 12T) 57600bps/ ( 12MHz 12T)4800bps/ 【供用户调用的3个函数】 / void Uart_Init(uint8 M,uint8 T); /串口初始化/ void JZ(uint32 tem,uint8 num,uint8 i); /整形数据送串口显示/ void ZIFUC(uint8 code *p); /字符串发送 /* #ifndef_CKA_H_#define_CKA_H_#inclu

13、de#define uint8 unsigned char #define uint16unsigned int #define uint32unsigned long /*函数:串口初始化入口:(MHz,12T/1T)举例:如使用22.1184MHz晶振,STC 1T系列, 那么初始化时应为:Uart_Init(22,1), 与PC的串口助手通讯:波特率256000bps,字符,校验位N,数据位8,停止位1*/void Uart_Init(uint8 M,uint8 T) bit BS,XT;uint16 MT;MT = M*100+T; switch(MT) /【1T系列】 case 60

14、1: /28800bps6MHz BS= 1; /倍速 XT= 1; /1T模式 TL1 = 0xF3; /初值 break; case 1101: /115200bps11.0592MHz BS= 0; /不倍速 XT = 1; /1T模式 TL1 = 0xFD; /初值 break; case 1201: /57600bps12MHz BS= 1; /倍速 XT = 1; /1T模式 TL1 = 0xF3; /初值 break; case 2201: /256000bps22.1184MHz BS= 1; /倍速 XT = 1; /1T模式 TL1 = 0xFB; /初值 break; /

15、【12T系列】 case 612: /2400bps6MHz BS= 1; /倍速 XT= 0; /12T模式 TL1 = 0xF3; /初值 break; case 1112: /57600bps11.0592MHz BS= 1; /倍速 XT= 0; /12T模式 TL1 = 0xFF; /初值 break; case 1212: /4800bps12MHz BS= 1; /倍速 XT = 0; /12T模式 TL1 = 0xF3; /初值 break; if(BS)PCON |= 0x80; /使能波特率倍速位SMODelsePCON &= 0x7f; /波特率不倍速 SCON= 0x5

16、0; /8位数据,可变波特率if(XT)AUXR |= 0x40; /定时器1时钟为Fosc,即1TelseAUXR &= 0xbf; /定时器1时钟为Fosc/12,即12T AUXR &= 0xfe; /串口1选择定时器1为波特率发生器 TMOD &= 0x0f; /清除定时器1模式位 TMOD |= 0x20; /设定定时器1为8位自动重装方式 TH1 = TL1; /重装值 ET1 = 0; /禁止定时器1中断 TR1 = 1; /启动定时器1 /*函数:HEX转ASCII*/uint8 HEX2ASCII(uint8 dat) dat &= 0x0f; if(dat = 9) ret

17、urn(dat+0); /数字09(0 0x30) return (dat-10+A); /字母AF(A 0x41,a 0x61)/*函数:串口发送*/void TxS(uint8 i) SBUF=i; while(!TI); TI=0;/*函数:字符串发送*/void ZIFUC(uint8 code *p) /发送一串字符串 for(; *p != 0; p+) TxS(*p); /遇到停止符0结束/*函数:整形数据送串口显示入口:tem = 整形数据(送入14字节整形数据) num = 以什么进制显示,2:二进制,10:十进制,16:十六进制 i = 显示低几位 (以二进制显示时) =

18、显示个位算起几位数(以十进制显示时) = 显示几字节 (以十六进制显示时)*/void JZ(uint32 tem,uint8 num,uint8 i) uint8 j,z10; bit BT=0; switch(num) case2: tem = _lror_(tem,i-1); /以二进制显示 while(i-) if(tem & 1)ZIFUC(1); else ZIFUC(0); tem = _lrol_(tem,1); /* 【 另一种算法 】 tem = (32-i); while(i-) if(tem & 0x80000000)ZIFUC(1); else ZIFUC(0); t

19、em = 1; */ break; case 10: for(j=0;ji;j+)/以十进制显示 zj = tem%10; /nv0=个位,nv1=十位, tem /= 10; while(i-) if(z | (i=0)BT=1; /数据有效标志 if(BT)TxS(HEX2ASCII(z); /数据有效前的“0”不显示, elseZIFUC( ); /用空格替换。 break; case 16: for(j=4-i;j4); /发送高4位 TxS(HEX2ASCII(zj); /发送低4位 break; #endif/ 头文件 CKA.H 应用示例/#define uint8 unsign

20、ed char #define uint16unsigned int#define uint32unsigned long#include STC89C52RC.H#include intrins.h#include CKA.H/*函数:10ms n 延时程序 STC 12T12MHz*/void YS10ms(uint8 n)uint8 i,j,k;for(i=n;i!=0;i-)for(j=30;j!=0;j-)for(k=165;k!=0;k-);void main(void) uint32 a = 1234567890;uint32 b = 0xABCE1234; uint8 c =

21、0x33;Uart_Init(11,12); /串口初始化(11.0592MHz晶振,STC 12T系列),57600bps,字符,校验位N,数据位8,停止位1 YS10ms(60);ZIFUC(rn* 串口显示实验 *rnrn); ZIFUC( a = );JZ(a,10,10); /以十进制显示aZIFUC( a的低2位 = );JZ(a,10,2); /以十进制显示a的低2位ZIFUC(rn b = 0x);JZ(b,16,4); /以十六进制显示bZIFUC( b低3字节 = ); JZ(b,16,3); /以十六进制显示b的低3字节ZIFUC(rn b = ); JZ(b,2,32)

22、; /以二进制显示bZIFUC(二进制)rn c = ); JZ(c,2,8); /以二进制显示c ZIFUC(二进制)rn); ZIFUC(rnrn* c自加1显示 *rnrn);while(1) c+; ZIFUC(十六进制:c = 0x); JZ(c,16,1); /以十六进制显示c YS10ms(200); ZIFUC(rn);我用STC12C5A60S2的芯片跑了这个程序,程序跑成功了,用的是该芯片的PCA模块1,头文件改成了PCA1.主函数和头文件改了下,CKA文件不变!我在研究楼主这个程序,想红外发射出来,还想压缩数据,保存到eeprom中去!/* 作品:捕获红外发射脉冲高、低电

23、平时间,送串口显示单片机:STC12C5410 晶振:12M编译环境:Keil uVision4 V9.00*/说明:1、适用于:1T系列含有PCA捕获的STC单片机/ 2、捕获引脚PCA2(也就是P2.0),3字节存放一个电平时间数据。/ 3、串口显示脉冲高低电平时间数据(串口:字符 57600bps 校验位N 数据位8 停止位1),/ 4、含NEC、RC5解码,如需其它解码请自己加入。/NEC码:(芯片有 市场上用量最大的HT6121/6122及其兼容的IC芯片等)/RC5码:(芯片有 SAA3006、SAA3010、SAA3027、PCA8521、PT2210 等)#include #include #define uchar unsigned char #define uintunsigned int#define ulong unsigned longsbit IR = P14; /捕获引脚PCA2 即红外接收端口sbit P21=P21;uchar xdata v486; uchar N4;uintt;ulong nn;bit VT;

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!