红外解码数码管显示
- 格式:doc
- 大小:160.00 KB
- 文档页数:13
基于STC89C54单片机设计的红外解码数码管显示1.红外解码原理红外遥控器发送数据时,是将二进制数据调制成一系列的脉冲信号红外发射管发射出去,红外载波为频率38KHz的方波,红外接收端在收到38KHz的载波信号时,会输出低电平,否则输出高电平,从而可以将“时断时续”的红外光信号解调成一定周期的连续方波信号,再经过1838一体化红外接收头解调便可以恢复出原数据信号。
如图所示,我们可以通过单片机的定时器给红外接收管接收的每个点电平计时,并把每个点电平的时间存起来。
根据时间的不同来分辨是引导码、“0”还是“1”。
下面是我做的实验原理图上图式数码管显示原理图,下面是红外接收管与单片机的连接原理图。
注:上图的J27是和单片机的P3^2相连的。
程序中用到的定时器1、定时器0和外部中断0.下面是实验的C语言程序:/*-----------------------------------------------名称:遥控器红外解码数码管晶显示论坛:无编写:yang-baoan日期:2011.10修改:无内容:按配套遥控器按键,液晶显示4组码值,分别是用户码用户码数据码数据反码显示如下:1E1E00FF------------------------------------------------*/#include<reg52.h>//包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义sbit IR=P3^2;//红外接口标志#define DataPort P0//定义数据端口程序中遇到DataPort则用P0替换sbit LATCH1=P2^2;//定义锁存使能端口段锁存sbit LATCH2=P2^3;//位锁存unsigned char Tab[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};unsigned char TempWei[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};/*------------------------------------------------全局变量声明------------------------------------------------*/unsigned char irtime;//红外用全局变量bit irpro_ok,irok;unsigned char IRcord[4];unsigned char irdata[33];unsigned char TempData[8];/*------------------------------------------------函数声明------------------------------------------------*/void Ir_work(void);void Ircordpro(void);void Display(unsigned char FirstBit,unsigned char Num);/*------------------------------------------------定时器0中断处理------------------------------------------------*/void tim0_isr(void)interrupt1using1//using表示工作寄存器,后跟0—3个数分别表示工作寄存器组{irtime++;//用于计数2个下降沿之间的时间}/*------------------------------------------------外部中断0中断处理------------------------------------------------*/void EX0_ISR(void)interrupt0//外部中断0服务函数{static unsigned char i;//接收红外信号处理static bit startflag;//是否开始处理标志位if(startflag){if(irtime<63&&irtime>=33)//引导码TC9012的头码,9ms+4.5ms,此if语句只对下一条语句起作用i=0;irdata[i]=irtime;//存储每个电平的持续时间,用于以后判断是0还是1irtime=0;i++;if(i==33){irok=1;i=0;}}else{irtime=0;startflag=1;}}/*------------------------------------------------定时器0初始化------------------------------------------------*/void TIM0init(void)//定时器0初始化{TMOD|=0x02;//定时器0工作方式2,TH0是重装值,TL0是初值TH0=0x00;//重载值TL0=0x00;//初始化值ET0=1;//开中断TR0=1;}/*------------------------------------------------外部中断0初始化------------------------------------------------*/void EX0init(void){IT0=1;//指定外部中断0下降沿触发,INT0(P3.2)EX0=1;//使能外部中断EA=1;//开总中断}/*------------------------------------------------定时器1初始化------------------------------------------------*/void Init_Timer0(void){TMOD|=0x10;//使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响TH1=(65536-2000)/256;//给定初值TL1=(65536-2000)%256;EA=1;//总中断打开ET1=1;//定时器中断打开TR1=1;//定时器开关打开}/*------------------------------------------------定时器1中断子程序------------------------------------------------*/void Timer0_isr(void)interrupt3{TH1=(65536-2000)/256;//重新赋值2ms TL1=(65536-2000)%256;Display(0,8);//调用数码管扫描}/*-----------------------------------------------------------数码管显示函数,动态扫描-----------------------------------------------------------*/void Display(unsigned char FirstBit,unsigned char Num) {static unsigned char i=0;DataPort=0;//清空数据,防止有交替重影LATCH1=1;//段锁存LATCH1=0;DataPort=TempWei[i+FirstBit];//取位码LATCH2=1;//位锁存LATCH2=0;DataPort=TempData[i];//取显示数据,段码LATCH1=1;//段锁存LATCH1=0;i++;if(i==Num)i=0;}/*------------------------------------------------键值处理------------------------------------------------*/void Ir_work(void){unsigned int t=200;TempData[0]=Tab[IRcord[0]/16];TempData[1]=Tab[IRcord[0]%16];TempData[2]=Tab[IRcord[1]/16];TempData[3]=Tab[IRcord[1]%16];TempData[4]=Tab[IRcord[2]/16];TempData[5]=Tab[IRcord[2]%16];TempData[6]=Tab[IRcord[3]/16];TempData[7]=Tab[IRcord[3]%16];irpro_ok=0;//处理完成标志}/*------------------------------------------------红外码值处理------------------------------------------------*/void Ircordpro(void)//红外码值处理函数{unsigned char i,j,k;unsigned char cord,value;k=1;for(i=0;i<4;i++)//处理4个字节{for(j=1;j<=8;j++)//处理1个字节8位{cord=irdata[k];if(cord>8)//大于某值为1,这个和晶振有绝对关系,这里使用12M计算,此值可以有一定误差value|=0x80;if(j<8){value>>=1;}k++;}IRcord[i]=value;value=0;}irpro_ok=1;//处理完毕标志位置1}/*------------------------------------------------延时函数,含有输入参数unsigned int t,无返回值unsigned int是定义无符号整形变量,其值的范围是0~65535------------------------------------------------*//*------------------------------------------------主函数------------------------------------------------*/void main(void){EX0init();//初始化外部中断TIM0init();//初始化定时器Init_Timer0();while(1)//主循环{if(irok)//如果接收好了进行红外处理{Ircordpro();irok=0;}if(irpro_ok)//如果处理好后进行工作处理,如按对应的按键后显示对应的数字等{Ir_work();}}}。
红外解码程序本篇介绍红外解码的原理和程序的写法。
下面来看一下,红外线是如何编码的。
下面来具体说一下,解码的原理,每按一下遥控器的一个按键,遥控器就会发出32个“0”“1”代码(当然是通过高低电平的占空比来判断是0还是1的),具体是0,1是如何编码的上面图片中有介绍,和一个引导码,引导码的作用是告诉处理器,接下来将要开始发送代码,我们在编写程序时,当检测到引导码时,就应该准备接受数据了。
32位代码中的前16位是用户识别码,不同的遥控器不相同,防止互相干扰的,后16是8为数据码,和8位数据反码。
接下来开始介绍如何解码程序的编写。
程序中用到了两个中断,一个是定时器中断,一个是外部中断。
定时器中断用来准确计时,判断接受的代码是0还是1,外部中断用来准确确定定电平到来的时刻,然后开始计时。
/*********************************************************函数功能:红外解码,用八位数码管显示红外线的按键码,便于红外控制测试环境:hot 51学习板编译环境:keil4整理人:张家越QQ:435835181整理时间:2011-04-03************************************************************/#include<reg51.h>#define uchar unsigned char#define uint unsigned intuchar code seg_du[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0 x6f,0x77,0x7c,0x39,0x5E,0x79,0x71 };//0-f的段选码unsigned char code seg_we[]={0,1,2,3,4,5,6,7};uchar irtime,startflag,bitnum,irreceok;uchar irdata[33];uchar irprosok;uchar display[8];uchar ircode[8] ;sbit led1=P0^1;sbit led2=P0^2;/******************************************************************** ****函数功能:延时函数,在数码管显示时使用,不需要很精确********************************************************************* ****/void delay_50us(uint t){uchar j;for(;t>0;t--)for(j=19;j>0;j--);}/******************************************************************** ******函数的功能:定时器0的初始化********************************************************************* *****/void timer0init(){TMOD=0x02; //设置定时器工作在方式2TH0=0x00; //TL0=0x00; //设置定时器的初值ET0=1; //开定时器中断TR0=1; // 打开定时器EA=1; //开总中断}/******************************************************************** ****外部中断1的初始化********************************************************************* **/void int1init(){IT1=1; //设置触发方式为上升沿EX1=1; //开外部中断1EA=1; //开总中断}/******************************************************************** **定时器0的功能函数,每中断一次irtime++,用于计时********************************************************************* **/void timer0() interrupt 1{irtime++; //定时器中断一次irtime++,用于计时}/******************************************************************** ***外部中断0的处理函数,每当有低电平数据过来时,中断一次,(使用次中断的前提是,信号线必需接在外部中断0上面,也就是P3^2口),函数功能是,把信号从高低电平变成时间的代码放入irdata【】中********************************************************************* ***/void int1() interrupt 2{if(startflag){if(irtime>32) //一组代码检测完毕{bitnum=0;}irdata[bitnum]=irtime; //把检测到的时间送到数组irdata【】中去irtime=0;bitnum++;if(bitnum==33) //如果检测到bitnum=33,说明32位用户码已经检测完毕{bitnum=0; //将bitnum清零以便重新计数irreceok=1; //接收完毕标志位置一}}else //(此函数先进入else语句,跳过引导码的检测){startflag=1; //将开始标志位置一irtime=0; //设置时间初值为零irreceok=1; //接收完毕标志位置一}}/******************************************************************** *****函数功能:把irdata【】中的时间代码转换成二进制代码存放在ircode【】中********************************************************************* *****/void irpros(){uchar k=1,value,j,i;for(j=0;j<4;j++){for(i=0;i<8;i++){value=value>>1; //右移7次(第一次是00,相当于没有移位)if(irdata[k]>6) //循环8次{value=value|0x80;}k++;}ircode[j]=value;}irprosok=1;}/******************************************************************** ********函数的功能是:将ircode【】中的二进制代码转换成为16进制代码便于在数码管上显示******************************************************************* ********/void irwork(){display[0]=ircode[0]/16;display[1]=ircode[0]%16;display[2]=ircode[1]/16;display[3]=ircode[1]%16;display[4]=ircode[2]/16;display[5]=ircode[2]%16;display[6]=ircode[3]/16;display[7]=ircode[3]%16;}/******************************************************************** ****函数功能:用数码管显示解码结果********************************************************************* ***/void display1(){uchar i;for(i=0;i<8;i++){P2=seg_we[i];P0=seg_du[display[i]];delay_50us(40);}}void main(){timer0init(); //定时器初始化int1init(); //外部中断初始化while(1){if(irreceok) //判断数据接收完毕(数组中存储的是高低电平的时间){irpros(); //执行处理函数,将高低电平时间转化成16进制的0,1代码,存放在数组中irreceok=0; //标志清零}if(irprosok) //处理函数执行完毕,{irwork(); //将存储的16进制代码分离,便于数码管显示irprosok=0; //标志清零}display1();}}//在最后我再分析一下程序的编写思路,便于大家理解,一旦有按键按下,接受管接收到引导码,进入外部中断,并将高低电平的时间放入irdata【】数组中,接受完毕标志位置一,判断接受标志位,为1,进行处理函数,将高低电平转换成16进制数,处理标志位置一,判断处理标志位,为1,执行分离函数,将16进制数分离,便于数码管显示,分离完毕后显示。
51单片机实验报告一、引言51单片机是一种广泛应用于嵌入式系统开发的微控制器芯片。
本实验旨在通过对51单片机的实验研究,加深对该芯片的理解和应用。
二、实验一:LED灯闪烁控制本实验通过编写程序,控制51单片机上的LED灯以特定的频率闪烁。
为了实现这个目标,我们首先需要了解51单片机的引脚布局,确定LED灯的连接方式。
然后,通过编写相应的汇编程序,控制引脚的电平变化,从而实现LED灯的闪烁。
三、实验二:数码管显示数码管是一种常见的输出设备,通过控制引脚的输出来显示特定的数字。
本实验中,我们通过编写程序,实现通过51单片机控制数码管的显示。
通过对数码管的驱动原理和编程的学习,我们可以灵活地控制数码管的显示内容和频率。
四、实验三:蜂鸣器发声蜂鸣器是一种常见的声音输出设备,通过控制引脚的输出来产生特定的声音。
本实验中,我们通过编写程序,实现通过51单片机控制蜂鸣器的发声。
通过学习蜂鸣器的驱动原理和编程,我们可以根据需要产生不同频率和节奏的声音。
五、实验四:温湿度检测温湿度检测是一种常见的环境监测需求。
本实验中,我们通过引入温湿度传感器,实现通过51单片机获取环境的温度和湿度信息。
通过编写程序和读取传感器的数据,我们可以实时监测环境的温湿度,并进行相应的控制和反馈。
六、实验五:红外遥控红外遥控是一种常见的无线通信方式,通过发送和接收红外信号来实现远程控制。
本实验中,我们通过引入红外发射和接收模块,实现通过51单片机进行红外遥控。
通过编写相应的程序,设置红外遥控的编码和解码方式,我们可以实现对外部设备的遥控操作。
七、实验六:定时器应用定时器是51单片机中的重要模块,它可以实现定时和计数等功能。
本实验中,我们通过学习定时器的工作原理和编程,实现通过51单片机进行定时和计数的应用。
通过编写相应的程序和设置定时器的参数,我们可以实现不同的定时和计数功能,满足各种需要。
八、实验七:串口通信串口通信是一种常见的数据通信方式,通过串口接口发送和接收数据。
试用期小结尊敬的江苏三恒科技集团领导:您好!我叫程克辉,毕业于西北师范大学知行学院,电子信息工程专业。
在试用期的两个多月里,我在工程中心软件项目部实习工作,我很荣幸,能跟着***副总经理学习与专业相关的电子知识,收获不少!这两个多月在任总的指导下,我成功的了解、计算了:BT151可控硅、LM2940(1安恒流调节器)、LM317三端可调正稳压器集成电路、LM2674电源高效降压稳压转换器、13F-11网络隔离变压器、光耦开关、继电器、SC50462红外遥控发射模块、SM3XX0/3XX1红外接收头等电子元器件。
在任总的指导下和上面的学习我跟着任总学习“煤矿防爆显示系统”的电路设计、模块学习,也成功的用c语言成功的编写控制该系统的c程序,由于公司没有人用c对红外解码程序的编写,故在任总的悉心指导下,几经努力终于编写成功并且能稳定的通过硬件的测试。
硬件部分:1、外部12V电源转换成5V模块。
由LM2674器件实现2、外部1A恒流源模块。
由LM317和LM2940实现3、五个独立按键控制继电器模块。
由光耦开关实现4、继电器动作模块。
5、红外接收模块。
由SM3XX0/3XX1红外接收头实现6、外部的四路光端机、视频转换器、光缆传输、摄像头、画面分割器、网络视频等模块试用期的期间,由于刚来啥器件都没有,每每遇到困难的时候我就及时向***主任汇报,在张主任积极帮助下我的问题往往能很快的得到解决。
特别感谢张主任的无私支持和关怀!在红外线解码的c程序设计上,我面临着很大的困难,在学校根本就没有接触过红外线的解码,因为红外线是一种看不到摸不着的东西,且我们公司的红外线发射器用的是杭州士兰电子的器件很特殊。
它没有引导码只有16位的用户码和按键的数据码,这样写出来的c 解码程序就很容易受到外部红外线的干扰。
在程序初始化和有红外脉冲时能接收16位的0脉冲,即使解码出错也能有00H的码进入。
还好最后在我用数码管把红外线解出来的码显示出来,这样一切问题就迎刃而解了!程序能成功调试并通过硬件测试。
#include <reg51.h>#define c(x) (x*110592/120000)sbit Ir_Pin=P3^2;sbit beep=P3^6;unsigned char code Led_Tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf};//共阳极数码显示码0-F.unsigned char code Led_Sel[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};unsigned char Led_Buf[7]; //显示缓冲区char Led_Index; //位选unsigned char Ir_Buf[4]; //用于保存解码结果void delay_50ms(unsigned int t){unsigned int j;for(;t>0;t--)for(j=6245;j>0;j--){;}}//============================================================== //数码管扫描timer0() interrupt 1 using 1{TL0=65536-1000;TH0=(65536-1000)/256; //定时器0设定约1000us中断一次,用于数码管扫描P0=0xff;P2=Led_Sel[Led_Index]; //位选P0=Led_Tab[Led_Buf[Led_Index]]; //段选if(++Led_Index>7) Led_Index=0; //八个扫描完了,到第一个数码管}//============================================================== unsigned int Ir_Get_Low(){TL1=0;TH1=0;TR1=1;while(!Ir_Pin && (TH1&0x80)==0);TR1=0;return TH1*256+TL1;}//=============================================================unsigned int Ir_Get_High(){TL1=0;TH1=0;TR1=1;while(Ir_Pin && (TH1&0x80)==0);TR1=0;return TH1*256+TL1;}//============================================================== main(){unsigned int temp;char i,j;Led_Index=0;TMOD=0x11;TL0=65536-1000;TH0=(65536-1000)/256; //定时器0设定约1000us中断一次,用于数码管扫描EA=1;ET0=1;TR0=1;//Led_Buf[0]=0;//Led_Buf[1]=0;//Led_Buf[2]=0;//Led_Buf[3]=0; //显示区设成0// Led_Buf[4]=0;//Led_Buf[5]=0;//Led_Buf[6]=0;//Led_Buf[7]=0; //显示区设成0do{restart:while(Ir_Pin);temp=Ir_Get_Low();if(temp<c(8500) || temp>c(9500)) continue;//引导脉冲低电平9000temp=Ir_Get_High();if(temp<c(4000) || temp>c(5000)) continue;//引导脉冲高电平4500for(i=0;i<4;i++) //4个字节for(j=0;j<8;j++) //每个字节8位{temp=Ir_Get_Low();if(temp<c(200) || temp>c(800)) goto restart;temp=Ir_Get_High();if(temp<c(200) || temp>c(2000)) goto restart;Ir_Buf[i]>>=1;if(temp>c(1120)) Ir_Buf[i]|=0x80;}Led_Buf[0]=(Ir_Buf[0]/16)&0xf;//显示结果Led_Buf[1]=Ir_Buf[0]&0xf; //显示结果Led_Buf[2]=(Ir_Buf[1]/16)&0xf; //显示结果Led_Buf[3]=Ir_Buf[1]&0xf; //显示结果Led_Buf[4]=(Ir_Buf[2]/16)&0xf; //显示结果Led_Buf[5]=Ir_Buf[2]&0xf; //显示结果Led_Buf[6]=(Ir_Buf[3]/16)&0xf; //显示结果Led_Buf[7]=Ir_Buf[3]&0xf; //显示结果beep=0;delay_50ms(2);beep=1;}while(1);}。
遥控接收解码程序[C语言]2007年10月12日 星期五 14:06//实验目的:熟悉遥控接码解码的方法//数码管显示解码结果:高四位为用户码,低2位为按键码//硬件要求:拨码开关S10的第2位置ON,其他置OFF// 拨码开关S5、S6全部置ON// 其他拨码开关全部置OFF#include<pic.h>__CONFIG(0x1832);//芯片配置字,看门狗关,上电延时开,掉电检测关,低压编程关,加密,4M晶体HS振荡#define uchar unsigned char#define uint unsigned int#define bitset(var,bitno)((var)|=1<<(bitno))#define bitclr(var,bitno)((var)&=~(1<<(bitno)))union {struct {unsigned b0:1;unsigned b1:1;unsigned b2:1;unsigned b3:1;unsigned b4:1;unsigned b5:1;unsigned b6:1;unsigned b7:1;}oneBit;unsigned char allBits;} myFlag;#define CNT2_1 myFlag.oneBit.b1#define CNT2_2 myFlag.oneBit.b2#define CNT2_3 myFlag.oneBit.b3#define CNT2 myFlag .allBitsstatic bit FLAGS ;static bit Bitin;union Csr{ unsigned long i;unsigned char Csra[4];}myCsra;#define RMT RA1 // ;遥控接收输入脚位地址(RA。
1)#define BITIN 7 //遥控接收数据位位标志uchar CNT0, CNT3,CNT4; //用户临时寄存器1--4uint CNT1;uchar TABADD; //数码管显示码取码用寄存器uchar CSR0; //;遥控键码反码寄存器uchar CSR1; //;遥控器键码寄存器uchar CSR2; //;遥控器用户码高8位寄存器uchar CSR3; //;遥控器用户码低8位寄存器uchar FLAGS2; //;临时寄存器uchar CSR2A ; //遥控接收32位数据暂存寄存器const uchartable[]={0x0C0,0x0F9,0x0A4,0x0B0,0x99,0x92,0x82,0x0F8,0x80,0x90,0x88,0x83,0x0C6,0x0a1,0x86,0x8e,};//0x00 // 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f,//-------------系统初始化子程序------------------------------void initial (void){PORTA=0;ADCON1=7; // 设置RA口全部为普通数字IO口TRISA=0x02; // 将RMT设置为输入,其它所有IO口设置为输出TRISD=0; // ;RC口全部为输出PORTD=0xFF; //先让数码管全部不显示}//--------------------------------------------------------------------------------------------void RCV(){if(!RMT){CNT1=640; //4*256*10us 640*16=10。
全自动红外线遥控器解码测试仪使用说明一:基本参数电源 AC 220V,红外载波38K,最大可存储168个按键信息(视不同红外编码格式).二:性能描述1, 技术领先,功能齐全;全自动解码,无须手工操作;显示信息量大,红外编码格式及码值一目了然。
2, 带学习功能,可录入遥控器码值,方便成品测试。
3, 丰富的蜂鸣器声提示,减轻眼睛的疲劳,加快测试进度。
三:面板说明四:操作方法1,全自动解码&指定格式解码全自动解码:把拨动开关拨至“解码”方向,小数码管显示“AUTO”字样,解码仪进入自动解码模式。
使遥控器对着解码仪发码,若解码正确,解码仪则会在小数码管显示遥控器所使用的红外编码格式,下方大数码管则显示客户码及数据码信息,同时解码仪绿色LED闪烁一下,蜂鸣器BEEP一下,提示解码成功。
如果解码不成功,则LED不闪烁,蜂鸣器不响,显示也不改变。
指定格式解码:对于一祯码包含多种编码格式的遥控器,可以通过按“ENTER”键指定格式解码,用以精确捕捉每段码的码值,此时解码仪红色LED亮,小数码管显示的格式表示指定格式解码。
循环按“ENTER”可在多种格式预选。
按“RESET”键则返回全自动解码模式2,录入模式(成品录入)把拨动开关拨至“录入”方向,解码仪红色LED慢闪,小数码管显示“REC.000”字样(REC.000表示录入按键数为000),解码仪进入录入模式。
经测试,无次序按键测试会有大量按键被重复按下,实际花费时间比按按设定顺序按键测试反而要长,所以本产品仍设计为录入及校对须按相同的按键次序进行操作。
因此,在录入模式下,请根据各自遥控器先安排一个方便自己的按键顺序,然后依次按按键录入键码。
若解码仪解码成功,而且判断到接收到码与之前一个按键不同,则绿灯闪烁一下,录入按键号+1,该按键录入成功,效果如下图所示:用户码解码仪录入成功显示:数据码当解码仪无法识别到接收到的红外编码或判断到当前接收到的码与之前一个按键码一样,则解码仪的红灯闪烁一下,数码管显示不改变,不记录此次按键资料。
/*-----------------------------------------------名称:LCD1602引脚定义如下:1-VSS 2-VDD 3-V0 4-RS 5-R/W 6-E 7-14 DB0-DB7 15-BLA 16-BLK ------------------------------------------------*/#include "1602.h"#include "delay.h"#define CHECK_BUSYsbit RS = P1^0; //定义端口sbit RW = P1^1;sbit EN = P1^2;#define RS_CLR RS=0#define RS_SET RS=1#define RW_CLR RW=0#define RW_SET RW=1#define EN_CLR EN=0#define EN_SET EN=1#define DataPort P0/*------------------------------------------------判忙函数------------------------------------------------*/bit LCD_Check_Busy(void){#ifdef CHECK_BUSYDataPort= 0xFF;RS_CLR;RW_SET;EN_CLR;_nop_();EN_SET;return (bit)(DataPort & 0x80);#elsereturn 0;#endif}/*------------------------------------------------写入命令函数----------------- ----------------------------*/void LCD_Write_Com(unsigned char com){while(LCD_Check_Busy()); //忙则等待RS_CLR;RW_CLR;EN_SET;DataPort= com;_nop_();EN_CLR;}/*------------------------------------------------写入数据函数------------------------------------------------*/void LCD_Write_Data(unsigned char Data){while(LCD_Check_Busy()); //忙则等待RS_SET;RW_CLR;EN_SET;DataPort= Data;_nop_();EN_CLR;}/*------------------------------------------------清屏函数------------------------------------------------*/void LCD_Clear(void){LCD_Write_Com(0x01);DelayMs(5);}/*------------------------------------------------写入字符串函数------------------------------------------------*/void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s) {if (y == 0){LCD_Write_Com(0x80 + x); //表示第一行}else{LCD_Write_Com(0xC0 + x); //表示第二行}while (*s){LCD_Write_Data( *s);s ++;}}/*------------------------------------------------写入字符函数------------------------------------------------*//* void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data) {if (y == 0){LCD_Write_Com(0x80 + x);}else{LCD_Write_Com(0xC0 + x);}LCD_Write_Data( Data);}*//*------------------------------------------------初始化函数------------------------------------------------*/void LCD_Init(void){LCD_Write_Com(0x38); /*显示模式设置*/DelayMs(5);LCD_Write_Com(0x38);DelayMs(5);LCD_Write_Com(0x38);DelayMs(5);LCD_Write_Com(0x38);LCD_Write_Com(0x08); /*显示关闭*/LCD_Write_Com(0x01); /*显示清屏*/LCD_Write_Com(0x06); /*显示光标移动设置*/DelayMs(5);LCD_Write_Com(0x0C); /*显示开及光标设置*/}/*-----------------------------------------------名称:遥控器红外解码数液晶显示论坛:编写:shifang日期:2009.5修改:无内容:按配套遥控器按键,液晶显示4组码值,分别是用户码用户码数据码数据反码显示如下:Code:1E-1E-00-FF------------------------------------------------*/#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义#include"1602.h"#include"delay.h"sbit IR=P3^3; //红外接口标志char code Tab[16]="0123456789ABCDEF";/*------------------------------------------------全局变量声明------------------------------------------------*/unsigned char irtime; //红外用全局变量bit irpro_ok,irok; //irpro_ok处理完成标志,接收好了,unsigned char IRcord[4]; //储存4个红外码的四个字节unsigned char irdata[33]; //储存32+1位unsigned char TempData[16]; //定义零时数据/*------------------------------------------------定时器0中断处理------------------------------------------------*/void tim0_isr (void) interrupt 1 using 1{irtime++; //用于计数2个下降沿之间的时间}/*------------------------------------------------外部中断0中断处理------------------------------------------------*/void EX0_ISR (void) interrupt 0 //外部中断0服务函数{static unsigned char i; //接收红外信号处理//static bit startflag=1; //是否开始处理标志位//if(startflag)//{if(irtime>=33&&irtime<63) //引导码TC9012的头码,9ms+4.5msi=0;irdata[i]=irtime; //存储每个电平的持续时间,用于以后判断是0还是1irtime=0;i++;if(i==33){irok=1;i=0;}/*}else{irtime=0;startflag=1;} */}/*------------------------------------------------定时器0初始化------------------------------------------------*/void TIM0init(void)//定时器0初始化{TMOD=0x02;//定时器0工作方式2,TH0是重装值,TL0是初值TH0=0x00; //重载值TL0=0x00; //初始化值ET0=1; //开中断TR0=1; //计时开始}/*------------------------------------------------外部中断0初始化------------------------------------------------*/void EX0init(void){IT0 = 1; //指定外部中断0下降沿触发,INT0 (P3.2)EX0 = 1; //使能外部中断EA = 1; //开总中断}/*------------------------------------------------键值处理------------------------------------------------*/void Ir_work(void){TempData[0] = Tab[IRcord[0]/16]; //处理客户码十六进制高位TempData[1] = Tab[IRcord[0]%16]; //十六进制低位TempData[2] = '-';TempData[3] = Tab[IRcord[1]/16]; //处理客户码TempData[4] = Tab[IRcord[1]%16];TempData[5] = '-';TempData[6] = Tab[IRcord[2]/16]; //处理数据码TempData[7] = Tab[IRcord[2]%16];TempData[8] = '-';TempData[9] = Tab[IRcord[3]/16]; //处理数据反码TempData[10] = Tab[IRcord[3]%16];LCD_Write_String(5,1,TempData);irpro_ok=0;//处理完成标志}/*------------------------------------------------红外码值处理------------------------------------------------*/void Ircordpro(void)//红外码值处理函数{unsigned char i, j, k;unsigned char cord,value;k=1;for(i=0;i<4;i++) //处理4个字节{for(j=1;j<=8;j++) //处理1个字节8位{cord=irdata[k]; //此处去除头码故从一开始if(cord>7) //大于某值为1,这个和晶振有绝对关系,这里使用12M计算,此值可以有一定误差value|=0x80; //2.25>256X7>1.125msif(j<8){value>>=1; //数据串行发送,低位(bit0)在前,高位(bit7)在后}k++;}IRcord[i]=value;value=0;}irpro_ok=1;//处理完毕标志位置1}/*------------------------------------------------主函数------------------------------------------------*/void main(void){EX0init(); //初始化外部中断TIM0init(); //初始化定时器LCD_Init(); //初始化液晶DelayMs(20); //延时有助于稳定LCD_Clear(); //清屏LCD_Write_String(0,0,"");LCD_Write_String(0,1,"Code:");while(1)//主循环{if(irok) //如果接收好了进行红外处理{Ircordpro(); //红外码处理irok=0;}if(irpro_ok) //如果处理好后进行工作处理,如按对应的按键后显示对应的数字等{Ir_work();}}}。
电子电路综合设计总结报告题目:红外遥控器信号接收和显示的设计(设计选题十四)姓名:班级:学号:成绩:摘要:随着电子技术的发展,红外遥控器越来越多的应用到电器设备中,但各种型号遥控器的大量使用带来的遥控器大批量多品种的生产,使得检测成为难题,因此智能的红外遥控器检测装置成为一种迫切的需要。
在该红外遥控器信号的接收和显示电路以单片机和一体化红外接收器为核心技术,具体由单片机最小系统、单片机与PC机间的通信模块、红外接收模块、数码管显示模块和流水灯模块组成。
在本系统的设计中,利用红外接收器接收遥控器发出的控制信号,并通过软件编程将接收信号存储、处理、比较,并将数据处理送至数码管显示模块。
总之,通过对电路的设计和实际调试,可以实现红外遥控器信号的接收与显示功能。
根据比较接收信号的不同,在数码管显示电路及流水灯电路上显示相应的按键数字或闪烁变化功能,并可实现单片机及PC机之间的通信功能,使得控制信号能在PC机上显示。
关键词:单片机红外接收器HS0038 解码串口调试设计任务结合单片机最小电路和红外线接收接口电路共同设计一个基于单片机的红外遥控信号接收与转发系统,用普通电视机遥控器控制该系统,使用数码管显示信号的接收结果。
1、实现单片机最小系统的设计。
2、当遥控器按下数字键时,在数码管上显示其键值。
如按下数字键1,则在数码管上显示号码01。
3、当遥控器按下音量△及音量▽时,用两位数码的周围段实现顺时针或者逆时针旋转的流水灯功能。
(为使得音量的增减清晰显示,试验中在单片机的P1口外接一排流水灯,具体功能的实现见方案的可行性论证)* 运用串口调试助手,在遥控器有按键按下时,将其键值显示在PC机上。
* 当遥控器按下频道△及频道▽时,在数码管上显示加1或减1后的数值。
一、系统方案比较与论证1、方案比较与选择为了实现系统整体功能,红外解码部分是核心,红外解码是指将遥控发射器所产生的红外遥控编码脉冲所对应的键值翻译出来的过程。
引言随着远程教育系统的不断发展和日趋完善,利用多媒体作为教学手段在各级各类学校都得到了广泛应用。
近年来,在多媒体教学系统的使用、开发和研制中,经常遇到同时使用多种设备,如:数字投影机、DVD、VCD、录像机、电视机等,由于各种设备都自带遥控器,而且不同的设备所遵循的红外传输规约也不尽相同,操纵这些设备得使用多种遥控器,给使用者带来了诸多不便。
本次毕业设计的主题就是红外遥控电路设计。
红外遥控的特点是利用红外线进行点对点通信的技术,不影响周边环境,不干扰其他电器设备。
室内近距离(小于10米),信号无干扰、传输准确度高、体积小、功率低的特点,遥控中得到了广泛的应用。
通过基于单片机的控制指令来对多种设备进行远程控制,可以选择不同的按键来控制不同的设备。
从而方便快捷的实现远程控制。
常用的红外遥控系统一般分发射和接收两个部分。
发射部分的主要元件为红外发光二极管。
它实际上是一只特殊的发光二极管;由于其内部材料不同于普通发光二极管,因而在其两端施加一定电压时,它便发出的是红外线而不是可见光。
红外发光二极管一般有黑色、深蓝、透明三种颜色。
判断红外发光二极管好坏的办法与判断普通二极管一样;用万用表电阻挡量一下红外发光二极管的正、反向电阻即可。
红外发光二极管的发光效率要用专门的仪器才能精确测定,而业余条件下只能用拉锯法来粗略判判定。
接收部分的红外接收管是一种光敏二极管。
在实际应用中要给红外接收二极管加反向偏压,它才能正常工作,亦即红外接收二极管在电路中应用时是反向运用,这样才能获得较高的灵敏度。
红外发光二极管一般有圆形和方形两种。
由于红外发光二极管的发射功率一般都较小,所以红外接收二极管接收到的信号比较微弱,因此就要增加高增益放大电路。
最近几年不论是业余制作还是正式产品,大多都采用成品红外接收头。
成品红外接收头的封装大致有两种:一种采用铁皮屏蔽;一种是塑料封装。
均有三只引脚,即电源正(VDD)、电源负(GND)和数据输出(VO或OUT)。
简易红外遥控系统北京邮电大学电子信息科学与技术专业课题实验姓名:周渡学号:**********班级:2013211203组别: 第5组时间:2016.7.6目录一、设计要求.............................................................................................................................. - 1 -1.任务:设计并制作红外遥控发射机和接收机。
........................................................... - 1 -2.基本要求:....................................................................................................................... - 1 -二、实验原理.............................................................................................................................. - 1 -1.发射部分设计框图........................................................................................................... - 1 -2.接收部分设计框图........................................................................................................... - 2 -三、实验电路图设计与实现...................................................................................................... - 3 -1.信号的产生与编码........................................................................................................... - 3 -2.调制发送........................................................................................................................... - 8 -3.接收解调......................................................................................................................... - 12 -4.LED分别显示................................................................................................................ - 15 -5.LED8级亮度显示.......................................................................................................... - 17 -6.数码管显示..................................................................................................................... - 18 -四、发射和接收连接总图........................................................................................................ - 20 -1.发射端电路图................................................................................................................. - 20 -2.接收端电路图................................................................................................................ - 20 -五、遇到的问题及解决方法............................................................................................ - 21 -六、实验心得.................................................................................................................... - 21 -附录:器件选用与参数计算.................................................................................................... - 23 -一、设计要求1.任务:设计并制作红外遥控发射机和接收机。
基于STC89C54单片机设计的红外解码数码管显示1.红外解码原理红外遥控器发送数据时,是将二进制数据调制成一系列的脉冲信号红外发射管发射出去,红外载波为频率38KHz的方波,红外接收端在收到38KHz的载波信号时,会输出低电平,否则输出高电平,从而可以将“时断时续”的红外光信号解调成一定周期的连续方波信号,再经过1838一体化红外接收头解调便可以恢复出原数据信号。
如图所示,我们可以通过单片机的定时器给红外接收管接收的每个点电平计时,并把每个点电平的时间存起来。
根据时间的不同来分辨是引导码、“0”还是“1”。
下面是我做的实验原理图上图式数码管显示原理图,下面是红外接收管与单片机的连接原理图。
注:上图的J27是和单片机的P3^2相连的。
程序中用到的定时器1、定时器0和外部中断0.下面是实验的C语言程序:/*-----------------------------------------------名称:遥控器红外解码数码管晶显示论坛:无编写:yang-baoan日期:2011.10修改:无内容:按配套遥控器按键,液晶显示4组码值,分别是用户码用户码数据码数据反码显示如下:1E1E00FF------------------------------------------------*/#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义sbit IR=P3^2; //红外接口标志#define DataPort P0 //定义数据端口程序中遇到DataPort 则用P0 替换sbit LATCH1=P2^2;//定义锁存使能端口段锁存sbit LATCH2=P2^3;// 位锁存unsigned char Tab[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};unsigned char TempWei[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};/*------------------------------------------------全局变量声明------------------------------------------------*/unsigned char irtime;//红外用全局变量bit irpro_ok,irok;unsigned char IRcord[4];unsigned char irdata[33];unsigned char TempData[8];/*------------------------------------------------函数声明------------------------------------------------*/void Ir_work(void);void Ircordpro(void);void Display(unsigned char FirstBit,unsigned char Num);/*------------------------------------------------定时器0中断处理------------------------------------------------*/void tim0_isr (void) interrupt 1 using 1 //using表示工作寄存器,后跟0—3个数分别表示工作寄存器组{irtime++; //用于计数2个下降沿之间的时间}/*------------------------------------------------外部中断0中断处理------------------------------------------------*/void EX0_ISR (void) interrupt 0 //外部中断0服务函数{static unsigned char i; //接收红外信号处理static bit startflag; //是否开始处理标志位if(startflag){if(irtime<63&&irtime>=33)//引导码TC9012的头码,9ms+4.5ms,此if语句只对下一条语句起作用i=0;irdata[i]=irtime;//存储每个电平的持续时间,用于以后判断是0还是1irtime=0;i++;if(i==33){irok=1;i=0;}}else{irtime=0;startflag=1;}}/*------------------------------------------------定时器0初始化------------------------------------------------*/void TIM0init(void)//定时器0初始化{TMOD|=0x02;//定时器0工作方式2,TH0是重装值,TL0是初值TH0=0x00; //重载值TL0=0x00; //初始化值ET0=1; //开中断TR0=1;}/*------------------------------------------------外部中断0初始化------------------------------------------------*/void EX0init(void){IT0 = 1; //指定外部中断0下降沿触发,INT0 (P3.2)EX0 = 1; //使能外部中断EA = 1; //开总中断}/*------------------------------------------------定时器1初始化------------------------------------------------*/void Init_Timer0(void){TMOD |= 0x10; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响TH1=(65536-2000)/256; //给定初值TL1=(65536-2000)%256;EA=1; //总中断打开ET1=1; //定时器中断打开TR1=1; //定时器开关打开}/*------------------------------------------------定时器1中断子程序------------------------------------------------*/void Timer0_isr(void) interrupt 3{TH1=(65536-2000)/256; //重新赋值2ms TL1=(65536-2000)%256;Display(0,8); // 调用数码管扫描}/*-----------------------------------------------------------数码管显示函数,动态扫描-----------------------------------------------------------*/void Display(unsigned char FirstBit,unsigned char Num) {static unsigned char i=0;DataPort=0; //清空数据,防止有交替重影LATCH1=1; //段锁存LATCH1=0;DataPort=TempWei[i+FirstBit]; //取位码LATCH2=1; //位锁存LATCH2=0;DataPort=TempData[i]; //取显示数据,段码LATCH1=1; //段锁存LATCH1=0;i++;if(i==Num)i=0;}/*------------------------------------------------键值处理------------------------------------------------*/void Ir_work(void){unsigned int t=200;TempData[0] = Tab[IRcord[0]/16];TempData[1] = Tab[IRcord[0]%16];TempData[2] = Tab[IRcord[1]/16];TempData[3] = Tab[IRcord[1]%16];TempData[4] = Tab[IRcord[2]/16];TempData[5] = Tab[IRcord[2]%16];TempData[6] = Tab[IRcord[3]/16];TempData[7] = Tab[IRcord[3]%16];irpro_ok=0;//处理完成标志}/*------------------------------------------------红外码值处理------------------------------------------------*/void Ircordpro(void)//红外码值处理函数{unsigned char i, j, k;unsigned char cord,value;k=1;for(i=0;i<4;i++) //处理4个字节{for(j=1;j<=8;j++) //处理1个字节8位{cord=irdata[k];if(cord>8)//大于某值为1,这个和晶振有绝对关系,这里使用12M计算,此值可以有一定误差value|=0x80;if(j<8){value>>=1;}k++;}IRcord[i]=value;value=0;}irpro_ok=1;//处理完毕标志位置1}/*------------------------------------------------延时函数,含有输入参数unsigned int t,无返回值unsigned int 是定义无符号整形变量,其值的范围是0~65535------------------------------------------------*//*------------------------------------------------主函数------------------------------------------------*/void main(void){EX0init(); //初始化外部中断TIM0init(); //初始化定时器Init_Timer0();while(1)//主循环{if(irok) //如果接收好了进行红外处理{Ircordpro();irok=0;}if(irpro_ok) //如果处理好后进行工作处理,如按对应的按键后显示对应的数字等{Ir_work();}}}。