STC红外线测试C程序
- 格式:doc
- 大小:43.00 KB
- 文档页数:4
纯软件解码---汇编版利用程序判电平和时间进行解码,缺点是浪费系统软件资源;优点是对系统硬件要求稍低ORG0000HT0ZDBIT20H.2XHBITP3.3;红外接收头数据接口RSBITP2.3RWBITP2.4EBITP2.5BBBITP3.6ORG0000H;AJMPMAINORG000BH;T0中断入口LJMPT0ZDCXORG0100H;主程序首地址MAIN:LCALLCSHMOVDPTR,#TAB;总查表SETBEA;T0中断设定SETBET0MOVTMOD,#01HDDXH:;信号接收前准备SETBP2.0;关信号指示灯MOVP0,#0FFHCLRTR0;关T0中断CLRT0ZD;接收信号时间判断MOVR5,#4;延时计数MOVTH0,#00HMOVTL0,#00H;================解码主要过程===========关键============================================================ JBXH,$;等待电平变低,解码从这开始CLRP2.0;开信号指示灯,表示正在接收信号MOVP0,#8EHSETBTR0;开T0中断LCALLYS3MSJBXH,DDXH;干扰检测LCALLYS3MSJBXH,DDXH;干扰检测DD1:JBT0ZD,DDXH;是否超出接收允许时间JNBXH,DD1;等待电平变高LCALLYS3MSJNBXH,DDXH;干扰检测DD2:JBT0ZD,DDXH;是否超出接收允许时间JBXH,DD2;等待电平变低JSSJ:;信号确认,开始接收数据MOVR0,#30HZJ:;接收一个字节数据MOVR2,#8WEI:;位数据,分辩0和1JBT0ZD,DDXH;是否超出接收允许时间JNBXH,WEI;等待电平变高LCALLYS845MOVC,XH;取位数据RRCADD3:JBT0ZD,DDXH;是否超出接收允许时间JBXH,DD3;等待电平变低,为1的高电平提供过度DJNZR2,WEI;8位数据是否接收完MOV@R0,AINCR0CJNER0,#34H,ZJ;四字节数据是否接收完MOVA,33HCPLACJNEA,32H,DDXH;键值确认,解码MOVR4,A;==========这里已经取出键值,存在R4中================================================== MOVR7,#100;TSY:MOVR6,#255DJNZR6,$CPLBBDJNZR7,TSYMOVA,#0CDH;键值高位输出LCALLYJP_XZLMOVA,R4MOVB,#10HDIVABMOVCA,@A+DPTR LCALLYJP_XSJMOVA,#0CEH;键值低位输出LCALLYJP_XZLMOVA,BMOVCA,@A+DPTR LCALLYJP_XSJ; LCALLDYBF;调用灯控制子程序LJMPDDXH;返还等待下一次信号YS845:;延时845微秒MOVR7,#255DJNZR7,$MOVR7,#165DJNZR7,$RETYS3MS:;延时3msMOVR7,#8DDD:MOVR6,#255DJNZR6,$DJNZR7,DDDRETT0ZDCX:;T0中断程序MOVTL0,#00HMOVTH0,#00HDJNZR5,T0FHSETBT0ZDT0FH:RETI;===============以下是多余部分=========================================================================== DYBF:MOVA,#0C0H;用号码前高位输出LCALLYJP_XZLMOVA,30HMOVB,#10HDIVABMOVCA,@A+DPTRLCALLYJP_XSJMOVA,#0C1H;用户码前低位输出LCALLYJP_XZLMOVA,BMOVCA,@A+DPTRLCALLYJP_XSJMOVA,#0C4H;用户码后高位输出LCALLYJP_XZLMOVA,31HMOVB,#10HDIVABMOVCA,@A+DPTRLCALLYJP_XSJMOVA,#0C5H;用户码后低位输出LCALLYJP_XZLMOVA,BMOVCA,@A+DPTRLCALLYJP_XSJ;============此处专门针对我的开发板和遥控,不是解码的关键,只是一种应用举例MOVA,R4CJNEA,#0CH,BA1;是否1号键按下CPLP1.0;点亮1号灯BA1:CJNEA,#18H,BA2;是否2号键按下CPLP1.1;点亮1号灯BA2:CJNEA,#5EH,BA3;是否3号键按下CPLP1.2;点亮1号灯BA3:CJNEA,#08H,BA4;是否4号键按下CPLP1.3;点亮1号灯BA4:CJNEA,#1CH,BA5;是否5号键按下CPLP1.4;点亮1号灯BA5:CJNEA,#5AH,BA6;是否6号键按下CPLP1.5;点亮1号灯BA6:CJNEA,#42H,BA7;是否7号键按下CPLP1.6;点亮1号灯BA7:CJNEA,#52H,BAB;是否8号键按下CPLP1.7;点亮1号灯BAB:RETCSH:;=============液晶初始化===============MOVA,#00111000B;8位数据,双行显示,5-7字型LCALLYJP_XZL;调用写液晶指令MOVA,#00001100B;显示屏开启,光标出现在地址计数器位置,光标不闪烁LCALLYJP_XZL;调用写液晶指令MOVA,#00000110B;光标右移一格,AC值加一,字符全部不动LCALLYJP_XZL;调用写液晶指令MOVA,#81H;LCALLYJP_XZLMOVA,#4CH;L的ASCII码LCALLYJP_XSJMOVA,#83H;LCALLYJP_XZLMOVA,#47H;G的ASCII码LCALLYJP_XSJMOVA,#85H;LCALLYJP_XZLMOVA,#58H;X的ASCII码LCALLYJP_XSJMOVA,#88H;LCALLYJP_XZLMOVA,#5AH;Z的ASCII码LCALLYJP_XSJMOVA,#89H;LCALLYJP_XZLLCALLYJP_XSJMOVA,#8AH; LCALLYJP_XZLMOVA,#69H;i的ASCII码LCALLYJP_XSJMOVA,#8CH; LCALLYJP_XZLMOVA,#5AH;Z的ASCII码LCALLYJP_XSJMOVA,#8DH; LCALLYJP_XZLMOVA,#61H;a的ASCII码LCALLYJP_XSJMOVA,#8EH; LCALLYJP_XZLMOVA,#6FH;o的ASCII码LCALLYJP_XSJMOVA,#0C2H; LCALLYJP_XZLMOVA,#48H;H的ASCII码LCALLYJP_XSJMOVA,#0C6H; LCALLYJP_XZLMOVA,#48H;H的ASCII码LCALLYJP_XSJMOVA,#0CAH; LCALLYJP_XZLLCALLYJP_XSJMOVA,#0CBH;LCALLYJP_XZLMOVA,#5AH;Z的ASCII码LCALLYJP_XSJMOVA,#0CCH;LCALLYJP_XZLMOVA,#3AH;:的ASCII码LCALLYJP_XSJMOVA,#0CFH;LCALLYJP_XZLMOVA,#48H;H的ASCII码LCALLYJP_XSJRET;=========写指令到液晶============= YJP_XZL:LCALLCHECK_BUSY;查询忙碌状态CLRECLRRSCLRRWSETBEMOVP0,A;写指令CLRERET;==========写数据到液晶============== YJP_XSJ:LCALLCHECK_BUSY;查询忙碌状态CLRESETBRSCLRRWSETBEMOVP0,A;写数据CLRERET;=========查询忙碌标志============CHECK_BUSY:PUSHACCBUSY_LOOP:CLRESETBRWCLRRSSETBEMOVA,P0;读取状态JBp0.7,BUSY_LOOPPOPACCLCALLDELRETDEL:MOVR6,#5L1:MOVR7,#248DJNZR7,$DJNZR6,L1RETTAB:DB30H,31H,32H,33H,34H,35H,36H,37H,38H,39H DB41H,42H,43H,44H,45H,46HEND中断加定时器---C语言版优点:完全是状态解码,极少的占用系统软件资源(CPU),随时都可以解码,而不管系统此时运行到何处。
53第2卷 第6期基于STC 单片机的红外解码测试仪设计钱小四(厦门建霖健康家居股份有限公司,福建 厦门 361000)摘要:很多家用电器都采用红外遥控作为短距离无线控制方式,文章采用STC 单片机作为核心解码控制器,通过其强大功能分析解码各种红外遥控器的数据,为遥控器厂家及产品设计人员提供一种可靠便捷的解码仪器,能极大的提高制造企业生产效率。
关键词:STC 单片机;红外解码;测试仪中图分类号:TP368.1;TN407 文献标识码:A 文章编号:2096-6164(2020)06-0053-021 红外解码测试仪概述红外解码测试仪是专门用于红外遥控器的数据解码测试仪器,不仅解码常用的NEC 、RC5等市场覆盖率高的协议的遥控器,还可以解码市场上常见空调协议如格力、海信、奥克斯、LG 等长数据的遥控器及其它自定义类型的家用电器红外遥控器;各种协议的解码精度都保持在3%的范围内,超出范围的不良产品均可以通过仪器筛选出;可支持40种以上红外遥控协议,同时也可以兼容无线通讯模块如2.4G 或蓝牙模块的解码测试,能极大提升遥控器生产厂家的生产检测效率,同时也为设计开发人员提供极其便利设计及检测的方法。
2 红外线原理特征描述红外线是波长在760 nm ~1 mm 之间的电磁波,它的频率高于微波而低于可见光,是一种人的眼睛看不到的光线。
红外通信一般采用红外波段内的近红外线,波长在0.75 um ~25 um 之间。
红外数据协会(IRDA)成立后,为了保证不同厂商的红外产品能够获得最佳的通信效果,红外通信协议将红外数据通信所采用的光波波长的范围限定在850 nm ~940 nm 之内。
作为无线局域网的传输方式,红外线方式的最大优点是不受无线电干扰,且它的使用不受国家无线管理委员会的限制。
中国遥控器产量占全球总产量的80%;遥控器制造业属于一个发展成熟及竞争激烈的行业,集中度较高。
国内遥控器企业目前大多停留在劳动力密集的代加工状态,受成本限制测试仪器使用率低、生产效率低下。
STC89C58RD+ 红外遥控解码与串口程序//以下程序适用于STC89C58RD+ ,使用22.1184MHz晶振,用1838来对红外遥控器解码,1838的1脚接外中断0脚,即单片机P3.2脚//红外遥控器发出的红外信号经过1838处理后输出的是9.5ms低电平(也可能是4.5ms低电平)加4.5ms高电平的前导码,后面8位的地址码,8位的地址反码(也可能是地址码),8位的数据码,8位的数据反码,总共32位码//其中0码由O.56ms低电平和0.56ms高电平组合而成.脉冲宽度为1.12ms;1码由0.56ms低电平和1.69ms高电平组合而成,脉冲宽度为2.25ms#include<reg52.h>#include<stdio.h>#include<string.h>unsigned char count;unsigned int Address_Part,Data_Part;unsigned char date;bit Rev_flag;bit Over_flag;//unsigned int time_data[35];//unsigned char time_count;void init_config()//初始化函数{TMOD=0x21;//设置定时器0为工作方式1,定时器1为方式2--8位自动重装PCON |=0x80;//SMOD=1,要产生115200波特率必须置位REN=1;//启动串行接收数据SM0=0;SM1=1;//SM0,SM1设置串行口为工作方式1,10位异步收发器-->1位起始位,8位数据,1位停止位TI=1;//要使用printf()函数,就需要置位,后期不能置0TL1=0xff;//256-(2*fosc/(384*baud));TH1=0xff;//定时器1的初值,22.1184M晶振TR1=1;//启动T1定时器TH0=0x00;TL0=0x00;//设置定时器0初值IT0=1;//设置外中断0为下降沿触发ET0=1;//开定时器0允许中断//ET1=1;//开定时器1允许中断EX0=1;//开外中断0//TR0=1;ES=1;//开串口中断EA=1;//开总中断Rev_flag=0;Over_flag=0;}void main(){init_config();while(1){if(Over_flag){Over_flag=0;printf("Address_Part:%x,Data_Part:%x\n\r",Address_Part,Data_Part);}if(Rev_flag)//判断串口接受到数据,只是把从串口调试助手发过来的数据发回去,测试收发用而已{ES=0;Rev_flag=0;SBUF=date;//发送数据while(!TI);//发送数据完毕才跳出死循环ES=1;// TI=0;}/* if(time_count==40)//把收到的时间th值传给串口打印出来{time_count=0;printf("time:\n\r");for(;time_count<35;time_count++){printf("%d \n\r",time_data[time_count]);}memset(time_data,0,sizeof(time_data));EX0=1;//开外中断0}*/}}void exter() interrupt 0{unsigned int th;unsigned char tl;bit ds;TR0=0;//关定时器0th=TH0;//提取出高8位tl=TL0;//提取出低8位th<<=8;//左移8位th=th|tl;//算出定时器总共的计数值TH0=0x00;//初始值TL0=0x00;/* time_data[time_count]=th;//这段代码的作用是在不知道th的数值是多少为前导码,为0,为1时,把收到的时间th给提取出来,方便传给串口打印出来time_count++;if(time_count==35){time_count=40;EX0=0;}TR0=1;*//*这段判断前导码和0、1的值是12M晶振下的if(th>950&&th<1225)ds=0;//判断0和1else if(th>2050&&th<2345)ds=1;else if(th>13325&&th<13600)//判断前导码*///这段判断前导码和0、1的值是22.1184M晶振下的if(th>1900&&th<2260)ds=0;//判断0和1else if(th>4000&&th<4300)ds=1;else if(th>24900&&th<25350)//判断前导码{Address_Part=0;Data_Part=0;count=0;Over_flag=0;TR0=1;return;}else{TR0=1;return;}//去除干扰,当接收的是准备进前导码时的下降沿和截止码时,该语句起作用,没有该语句,则只能接收一次count++;if(count<16){Address_Part=Address_Part|ds;Address_Part=Address_Part<<1;TR0=1;}else if(count==16){Address_Part=Address_Part|ds;TR0=1;}else if(count<32){Data_Part=Data_Part|ds;Data_Part=Data_Part<<1;TR0=1;}else if(count==32){Data_Part=Data_Part|ds;Over_flag=1;}//接收完32位,后面应该有连续码,但不需要,所以不作处理}void time0() interrupt 1//要是没有该函数,可能会因为溢出而导致解码不正确{TR0=0;}void ser() interrupt 4{if(RI)//一定要加该判断句,不然串口调试助手那里会一直收到数据{RI=0;date=SBUF;//提取数据Rev_flag=1;}}。
基于stc89c52单片机的红外计数器设计及实现摘要:本文介绍了基于STC89C52单片机的红外计数器的设计和实现。
该计数器采用红外传感器作为输入信号,使用单片机作为处理器,能够实现自动计数,可以应用于各种场合的计数任务。
本文从硬件设计、软件设计两个方面进行了详细介绍,并给出了实际测试结果。
关键词:STC89C52单片机;红外计数器;硬件设计;软件设计一、绪论二、硬件设计2.1 红外传感器红外传感器是红外计数器的输入信号源,采用两个红外传感器进行输入信号的采集。
一般来说,红外传感器具有发射管和接收管两部分组成,发射管会发射一个特定频率的红外光,接收管则可以接收这个频率的红外光。
通过发射管和接收管之间的反射和折射效应,可以实现对物体进行探测。
2.2 显示器为了方便实时显示计数结果,该计数器装配了数码管显示器。
数码管显示器可以显示0~9的数字,通过不同的控制信号可以实现不同数字的显示。
2.3 单片机选型由于计数器需要进行计算和显示计数结果,因此需要一款性能优良的单片机来实现这些功能。
本设计采用了STC89C52单片机作为处理器。
STC89C52单片机是一款高性能、低功耗的8位单片机,具有多种外设和扩展接口,适合于各种应用场合。
2.4 电源模块为了保证计数器的正常工作,需要提供稳定可靠的电源。
本设计采用了交流电转直流电的方式,通过稳压芯片将电源输出电压稳定在5V左右,以满足单片机和显示器的工作电压要求。
3.1 程序设计流程该计数器的程序设计采用C语言编写,主要实现了两个功能:读取红外传感器输入的信号,进行计数并更新计数结果。
具体程序设计流程如下:1)初始化端口:设置单片机输入输出管脚的模式和初值。
2)初始化定时器:设置定时器的时钟源、计数模式和计数初值。
3)循环读取输入信号:连续检测两个红外传感器的输入信号,当检测到信号变化时,进行计数并更新计数结果。
4)显示计数结果:将计数结果存储到单片机中的寄存器中,通过数码管实现实时显示。
红外线报警器测试程序**************************************************************************简单的被动式红外线报警器PB1: 绿色LEDPB0: 红色LEDPD7: 蜂鸣器PC5: 连接TL0083的输出端PD0: 红外LED2004年8月4日***************************************************************************/#include <iom8v.h>//和单片机类型相对应的头文件,选择Atmega8做实验;#include <macros.h>void delay_nus(unsigned int n);//函数声明,本实验中会用到这两个函数void delay_nms(unsigned int n);void main(void)//主函数{ //L6unsigned int i;unsigned char n;OSCCAL=0X9E;//系统时钟校准,不同的芯片和不同的频率,//其校准值是不一样的TCCR0=BIT(CS01);//T/C0时钟8分频TIMSK=BIT(TOIE0);//允许定时器T/C0溢出中断SEI();//开中断DDRD|=BIT(0)|BIT(7);//设置PD0、7为输出口DDRC&=~BIT(5);//设置PC5为输入口DDRB|=BIT(1)|BIT(0);//定义B口的PB0、PB1为输出口PORTB|=BIT(1);//PB1口输出高电平,绿灯亮while(1){ //L5for (n=0;n<10;n++){ //L4delay_nus(60);if ((PINC&0B00100000)==0) //检测PC5是否为低电平{ //L3i++;if (i>8)//如果连续检测到有301-399次PC5都为低电平,则报警{ //L2CLI();for(i=0;i<10;i++){ //L1PORTB&=~BIT(1);//关闭绿灯PORTD|=BIT(7);//打开蜂鸣器PORTB^=BIT(0);//翻转PB1口,红灯快闪delay_nms(300);} //L1PORTD&=~BIT(7);//关闭蜂鸣器PORTB&=~BIT(0);//关闭红灯i=0;SEI();} //L2 */PORTB|=BIT(1);//打开绿灯} //L3} //L4//-------------------码调制----------------------------/CLI();//PD0连续2ms都无输出PORTD&=~BIT(0);delay_nms(2);TCNT0=245;SEI();//PD0连续600us产生38KHZ信号//delay_nus(100);} //L5 */} //L6#pragma interrupt_handler LED0:iv_TIMER0_OVF//指定中断服务程序的入口void LED0(void)//产生38KHz的方波信号{PORTD^=BIT(0);//翻转PD0口电平TCNT0=245;}void delay_nus(unsigned int n)//n微秒延时函数{unsigned int i;for (i=0;i<n;i++){asm("nop");}}void delay_nms(unsigned int n)//n毫秒延时函数{unsigned int i;for (i=0;i<n;i++) //执行n次1毫秒延时delay_nus(1000);}。