基于单片机的红外解码数码管显示

合集下载

基于单片机的红外遥控解码器设计

基于单片机的红外遥控解码器设计

毕业论文(设计)论文(设计)题目:基于单片机的红外遥控解码器设计所属系别信息工程系专业班级 10大专电子信息工程技术2班姓 名学 号指导教师撰写日期 2013 年 4月本设计是一种以单片机和一体化红外接收器为核心,由单片机最小系统、通信模块、红外接收模块和液晶显示模块组成。

通过红外遥控接收头HS0038将光信号转变成电信号,经放大、解调、滤波后,将遥控脉冲波形送入单片机AT89S52中,利用相应的硬件滤波功能和软件滤波算法,对的输出信号进行信号识别、解码的实时动态处理,得到红外遥控器相应按键键码,单片机将得到的数据送入显示驱动电路,再通过LCD1602更直观的显示出来,实现单片机的红外解码。

经过解码后,可以将多种遥控器进行合成,实现一个遥控器控制多台电器设备。

即减少了遥控器的数量,同时又增强了遥控器的功能。

通过对电路的设计和实际调试,可以在液晶显示模块显示出来红外源码,从而验证了本设计是可行的。

关键词:AT89S52,红外接收HS0038,红外解码The design is a microcontroller and integrated infrared receiver as the core, from the smallest single-chip system, the communication module, the infrared receiving module and liquid crystal display module. Receiving head HS0038 the light signal is converted into electric signal through the infrared remote control, after amplification, demodulation, filtering, remote control pulse waveform into the SCM AT89S52, using the corresponding hardware filter and software filtering algorithm, the output signal of the signal recognition, real-time dynamic processing of infrared remote control decoding, obtained the corresponding key code, SCM will get data into the display driving circuit, and then through the LCD1602 display, infrared decoder chip. After decoding, can be a variety of remote controller synthesis, the realization of a remote control a plurality of electric equipment. Namely, reducing the number of remote control, and strengthen the function of the remote controller. Through the circuit design and debugging, in the liquid crystal display module display infrared source, which verified the design is feasible. Keywords: AT89S52, infrared receiver HS0038, infrared decoder1 引言 (1)2 总体设计方案 (1)2.1 方案论证 (1)2.2 总体设计框图 (1)3硬件电路设计 (2)3.1 单片机及其硬件电路设计 (2)3.1.1 单片机的介绍 (2)3.1.2 时钟电路及RC复位电路 (3)3.2 红外遥控器电路设计 (4)3.2.1 TC9012芯片介绍 (4)3.2.2 红外发射电路 (5)3.2.3 红外接收电路的设计 (7)3.3 1602液晶显示电路 (8)3.3.1 引脚功能说明 (9)3.3.2 指令说明 (9)4程序设计 (10)4.1 红外接收电路主程序流程图 (10)4.2 红外接收电路子程序流程图 (10)5结果分析与讨论 (12)5.1 测试仪器 (12)5.2 硬件调试的方法和过程 (12)5.3 软件调试问题及解决方法 (12)6总结 (13)参考文献: (14)致谢 (15)附录1: 系统电路原理仿真图 (16)附录2: 系统电路实物图 (17)附录3: 程序 (18)1 引言随着电子技术的发展,红外遥控器越来越多的应用到电器设备中,比如电视机、DVD机、空调、机顶盒甚至音响、热水器等都用到遥控器,而这些红外遥控器都是针对各自产品所设计的,从而导致了一般家庭中拥有数个遥控器,那么,能否将这些遥控器的功能进行复用,进而减少遥控器的数量,使遥控器的功能更加强大,就显得十分必要了。

基于单片机模拟红外编码解码的设计

基于单片机模拟红外编码解码的设计

开放实验报告课题名称基于单片机的红外解码器的设计学生姓名系、年级专业信息工程系、11、12级电子信息工程指导教师江世明2014年 5 月20日基于单片机的红外解码器的设计一.实验目的1、了解红外编码原理,模拟红外发射信号;2、用程序实现红外编码的解码;二.实验内容设计基于单片机的红外解码器,实现红外遥控信号智能解码,要求制作出实物,实现解码功能。

三.电路设计1、红外编码原理在实际应用中红外编码将二进制码调制到38MHz的载波频率上,通过在空中传播,由红外接收头接收之后,由内部的解调电路进行解调, 解调出来的就是我们发送的那些二进制码。

红外编码方式根据日本NEC 协议编码。

每次发送四个字节:用户码,用户反码,数据码,数据反码。

数据 0和 1的区别通常体现在高低电平的时间长短上。

一次按键首先发送9ms的低电平和4.5ms的高电平的引导码。

实际生活中,用遥控器发出的信号与上面的信号是相反的,经过红外线接收头解码以后就和上图一样了,值得大家注意的是发射模块的芯片不同,引导区的时间和数据都有所不同,但解决的方法都是一样的。

引导码后就是用户码。

但是怎么来区分0和1呢?前面我们提到了PWM(脉宽调制)。

根据脉冲的宽度来区别0和1.0.56ms低电平之后接0.56ms高电平为0,接1.12ms高电平为1.2、红外解码方法在实际生活中红外解码一般由红外接收头接收并解码。

