当前位置:文档之家› 红外解码数码管显示

红外解码数码管显示

基于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();}}}。

相关主题