红外解码数码管显示
基于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();}}}。
红外解码管数码管显示 (用户码和数据码)
基于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();}}}。
cv 单片机红外遥控c程序
RELAY=1; //继电器关闭
Display();
}
}
/********以下是外中断0函数********/
void IR_decode() interrupt 0
{
EX0=1; //开外中断0
return; //0.14ms计数过长则返回
}
}
IR_buf[j]=IR_buf[j] >> 1; //若计数小于6,数据最高位补"0",说明收到的是"0"
/********以下是延时函数********/
void Delay_ms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--) //i=xms即延时约xms毫秒
for(j=110;j>0;j--);
}
/*********以下是蜂鸣器响一声函数********/
if (count>=6) {IR_buf[j] = IR_buf[j] | 0x80;} //若计数大于等于6,数据最高位补"1",说明收到的是"1"
count=0; //计数器清0
}
}
if (IR_buf[2]!=~IR_buf[3]) //将键数据反码取反后与键数据码码比较,若不等,表示接收数据错误,放弃
// IR_buf[2]、IR_buf[3]为键数据码和键数据码反码接收缓冲区
uchar disp_buf[2]={0x10,0x10}; //显示缓冲单元,初值为0x10(即16),指向显示码的第16个"-"
红外解码显示键值
break;
case 90:
k = 6;
break;
case 66:
k = 7;
break;
case 82:
k = 8;
break;
case 74:
k = 9;
break;
}
{
delay (1);
}
while (!IRIN) //等 IR 变为高电平
{
delay (1);
}
while (IRIN) //计算IR高电平时长
{
delay (1);
N++;
if (N >= 30)
void IRinit (void);
uchar distemp [5];
uchar k;
void IRinit (void)
{
IE = 0x81; // 允许总中断中断,使能INT1外部中断
TCON = 0x01; //触发方式为脉冲负边沿触发
IRIN = 1; //I/O口初始化
distemp[1] = table1[Num % 1000 / 100];
distemp[2] = table1[Num % 100 / 10]; //十位
distemp[3] = table1[Num % 10]; //个位
for(i=0; i<4; i++)
case 0x74:
k = 9;
break;
}
P0 = table1[k];
P1 = 0xf0; */
}
}
{
EX0 = 1;
遥控器红外解码数码管显示
{
irtime++; //用于计数2个下降沿之间的时间
}
/*------------------------------------------------
外部中断0中断处理
------------------------------------------------*/
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
sbit IR=P3^2; //红外接口标志
#define DataPort P0 //定义数据端口程序中遇到DataPort则用P0替换
sbit LATCH1=P2^2;//定义锁存使能端口段锁存
{
for(j=1;j<=8;j++) //处理1个字节8位
{
cord=irdata[k];
if(cord>7)//大于某值为1,这个和晶振有绝对关系,这里使用12M计算,此值可以有一定误差
value|=0x80;
if(j<8)
{
value>>=1;
}
k++;
}
IRcord[i]=value;
value=0;
}
irpro_ok=1;//处理完毕标志位置1
}
/*------------------------------------------------
主函数
------------------------------------------------*/
void main(void)
红外解码程序
红外解码程序本篇介绍红外解码的原理和程序的写法。
下面来看一下,红外线是如何编码的。
下面来具体说一下,解码的原理,每按一下遥控器的一个按键,遥控器就会发出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进制数分离,便于数码管显示,分离完毕后显示。
15-红外遥控数码管
DIY一个遥控作品
• 通过这个遥控项目,DIY一个你的遥控作品吧!比如简单的
会动的小人,结合我们前面的舵机,通过遥控器上不同的按 键,让舵机转动不同的角度,感觉随你的控制转动,发挥你 的想象做出更多Arduino作品吧!
• 根据二极管连接方式的不同,数码管有共阴和
共阳两种,我们这里用的是共阳数码管。
• Arduino需要8个管脚来控制数码管。
所需元件
倒数计数器的硬件连接
倒数计数器的软件编写
• 加载程序文件Lesson15_0,里面已经为你预先写好了一些函
数。你能看懂他们的功能吗?
• 看懂后,倒数计数器的编写就显得很方便了!
第15课· 红外遥控数码管
傅骞 博士 FREDQIAN@
本课目录
目标:完成红外遥控数码管的开发
• 现实中的倒数计数器 • 认识一下数码管 • 倒数计数器的硬件连接 • 倒数计数器的软件编写 • 红外遥控数码管的硬件连接 • 红外遥控数码管的软件编写-初级版 • 红外遥控数码管的软件编写-进阶版 • DIY一个遥控作品
如何设计一个遥控显示计数系统?
• 加入遥控器 • 通过读取编码来显示
所需元件
红外遥控数码管的硬件连接
红外遥控数码管的软件编写-1
• 上述代码同样基于Lesson15_0的库函数编写,实现的功能是
红外遥控显示数字0~9
• 如何加入控制数字“增”和“减”的功能?
红外遥控数码管的软件编写-2
• 这里给出的是控制“增”的部分,你能类比着编写出控制减
现实中的倒数计数器
• 为了体现紧张的范围,倒数计数在现实中非常也会设计成倒数计时器
认识一下数码管
• 在电子世界中,常用数码管来显示数字。 • 数码管是一种非常普遍的显示器件,从本质上
51单片机实验报告
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。