解码时先跳过9ms 高电平和4.5ms的低电平,然后跳过0.56ms的低电平,最后通过循环等待搞电平的结束并计时。

通过判断高电平时间的长短来区分0(0.56ms)和1(1.12ms)。

最后判断接收到的四个字节(用户码,用户反码,数据码,数据反码)中数据码和取反后的数据反码相不相等。

3、红外编解码电路四、程序设计见附录五、系统仿真仿真分析:仿真照片如上图,当从4*4键盘按下K5时,单片机U1的数码管显示5,同时P3.0发送出如下图所示的脉冲。

上图包含了9ms高电平和4.5ms低电平的引导码和4字节(32位)的信息码,包括用户码(00000000),用户反码(11111111),数据码(00001001),数据反码(11110110)。

红外解码管数码管显示 (用户码和数据码)

红外解码管数码管显示 (用户码和数据码)

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

红外遥控解码数码管显示实验

红外遥控解码数码管显示实验
IRCOM[6]=IRCOM[6]+0x37;
}
else
IRCOM[6]=IRCOM[6]+0x30;
q= (((IRCOM[6]&0x0f)<<4) + (IRCOM[5]&0x0f));
switch(q) //判断按键键码值
{
case 0x16:m=0;break; //串口发送0
/*预处理命令*/
#include<reg52.h> //包含单片机寄存器的头文件
#include<intrins.h> //包含_nop_()函数定义的头文件
#define uchar unsigned char
#define uint unsigned int
#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
{delay(1);}
while (!IRIN) //等 IR 变为高电平
delay(1);
while (IRIN) //计算IR高电平时长
{
delay(1);
N++;
if (N>=30)
while (!IRIN) //等IR变为高电平,跳过9ms的前导低电平信号。
delay(1);
for (j=0;j<4;j++) //收集四组数据
{
for (k=0;k<8;k++) //每组数据有8位
{
while (IRIN) //等 IR 变为低电平,跳过4.5ms的前导高电平信号。

基于单片机的红外解码.温度及液晶显示

基于单片机的红外解码.温度及液晶显示

中国矿业大学徐海学院技能考核培训姓名:顾嘉诚学号: 22110818专业:信息11-2班题目:基于单片机的红外解码.温度及液晶显示专题:红外解码指导教师:宥鹏老师翟晓东老师设计地点:电工电子实验室时间: 2014 年 4 月通信系统综合设计训练任务书学生姓名顾嘉诚专业年级信息11-2班学号22110818设计日期:2014年4 月5日至2014 年4 月10 日同组成员:姜怀修,刘剑桥,顾嘉诚,彭传锁,何子豪,王业飞设计题目:基于单片机的红外无线控制设计专题题目:红外解码设计主要内容和要求:1.主要内容:2.单片机内部结构红外遥控解码C语言程序设Ds18b20的使用Lcd1602的使用2. 功能扩展要求环境温度液晶显示指导教师签字:目录正文 (5)1.概述 (5)1.1功能描述 (5)1.2单片机资源 (5)2.1管脚图 (5)3.1. 使用资源 (5)2.原理篇 (6)2.1红外发送及接收 (6)2.1.1红外接收概述 (6)2.1.2硬件及原理图 (7)2.1.3红外中断接收部分程序 (8)2.2温度原理 (9)2.2.1 DS18B20 的主要特性 (9)2.2.2原理图与硬件 (10)2.2.3 DS18B20时序和程序 (10)2.3 QC1602A (12)2.3.1 1602外部结构及管脚说明 (12)2.3.2 写命令/数据时序与部分程序 (13)3.效果图 (15)4.软件篇 (15)4.1程序框图 (15)4.1.1 Main函数 (15)4.1.2 中断 (16)4.1.3 60ms定时中断 (16)4.2 完整程序 (16)4.2.1 Project.c文件 (16)4.2.2 onewire.c 文件 (23)5.参考文献 (26)技能考核培训摘要:利用单片机所学内容进行拓展,我们实现了基于单片机的红外解码.温度及液晶显示。

Lcd液晶显示实时环境温度和接收显示红外遥控器的键值,在收到红外信号时会用蜂鸣器作为反馈,以提醒红外一体接收头有接到信号。

基于51单片机的MLX90614红外测温源程序

基于51单片机的MLX90614红外测温源程序
#define TObjMinAddr 0x01 //测量范围下限设定
#define PWMCtrlAddr 0x02 //PWM 设定
#define TaRangeAddr 0x03 //环境温度设定
//************数据定义****************************************************
bdata uchar flag1; //可位寻址数据
sbit bit_out=flag1^7;
//设置显示模式******* 0x08+ *********************************************
#define LCD_SHOW 0x04 //显示开
#define LCD_HIDE 0x00 //显示关
#define LCD_AC_DOWN 0x00 //默认光标左移 AC-
#define LCD_MOVE 0x01 //画面可平移
#define LCD_NO_MOVE 0x00 //默认 画面不移动
#define LCD_CURSOR 0x02 //显示光标
#define LCD_NO_CURSOR 0x00 //无光标
#define LCD_FLASH 0x01 //光标闪动
#define LCD_DATA 1 // 数据
#define LCD_CLEAR_SCREEN 0x01 // 清屏
#define LCD_HOMING 0x02 // 光标返回原点
基于51单片机的MLX90614红外测温源程序如下:
//-------------------------------------------------------------------------

基于51单片机的NEC红外解码

基于51单片机的NEC红外解码

NEC编码
硬件
红外OUT脚接到了单片机P3^3中断接口
程序流程图
38K载波信号
HS0038
矩形波信号
单片机中断接口
中断计数+1,数据位移,低位 置0
地址储存 所有数据清零
错误,引导标志置0,时间置0, 中断置0
2 时间0 是否为0、1、2
中断计数 /时间清零
错误数据清零
void wrong() {
int_times = 0; tmr_times = 0; head_ok = 0; code_data = 0; lanth = 0; flagf = 0; }
LCD1602显示
void LCD1602_init(void) {
Delay1602(1500); //调用延时函数 LCD1602_Write_com(0x38); //8位数据总线,两行显示模式,5*7点阵显示 Delay1602(500); //调用延时函数 LCD1602_Write_com(0x38); //8位数据总线,两行显示模式,5*7点阵显示 Delay1602(500); //调用延时函数 LCD1602_Write_com(0x38); //8位数据总线,两行显示模式,5*7点阵显示 LCD1602_Write_com_busy(0x38); //8位数据总线,两行显示模式,5*7点阵显示 LCD1602_Write_com_busy(0x08); //显示功能关,无光标 LCD1602_Write_com_busy(0x01); //清屏 LCD1602_Write_com_busy(0x06); //写入新的数据后,光标右移,显示屏不移动 LCD1602_Write_com_busy(0x0C); //显示功能开,无光标 }

基于单片机的红外热释电报警系统程序

基于单片机的红外热释电报警系统程序

#include<reg52.h>#define uchar unsigned char#define uint unsigned intsbit wei=P2^4;sbit wei1=P2^5;sbit beep = P2^0;sbit sensor = P0^7;sbit sensor1= P0^6;uchar flag1; //定义全局变量,作为信号检测标志位uchar flag;void chuankou(uchar temp) //与上位机通信,波特率为1200bit/s { uchar table1[]={1,2};uchar m;PCON=0x00;SCON=0x50;TMOD=0x20;TH1=0xE6;TL1=0xE6;TR1=1;for(m=0;m<2;m++){SBUF=table1[temp];while(TI==0);TI=0;}}void delay(uint t){while(t--);}void Test_Voltage(void){if(sensor ==0&sensor1== 1){delay(10000); //延时50毫秒信号确定if(sensor == 0){flag1 = 1; //检测到信号}else{flag1 = 0;}}else{flag1=0;}}void action(void){if(flag1 ==1){wei=0xfe;P0 = 0X25; //数码管显示【2】beep = 0; //检测到信号后,蜂鸣器发出"滴答"声chuankou(1);delay(10000);beep = 1;delay(10000);wei=0xfd;}else{wei=0;P0 = 0X03; //数码管显示【0】}}void Test_Voltage1(void){if(sensor1 ==0&sensor==1){ delay(10000); //延时50毫秒信号确定if(sensor1 == 0){flag = 1; //检测到信号}else{flag= 0;}}else{flag= 0;}}void action1(void){ if(flag ==1){wei1=0xfe;P0= 0X9f; //数码管显示【1】beep =0; //检测到信号后,蜂鸣器发出"滴答"声chuankou(0);delay(10000);beep =1;delay(10000);wei1=0xfd;}else{wei1=0;P0 = 0X03; //数码管显示【0】}}void main(void){while(1){Test_Voltage();action();Test_Voltage1();action1();}}。

红外解码+lcd显示

红外解码+lcd显示

红外遥控解码+LCD1602显示完全资料【精】2009-2-9 10:03:00点击:458来源:作者:佚名红外遥控解码实验一.实验目的1. 了解红外遥控编码并用单片机捕捉信号及解码2. 熟悉LCD1602的驱动二.红外遥控器编码遥控器编码分好几种,常见的32位编码码和42位编码码,目前我手中遥控器就是42位编码,如图1所示,当有按键时就会产一个9.12ms低电平和4.5ms高电平的起始码,紧接着是26位系统码,此系统码能区别不同的电器设备,防止不同机种遥控码互相干扰,接下来是8位数据码和8位数据反码,间隔23ms的高电平后,再发一个与启始码完全一样的结束码:以脉宽为0.565ms、间隔0.56ms、周期为1.125ms的组合表示二进制的“0”;以脉宽为0.565ms、间隔1.685ms、周期为2.25ms的组合表示二进制的“1”,其波形如图2所示:再回头看图1,大家不难看出,图1是遥控器按键1的一串编码三.硬件连接接收电咱我们使用一化红外接红外接收管1838,不需要任何外接无件,就能完成从红外线接收到输出与TTL电平信号兼容的所有工作,实物如图所示:电路图如下:四.解码以上我们了解了红外遥控的编码及硬件连接,现在就对其进行解码,所谓解码就是能用单片机把以不同宽度的脉冲区别开来,一种比较好思路就是计算两次下降沿间隔时间,当单片机外部中断1口有下降沿时中断一次,并启动定时器,定时器定50us,当下次下降沿到来时我们计算定时器中断的次数,这样我们就能很好的区分不同宽度的脉冲了。

大家可能已经迫不急待的要开始解码了,别急,我们先把注意事项先讲一下,实际上,我们红外接收头收到的信号的是有毛刺的,放大后就如下图,所以在下降沿中断触发后,要做延时去抖处理:*************************************以下是完整解码程序********************************/***********************************************项目:红外遥控解码(EE01学习板演示程序)**作者:一线工人**网站:电子工程师之家**本程序适合42位码遥控器,即26位系统码,16位数据码,如:57L5,55K2,54B4,KD-29,55K8,5Z26A,等型号的遥控器,转贴请保持代码的完整性*********************************************/#include<reg52.h>#define uint unsigned int#define uchar unsigned charsbit ir=P3^3;//红外端口sbit dm=P1^4;//数码管段码控制位sbit wm=P1^5;//数码管位码控制位sbit led_cs=P1^6;//LED控制位sbit rs=P3^5;//1602数据命令选择端sbit en=P3^4;//1602使能信号uchar num;uchar key_code=0;//遥控键值uchar new_code=0;//有无新按键uint buf_key_code=0;//键值暂存uchar key_bit_count=0;//键编码脉冲计数uint count=0;//定时中断次数计数uint buf_count=0;//定时中断计数暂存uchar common_code_count=0;//前导码脉冲计数uchar ir_status=0;//脉冲接收器所处的状态,0:无信号,1:系统码接收区,2:数据编码接收区uchar code table[]="EE01 DEMO:IR";uchar code table1[]="code:";uchar code table2[]={'0','1','2','3','4','5','6','7','8','9',};void delay_10us(unsigned char y)///延时子程序10us{unsigned char x;for(x=y;x>0;x--);}void delay_ms(uint z)//延时子程序1ms{uint x,y;for(x=z;x>0;x--)for(y=113;y>0;y--);}void init(void)/////初始化{ir=1; //红外端口写1led_cs=0; //关闭LEDEA=1; //开总中断TMOD=0x02; //定时器0,模式2,8位自动装载模式TH0=0Xd1; //定时50usTL0=0Xd1;IT1=1; //INT1下降沿触发ET0=1; //允许定时器中断EX1=1; //允许外部中断}/***********************************************定时器中断***********************************************/void time0() interrupt 1///定时器中断{count++;//定时器中断次数累加}/**********************************************外部中断,红外解码程序**********************************************/void int1() interrupt 2///外部中断{TR0=1;//开定时器中断if(count>12&&count<270)//如果信号合法,则放入buf_count,count清0,对下一个脉冲信号计时{buf_count=count;count=0;}delay_10us(10);//延时100us以消除下降沿跳变抖动if(ir==0)//INT1引脚稳定为低电平,则表法确实是信号,count重新计时,因上面延时了50us,故要补偿1次TO中断{count=2;}if(buf_count>12&&buf_count<270)//若收到的信号合法,则再进行信号分析{if(ir_status==0)//如果之前未收到引导码{if(buf_count>210&&buf_count<270)//判断是否引导码13.5ms{ir_status=1;//系统标记buf_count=0;//}}else if(ir_status==1)///收到引导码{if(common_code_count>=25)//若收完26个脉冲{ir_status=2;//数据解码标记common_code_count=0;//系统码计算清零buf_count=0;//中断计数暂存清0}else if((buf_count>40&&buf_count<70)||(buf_count>12&&buf_count<32)){buf_count=0;common_code_count++;//每收到一个信号自加1}}else if(ir_status==2)//进入数据编码接收{if(key_bit_count<8)//收到数据少于8位,则将收到的数据写入buf_key_code{if(buf_count>40&&buf_count<70){buf_count=0;buf_key_code>>=1;buf_key_code|=0x80;//收到1key_bit_count++;//数据脉冲累加}else if(buf_count>12&&buf_count<32)//收到0{buf_count=0;buf_key_code>>=1;//收到0key_bit_count++;}}else //若收完8位数据则做以下处理{ir_status=0;//接收状态返回到空闲key_code=buf_key_code;key_bit_count=0;buf_key_code=0;buf_count=0;TR0=0;new_code=1;}}}}/**********************************************1062驱动程序**********************************************/void wirte_cmd(uchar cmd)//写命令{rs=0;P0=cmd;en=1;delay_ms(5);en=0;}void wirte_data(uchar dat)//写数据{rs=1;P0=dat;en=1;delay_ms(5);en=0;}void wirte_string(const unsigned char *s)//在第二行第5个字开始写字符串{wirte_cmd(0x80+0x40+0x05);while(*s){wirte_data(*s);s++;}}void init_1602()///1602初始化{dm=0;wm=0;led_cs=0;wirte_cmd(0x38);delay_ms(5);wirte_cmd(0x0c);delay_ms(5);wirte_cmd(0x06);}/*************************************主程序*************************************/void main(){init(); ///初始化init_1602(); //1602初始化while(!new_code);//判断是否有新按键,如果有则执行下面程序,没有则一直循环wirte_cmd(0x01);//1602清屏delay_ms(5);wirte_cmd(0x80);//在第一行写入EE01 DEMO:IRfor(num=0;num<12;num++){wirte_data(table[num]);delay_ms(1);}wirte_cmd(0x80+0x40);//在第二行写入code:for(num=0;num<5;num++){wirte_data(table1[num]);delay_ms(1);}if(key_code<10)//如果按鍵小于10则写入相应的数字{wirte_data(table2[key_code]);delay_ms(2);}else if(key_code<50)//大于10则写入字符,与遥控器对应{switch(key_code){case 21:wirte_string("mute");break;case 28:wirte_string("power");break;case 10:wirte_string("-/--");break;case14:wirte_cmd(0x80+0x40+0x05);wirte_data(0x7f);wirte_data(0x7e);break;//先写字符位置,然后写字符,case 25:wirte_string("SLEEP");break;case 19:wirte_string("P.P");break;case 15:wirte_string("TV/AV");break;case 30:wirte_string("VOL-");break;case 31:wirte_string("VOL+");break;case 27:wirte_string("P+");break;case 26:wirte_string("P-");break;case 16:wirte_string("MENU");break;case 24:wirte_string("A-MODE");break;case 13:wirte_string("SYS");break;case 12:wirte_string("GAME");break;case 20:wirte_string("DISP");break;delay_ms(2);}new_code=0;}}。

基于STC单片机的红外解码测试仪设计

基于STC单片机的红外解码测试仪设计

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%;遥控器制造业属于一个发展成熟及竞争激烈的行业,集中度较高。

国内遥控器企业目前大多停留在劳动力密集的代加工状态,受成本限制测试仪器使用率低、生产效率低下。

遥控器红外解码数码管显示

遥控器红外解码数码管显示
void tim0_isr (void) interrupt 1 using 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)

基于单片机的红外遥控器解码器设计

基于单片机的红外遥控器解码器设计

中 图 分 类 号 :TN21
文 献 标 识 码 :A
文 章 编 号 :1672-3791(2010)03(a)-0051-03
1 红外遥控信号发送电路SAA3010T及遥 控信号
1.1 SAA3010 简介 SAA3010是一款红外遥控发射集成电
路,采用CMOS工艺制造,低电压工作,单管 脚的振荡器,双相位发射技术,最大可提供 2048 个 编 码 。一 般 为28P 表 贴 封 装, 管 脚 信 号的功能定义为:KI0~KI3为键盘扫描输 入端,KO0~KO7为键盘扫描驱动管脚,C 0~C3键盘扫描输入,SMS为系统模式选择 输入,MDout为用载波(频率为fc/12,占空 比为33%)调制的码脉冲输出,Dout为合成 码数据输出端,OSC为振荡器输入管脚,T 为测试端,VDD电源正,VSS电源负。
工 程 技 术
科技资讯 2010 NO.06
SCIENCE & TECHNOLOGY INFORMATION
基于单片机的红外遥控器解码器设计
靳光明 ( 绵阳职业技术学院计算机科学系 四川绵阳 6 2 1 0 0 0 )
摘 要:SAA3010T是一种通用型红外遥控信号发送用的集成电路,适用于电视机、组合音响、VCD、DVD、风扇、电玩等设备的遥控操
(1)设外部中断1(接SH506数据输出端) 为 低 电 平 触 发 , 允 许 中 断 。定 时 器 T 0 工 作 于 定时方式2(自动重装在时间常数),定时时 间常数为20us,高优先级中断。
(2)定时器T0的中断服务函数为每20us (1/4位时间)到,T20_c计数器加1。
(3)外部中断1的中断服务函数的算法: ①关闭外部中断,启动T0定时器,清计 数器T20_c。 ②判断第一位起始位是否为1,并丢掉该 位,清计数器T20_c,清接收数据位计数器。 ③接收后面的13位数据的每一位,每 一位的时间1.668ms ④停止定时器,接收的13位数据取反送I RDA_dat,从IRDA_dat中提取5位用户码。 ⑤当第二个起始位为1且用户码为0000 0,表明本帧数据有效,提取6位指令码,否 则行纠错处理。 ⑥等待外部中断1(IRDA)变高,打开外 部中断1。

用单片机解码红外遥控器

用单片机解码红外遥控器

用单片机解码红外遥控器遥控器使用方便,功能多.目前已广泛应用在电视机、VCD、DVD、空调等各种家用电器中,且价格便宜,市场上非常容易买到。

如果能将遥控器上许多的按键解码出来.用作单片机系统的输入.则解决了常规矩阵键盘线路板过大、布线复杂、占用I/O口过多的弊病。

而且通过使用遥控器,操作时可实现人与设备的分离,从而更加方便使用。

下面以TC9012编码芯片的遥控器为例。

谈谈如何用常用的51系统单片机进行遥控的解码。

一、编码格式1、0和1的编码遥控器发射的信号由一串O和1的二进制代码组成.不同的芯片对0和1的编码有所不同。

通常有曼彻斯特编码和脉冲宽度编码。

TC9012的O和1采用PWM方法编码,即脉冲宽度调制,其O码和1码如图1所示(以遥控接收输出的波形为例)。

O码由O.56ms低电平和0.56ms高电平组合而成.脉冲宽度为1.12ms.1码由0.56ms低电平和1.69ms高电平组合而成.脉冲宽度为2.25ms。

在编写解码程序时.通过判断脉冲的宽度,即可得到0或1。

2、按键的编码当我们按下遥控器的按键时,遥控器将发出如图2的一串二进制代码,我们称它为一帧数据。

根据各部分的功能。

可将它们分为5部分,分别为引导码、地址码、地址码、数据码、数据反码。

遥控器发射代码时.均是低位在前。

高位在后。

由图2分析可以得到.引导码高电平为4.5ms,低电平为4.5ms。

当接收到此码时.表示一帧数据的开始。

单片机可以准备接收下面的数据。

地址码由8位二进制组成,共256种.图中地址码重发了一次。

主要是加强遥控器的可靠性.如果两次地址码不相同.则说明本帧数据有错.应丢弃。

不同的设备可以拥有不同的地址码.因此。

同种编码的遥控器只要设置地址码不同,也不会相互干扰。

图中的地址码为十六进制的0EH(注意低位在前)。

在同一个遥控器中.所有按键发出的地址码都是相同的。

数据码为8位,可编码256种状态,代表实际所按下的键。

数据反码是数据码的各位求反,通过比较数据码与数据反码.可判断接收到的数据是否正确。

基于单片机红外线遥控控制_LED灯显示系统设计与制作课程设计

基于单片机红外线遥控控制_LED灯显示系统设计与制作课程设计

单片机与接口技术课程设计题目: 基于单片机红外线遥控控制LED灯显示系统设计与制作班级:电子科学与技术1101姓名:**学号: *********2013年12月11日目录第一章设计要求 (3)第二章硬件系统设计 (3)2.1基于单片机红外线遥控控制LED灯显示系统框架图 (3)2.2单片机控制系统及其基本电路 (4)2. 2.1 单片机最小系统 (4)2.2.2时钟电路 (5)2.2.3复位电路 (5)2.3基于单片机红外遥控控制LED系统的设计原理 (6)2.3.1单片机红外遥控控制LED显示系统原理 (6)2.3.2单片机红外遥控控制LED系统码分制原理 (7)2.4红外遥控发射系统电路设计 (8)2.4.1指令按键电路 (8)2.4.2 发射电路 (9)2.4.3 显示模块 (9)2.5红外遥控接收系统电路设计 (11)2.5.1接收电路 (11)2.5.2 LED灯显示电路 (11)2.6硬件原理图 (12)第三章软件系统设计 (12)3.1 红外线发射电路程序流程图设计 (12)3.2 红外线接收电路程序流程图设计 (13)第四章系统测试与分析 (14)4.1 利用Proteus和keil进行仿真调试 (14)4.2 仿真图 (15)第五章总结 (17)附录1 (18)附录2 (22)参考文献 (25)赣南师范学院 2013 — 2014 学年第_1_学期课程论文行政班级:电子科学与技术1101 学号:110803025 姓名:李婷2.2单片机控制系统及其基本电路2.2.1单片机最小系统单片机晶振电路:对于MSC-51一般的晶振频率可以在1.2MHz—12MHz 之间选择,这是电容C可以对应的选择10pF—30pF。

当使用89C55时晶振频率可以提高到24MHZ。

对于本设计的电容C用30pF,晶振选用11.0592MHz。

晶振电路如下图3-1所示,一条引脚接在XTAL1,另一条接在XTAL2。

基于单片机的红外测温仪设计

基于单片机的红外测温仪设计

摘要设计以单片机作为整个测温仪的核心,结合A/D转换器、液晶显示器等外部设备,在软件设计和硬件设计的基础上,设计出一种拥有汉字显示逻辑判断等智能型电子测温计。

它提供了一种新的温度测量方案,采用红外温度传感器来测量温度信号,可同时测量目标温度和环境温度,并将测量的数据经过放大器,转换器送给单片机处理,之后送数码管显示。

红外测温打破了传统的测温模式,它响应快、测量精度高、可靠性高、范围广,为非接触测量,因而不易损坏。

该温度计以准确快捷的测量功能、清晰易懂的数字化显示方便人们日常生活使用。

关键词:红外测温;单片机;ADC0804;80C510 引言红外测温技术在生产过程中,在产品质量控制和监测,设备在线故障诊断和安全保护以及节约能源等方面发挥了着重要作用。

用红外测温仪进行非接触温度测量有许多的优点,它的运用范围从很小或难以接触到的物体至腐蚀性的化学物和敏感的表面物。

这样那些难以接触到或运动着的物体就可进行温度测量,如传热性能差的或很小的热容量材料。

1 红外基本测温原理红外测温仪中的光学系统汇集其视场内的目标红外辐射能量。

红外能量聚焦在光电探测仪上并转变为相应的电信号。

该信号经过放大器和信号处理电路按照仪器内部的算法和目标发射率校正后转变为被测目标的温度值。

红外线辐射是自然界存在的一种最为广泛的电磁波辐射,它是基于任何物体在常规环境下都会产生自身的分子和原子无规则的运动,并不停地辐射出热红外能量,分子和原子的运动愈剧烈,辐射的能量愈大,反之,辐射的能量愈小。

因此,通过对物体自身辐射的红外能量的测量,便能准确地测定它的表面温度,这就是红外辐射测温所依据的客观基础。

红外测温是利用测量物体所辐射出来的辐射能量来测量物体温度,它的理论依据是斯蒂芬-玻尔兹曼定律,物体的温度越高,它所辐射出来的能量越多。

当温度为T时,物体在所有波长上(物体的辐射几乎包括所有的波长)的总辐射强度W为:式中:δ—斯蒂芬-玻尔兹曼常数;T—物体的绝对温度-单位K;ε—物体表面的法向比辐射率。

51单片机 红外接收数码管显示解码实验

51单片机  红外接收数码管显示解码实验

#include <reg51.h>#define c(x) (x*120000/120000)sbit Ir_Pin=P3^3;//接红外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}; //共阳极数码显示码0-F.unsigned char code Led_Sel[]={0x00,0x01,0x02,0x03};unsigned char Led_Buf[4]; //显示缓冲区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>3) 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=1;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; //显示区设成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[2]&0xf;Led_Buf[1]=(Ir_Buf[2]/16)&0xf;Led_Buf[2]=Ir_Buf[3]&0xf;Led_Buf[3]=(Ir_Buf[3]/16)&0xf; //显示结果P1=Ir_Buf[2];beep=0;delay_50ms(2);beep=1;}while(1);}。

单片机实现红外接收解码

单片机实现红外接收解码

单片机实现红外接收解码摘要:接收到红外遥控器的脉冲波形,并通过解析其波形得到红外遥控器的相应解码,实习对相应设备的控制。

本文详细接受红外遥控技术原理并如何通过C51单片机实现红外遥控。

关键字:单片机,红外遥控,解码1.引言遥控器相信大家不会陌生,日常生活中会使用到各种各样的遥控器,比如电视机、DVD 机、空调、机顶盒甚至音响、热水器等都用到遥控器,其实红外技术已经走进与人们的生活并且与人们的生活息息相关了。

红外遥控器作为设备的输入控制具有操作简便、价格便宜等诸多好处。

您可以根据您公司产品需要和遥控器提供商协商定制遥控器,包括遥控器键盘布局、每个按键的键码等。

遥控器键盘上每个按键的键码是一个小于256的一个数值,按键后通过遥控器红外管产生脉冲发送出去,红外接收器接收到脉冲后,对脉冲流进行分析,提取键码值,并按照键码值实现其遥控目的。

2.红外接收原理红外遥控信号接收:红外接收电路可以使用集成接收器,接收器包括红外接收管及信号处理IC,接收器对外只有三个引脚,一个接电源的Vcc脚、一个接地的GND脚、一个脉冲信号输出脚,当然脉冲信号输出脚直接接单片机的某个可以使用的IO脚就可以了。

3.脉冲波形分析:每次按键,红外接收器这边会收到一串脉冲宽度不等的脉冲波形流,其脉冲流由35个脉冲波形构成:前导码:第1个脉冲波形用户码1:第2到第9个脉冲波形用户码2:第10到第17个脉冲波形键码:第18到第25个脉冲波形键码反码:第26到第33个脉冲波形连续按键脉冲:第34和第35个脉冲为结束脉冲(也即连续按键脉冲),在每次按键结束后会有两个结束脉冲,如果一直按键不放的话,会一直发送连续按键脉冲,并可以认为在收到10个连续按键脉冲后是下一个按键。

注意:不同的遥控器产生的用户码值可能不一样,笔者碰到两种不同的用户码:0x00,0xFF及0x04,0x7F。

脉冲流中有四种不同的脉冲波形宽度:其中前导码脉宽为:40(4ms) < 脉冲宽度< 50(5ms)连续按键脉宽为: 21(2.1ms) < 脉冲宽度 < 25(2.5ms)bit "0" 脉宽为: 3(0.3ms) < 脉冲宽度 < 7(0.7ms)bit "1" 脉宽为: 14(1.4ms) < 脉冲宽度 < 19(1.9ms)在收到一串脉冲流后,就要对其进行分析,先要检测第一个脉冲波形是不是前导码,如果不是,则继续检测前导码,如果是则检测如下32个脉冲波形:用户码1为1字节,由8个脉冲波形组成(其中一个脉冲波形表示字节中1 bit );用户码2为1字节; 键值为1字节;键值反码为1字节,键值反码为键值取反值。

基于C51的红外线解码

基于C51的红外线解码

课题:红外解码课程设计前言传统的遥控器大多数采用了无线电遥控技术,但是随着科技的进步,红外线遥控技术的成熟,红外也成为了一种被广泛应用的通信和遥控手段。

继彩电、录像机之后,在录音机、音响设备、空调机以及玩具等其它小型电器装置上也纷纷采用红外线遥控。

工业设备中,在高压、辐射、有毒气体、粉尘等环境下,采用红外线遥控不仅完全可靠而且能有效地隔离电气干扰。

所以采用单片机进行遥控系统的应用设计,遥控装置将同时具有编程灵活、控制范围广、体积小、功耗低、功能强、成本低、可靠性高等特点,因此采用单片机的红外遥控技术具有广阔的发展前景。

本设计主要研究并设计一个基于单片机的红外接收系统,并实现对电视遥控器的解码及编码值显示。

控制系统主要是由51系列单片机、电源电路、红外遥控器发射、红外接收电路、数码管显示电路等部分组成,红外接收头接收到的编码信息通过单片机处理,单片机根据不同的遥控器按键信息进行处理并在数码管上相应的显示相应的按键值编码信息以加深对红外编码的理解。

第1章红外解码系统分析第1节设计要求整个控制系统的设计要求:被控设备的控制实时反应,从接收信号到信号处理及对设备控制反映时间应小于1s;整个系统的抗干扰能力强,防止误操作;整个系统的安装、操作简单,维护方便;成本低。

红外载波、编码电路设计要求:单片机定时器精确产生38KHz红外载波;根据控制系统要求能对红外控制指令信号精确编码并迅速发送。

红外解码电路设计要求:精确接收红外信号,并对所接收信号进行解码、放大、整形、解调等处理,最后输出信号;对非红外光及边缘红外光抗干扰能力强。

设备扩展模块设计要求:直流控制交流;抗干扰能力强;反应迅速不产生误动作;能承受大电流冲击。

第2节总体设计方案2.1 方案论证(一)单片机控制器模块方案一:采用目前比较通用的51系列单片机。

此单片机的运算能力强,软件编程灵活,自由度大,市场上比较多见价格便宜且技术比较成熟容易实现。

方案二:采用16 位单片机SPCE061A 作为控制核心。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
{
switch(IRcord[2])//判断第三个数码值
{
case 0x0c:DataPort=dofly_DuanMa[1];break;//1显示相应的按键值
case 0x18:DataPort=dofly_DuanMa[2];break;//2
case 0x5e:DataPort=dofly_DuanMa[3];break;//3
ET0=1; //开中断
TR0=1;
}
/*-------------------------
外部中断0初始化
------------------------------------------------*/
void EX0init(void)
{
IT0 = 1; //指定外部中断0下降沿触发,INT0
定时器0初始化
------------------------------------------------*/
void TIM0init(void)//定时器0初始化
{
TMOD=0x02;//定时器0工作方式2,TH0是重装值,TL0是初值
TH0=0x00; //重载值
TL0=0x00; //初始化值
sbit IR=P3^2; //红外接口标志
#define DataPort P0 //定义数据端口程序中遇到DataPort则用P0替换
sbit LATCH1=P2^2;//定义锁存使能端口段锁存11
sbit LATCH2=P2^3;//位锁存
/*------------------------------------------------
}
irpro_ok=1;//处理完毕标志位置1
}
/*------------------------------------------------
主函数
------------------------------------------------*/
void main(void)
{
EX0init(); //初始化外部中断
/*-----------------------------------------------
名称:遥控器红外解码数码管显示
内容:按配套遥控器上1-9会在数码管上对应显示
------------------------------------------------*/
#include<> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
case 0x08:DataPort=dofly_DuanMa[4];break;//4
case 0x1c:DataPort=dofly_DuanMa[5];break;//5
case 0x5a:DataPort=dofly_DuanMa[6];break;//6
case 0x42:DataPort=dofly_DuanMa[7];break;//7
{
Ir_work();
}
}
}
TIM0init();//初始化定时器
DataPort=0xfe; //取位码第一位数码管选通,即二进制1111 1110
LATCH2=1; //位锁存
LATCH2=0;
while(1)//主循环
{
if(irok) //如果接收好了进行红外处理
{
Ircordpro();
irok=0;
}
if(irpro_ok) //如果处理好后进行工作处理,如按对应的按键后显示对应的数字等
i=0;
irdata[i]=irtime;//存储每个电平的持续时间,用于以后判断是0还是1
irtime=0;
i++;
if(i==33)
{
irok=1;
i=0;
}
}
else
{
irtime=0;
startflag=1;
}
}
/*------------------------------------------------
{
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;
void EX0_ISR (void) interrupt 0 //外部中断0服务函数
{
static unsigned char i; //接收红外信号处理
static bit startflag; //是否开始处理标志位
if(startflag)
{
if(irtime<63&&irtime>=33)//引导码TC9012的头码,9ms+
全局变量声明
------------------------------------------------*/
unsigned char code dofly_DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//显示段码值0~9
unsigned char irtime;//红外用全局变量
bit irpro_ok,irok;
unsigned char IRcord[4];
unsigned char irdata[33];
/*------------------------------------------------
函数声明
EX0 = 1; //使能外部中断
EA = 1; //开总中断
}
/*------------------------------------------------
键值处理
------------------------------------------------*/
void Ir_work(void)//红外键值散转程序
红外码值处理
------------------------------------------------*/
void Ircordpro(void)//红外码值处理函数
{
unsigned char i, j, k;
unsigned char cord,value;
k=1;
for(i=0;i<4;i++) //处理4个字节
void tim0_isr (void) interrupt 1 using 1
{
irtime++; //用于计数2个下降沿之间的时间
}
/*------------------------------------------------
外部中断0中断处理
------------------------------------------------*/
------------------------------------------------*/
void Ir_work(void);
void Ircordpro(void);
/*------------------------------------------------
定时器0中断处理
------------------------------------------------*/
case 0x52:DataPort=dofly_DuanMa[8];break;//8
case 0x4a:DataPort=dofly_DuanMa[9];break;//9
default:break;
}
irpro_ok=0;//处理完成标志
}
/*------------------------------------------------
相关文档
最新文档