msp430 红外解码
基于430单片机的红外解码程序
/*红外遥控解码*///将遥控器的码值送至595驱动的数码管显示//P2_0为1838输入//595的驱动没有附上,大家可以自己想办法显示出来#include <msp430f2272.h>#include "hc595.h"#define uchar unsigned char#define uint unsigned int#define c(x) (x*120000/120000)uchartable[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xC6,0xA1, 0x86,0x8E};//共阳数码管uchar table2[]={0x01,0x02,0x04,0x08};uchar Led_Buf[4];//数码显示缓冲区uchar Ir_Buf[4];//储存解码结果uchar Led_index=0;//中断函数内显示之用void delay1(){uint x,y;for(x=100;x>0;x--)for(y=100;y>0;y--);}/*获取低电平时间函数*///////////////////////unsigned int Ir_Get_Low(){uint temp0;TACTL=TASSEL_2+MC_1+ID_3;//时钟来源为SMCLK,8分频,1M,增加模式TACCR0=65500;while(!(P2IN&0X01));//条件是:低电平TACTL&=~MC_3;temp0=TAR;//读取低电平时间TACTL|=TACLR;//TACCR0清零return temp0;}/*获取高电平时间函数*///////////////////////1unsigned int Ir_Get_High(){uint temp1;TACTL=TASSEL_2+MC_1+ID_3;//时钟来源为SMCLK,8分频,1M,增加模式TACCR0=65500;while(P2IN&0X01);//条件是:高电平TACTL&=~MC_3;temp1=TAR;//读取低电平时间TACTL|=TACLR;//TACCR0清零return temp1;}/*系统时钟初始化函数*///////////////////void clock_init(){uchar i;WDTCTL=WDTPW+WDTHOLD;/* BCSCTL1&=~XT2OFF;BCSCTL2|=SELM_2+SELS;//MCLK为8M,SMCLK不分频,8M WDTCTL=WDTPW+WDTHOLD;//关闭看门狗*/BCSCTL1|=XTS;BCSCTL2|=SELM_3+SELS+DIVS_1+DIVM_1;//MCLK为16M,SMCLK8M BCSCTL3|=LFXT1S_2;do{IFG1&=~OFIFG;//清除振荡错误标志for(i=0;i<100;i++)_NOP();}while((IFG1&OFIFG)!=0);IFG1&=~OFIFG;}/*主函数*//////////////////void main(){uchar j,k;uint temp;clock_init(); //时钟初始化hc595_init();//595初始化TBCTL|=TBSSEL_2+MC_1+ID_3+TBCLR;TBCCR0=5000;TBCTL|=TBIE;//P2DIR&=0XFE;//P2_0输入//P2IE|=BIT0;//允许中断//P2IES|=BIT0;//下降沿触发中断_EINT();hc595(0XC0,0x01);while(1){restart:while(P2IN&0X01);temp=Ir_Get_Low();if(temp<c(8000) || temp>c(10000)) continue;//引导脉冲低电平9000temp=Ir_Get_High();if(temp<c(4000) || temp>c(5000)) continue;//引导脉冲高电平4500for(k=0;k<4;k++) //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[k]>>=1;//高电平时间大于1120us,就认为是1,小于则是0if(temp>c(1120)) Ir_Buf[k]|=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;}}3//管脚中断函数#pragma vector=PORT2_VECTOR__interrupt void Port_2(void){P2IFG&=~BIT0;}//定时器A溢出中断函数#pragma vector=TIMERA0_VECTOR__interrupt void Timer_A(void){TACTL&=~TAIFG;}//定时器B溢出中断函数#pragma vector=TIMERB1_VECTOR__interrupt void Timer_B(void){hc595(table[Led_Buf[Led_index]],table2[Led_index]); Led_index++;if(Led_index==4)Led_index=0;TBCTL&=~TBIFG;}。
基于MSP430单片机的红外通讯的实现方法-自动化本科生毕业设计.doc
xx理工大学城市学院本科生毕业设计(论文)学院:电子与自动化学院专业:自动化学生: xxx指导教师:王 xxx完成日期:2014年5月30日xxx理工大学城市学院本科生毕业设计(论文)基于MSP430单片机的红外通讯的实现方法总计毕业设计(论文)43 页表格 2 个插图23 幅摘要红外通讯是利用红外技术实现两点间的近距离保密通信及信息转发。
它一般是由红外发射和接收系统两部分组成。
发射系统对一个红外辐射源进行调制后再发射红外信号,而接收系统是用光学装置和红外探测器进行接收,这样就构成红外通讯系统。
红外通讯技术并不需要实体连线,简单易用而且实现成本较低,因此广泛应用于小型移动设备互换数据和电器设备的控制中,例如笔记本电脑、PDA、移动电话之间或与电脑之间进行数据互换(个人网),电视机、空调的遥控器等。
本文设计了以MSP430单片机为控制核心的红外通讯系统。
在介绍了MSP430单片机的特性、红外发射器、红外接收器的基础上,给出了系统的总体设计方案,并完成了系统的软硬件设计。
在这个控制系统中,第一块MSP430G2553单片机先把准备发送的数据放到UART的寄存器(发送缓冲区)中,然后控制红外发射二极管将数据发送给与第二块MSP430G2553单片机I/O口相连接的红外接收头HS0038,所以当第二块单片机接收到数据的时候就会控制LCD12864将接收到的数据显示出来。
当第二块单片机接收完数据后,还会将接收完毕的信号通过红外发射二极管发送给与第一块单片机I/O接口相连接的红外接收头HS0038,当第一块单片机接收到信号后,控制另一块LCD12864将数据显示出来,如此便实现简单的红外通讯。
最后详细介绍了硬件部分和软件部分的实现方法,并进行软硬件联合调试,初步达到了设计的预期目的。
关键词:MSP430单片机;红外发射;红外接收AbstractInfrared communication is the use of infrared technology to achieve a close secret communication and information between the two forwards.It generally consists of two parts, consisting of an infrared transmitting and receiving system.After a transmitting system for transmitting infrared radiation is modulated infrared signal, and an optical apparatus and a receiving system for receiving an infrared detector, an infrared communication system constituted.Infrared communication technology does not require a physical connection, easy to use and achieve lower costs, which are widely used in the control of small mobile devices swap data and electrical equipment, such as computers or between and among laptops, PDA, mobile phone data interchange (personal area network), TV, air conditioning, remote control, etc.This article is designed to MSP430 microcontroller core infrared communication system.On the basis of the introduction of the MSP430 MCU features an infrared transmitter, infrared receiver, giving the overall design scheme of the system and completed a system of hardware and software design.In this control system,the first one MSP430G2553 first single-chip UART is ready to send data into the register (transmit buffer).Then control the infrared emitting diode sends the data to give a second MSP430G2553 MCU I / O port IR receiver connected HS0038.So when the second block of data is received when the microcontroller will control LCD12864 will receive the data displayed.When finished second microcontroller receives data.Also will receive the complete signal sent by infrared emitting diodes give the first piece of microcontroller I/O interface infrared receiver connected HS0038.When the first piece of the microcontroller receives signals to control another piece of data to be displayed LCD12864.So it simple infraredcommunication.Finally, a detailed description of the implementation of the hardware and software components.And joint commissioning of hardware and software, initially designed to achieve the desired purpose.Keywords: MSP430 microcontroller; infrared emission; infrared receiver目录摘要 (I)Abstract (II)第1章绪论 (1)1.1红外通讯技术的概念 (1)1.2红外通讯技术的特点 (1)1.3红外通讯技术的应用及发展 (2)1.4课题研究的主要内容 (4)1.4.1研究内容 (4)1.4.2论文安排 (4)第2章控制系统方案设计 (5)2.1控制系统实现目标设计 (5)2.2控制系统总体方案设计 (5)2.2.1系统控制器的选择 (5)2.2.2红外发射头和接收头的介绍及选择 (11)2.2.3系统的总体设计 (13)2.3控制系统设计关键 (15)第3章控制系统硬件电路设计 (16)3.1控制系统硬件电路 (16)3.2 MSP430G2553单片机及其最小系统 (17)3.3红外一体化接收头HS0038 (18)3.4 红外通讯系统电路设计 (20)3.5 LCD液晶显示电路 (22)第4章控制系统软件设计 (24)4.1系统软件编程语言选择 (24)4.2编程软件的选择 (25)4.3系统软件设计 (25)4.3.1主程序的功能设计及实现 (25)4.3.2接收编码程序原理 (27)第5章控制系统软硬件调试 (33)5.1系统硬件电路调试 (33)5.1.1硬件电路焊接方法的选择及元器件布局 (33)5.1.2硬件电路焊接技巧及走线方式 (34)5.1.3硬件电路焊接注意事项 (35)5.2系统软件编译 (36)5.2.1系统软件编译环境的介绍 (36)5.2.2创建工程 (37)总结 (41)致谢 (42)参考文献 (43)第1章绪论本章简要介绍红外通讯技术的概念、红外通讯技术的特点、红外通讯技术的应用及发展,以及本次研究的主要内容和论文安排。
基于msp430g2553的红外遥控小车解码控制程序
基于msp430g2553的红外遥控小车解码控制程序//遥控小车最终程序#include#define CPU_F ((double)12000000)//数字控制震荡器1MHZ#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/12000000.0))//延时X微秒#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/12000.0))//延时X毫秒char const redled[8]={0x07,0x00,0x01,0x02,0x03,0x04,0x05,0x06};//led测试版对应的八个灯unsigned char receive[2]={0x00,0x00};//数据码,数据反码unsigned char j=0,k=0,f=0,led=0;//中断次数,receive的元素,,找到按键地址数组的第f个元素int flag=1;//***************************主程序********************//void main(void){WDTCTL=WDTPW+WDTHOLD; //关闭看门狗BCSCTL1=CALBC1_1MHZ; //这两句的作用,基本时钟系统控制,数控震荡控制,将时钟校准1MHZDCOCTL=CALDCO_1MHZ;P1DIR|=BIT0+BIT6+BIT2+BIT3+BIT4;//P1端口的P1.0、P1.6设置为输出方向P2DIR|=0x0f; //P2的0,1,2,3设置为输出口P1OUT|=BIT0+BIT6; //P1.0、P1.6输出高电平,次单片机的VCC为3.56VP1IE|=0X02; //P1.1中断使能P1IES|=BIT1; //P1.1中断边沿选择,下降沿触发P1IFG=0; //清P1.1中断标志_BIS_SR(GIE); //开总中断while(1) //{if(receive[0]==0xa2){flag=1;}if(receive[0]==0xe2){flag=-1;}if(flag==1) //正转P1.0{P1OUT&=~BIT3;P1OUT&=~BIT4;switch(receive[0]){case 0x68:{P1OUT&=~BIT0;P1OUT&=~BIT2;break;} //0键case0x30:{{P1OUT|=BIT0;P1OUT|=BIT2;delay_ms(1);P1OUT&=~B IT0;P1OUT&=~BIT2;delay_m s(9);}break;}//1键case0x18:{{P1OUT|=BIT0;P1OUT|=BIT2;delay_ms(2);P1OUT&=~B IT0;P1OUT&=~BIT2;delay_m s(8);}break;}//2键case0x7a:{{P1OUT|=BIT0;P1OUT|=BIT2;delay_ms(3);P1OUT&=~B IT0;P1OUT&=~BIT2;delay_m s(7);}break;}//3键case0x10:{{P1OUT|=BIT0;P1OUT|=BIT2;delay_ms(4);P1OUT&=~BIT0;P1OUT&=~BIT2;delay_m s(6);}break;}//4键case0x38:{{P1OUT|=BIT0;P1OUT|=BIT2;delay_ms(5);P1OUT&=~B IT0;P1OUT&=~BIT2;delay_m s(5);}break;}//5键case0x5a:{{P1OUT|=BIT0;P1OUT|=BIT2;delay_ms(6);P1OUT&=~B IT0;P1OUT&=~BIT2;delay_m s(4);}break;}//6键case0x42:{{P1OUT|=BIT0;P1OUT|=BIT2;delay_ms(7);P1OUT&=~B IT0;P1OUT&=~BIT2;delay_m s(3);}break;}//7键case0x4a:{{P1OUT|=BIT0;P1OUT|=BIT2;delay_ms(8);P1OUT&=~B IT0;P1OUT&=~BIT2;delay_m s(2);}break;}//8键case 0x52:{P1OUT|=BIT0;P1OUT|=BIT2;break;} //9键}}else if(flag==-1) //反转P1.2{P1OUT&=~BIT0;P1OUT&=~BIT2;switch(receive[0]){case 0x68:{P1OUT&=~BIT3;P1OUT&=~BIT4;break;} //0键case0x30:{{P1OUT|=BIT3;P1OUT|=BIT4;delay_ms(1);P1OUT&=~B IT3;P1OUT&=~BIT4;delay_m s(9);}break;}//1键case0x18:{{P1OUT|=BIT3;P1OUT|=BIT4;delay_ms(2);P1OUT&=~B IT3;P1OUT&=~BIT4;delay_m s(8);}break;}//2键case0x7a:{{P1OUT|=BIT3;P1OUT|=BIT4;delay_ms(3);P1OUT&=~B IT3;P1OUT&=~BIT4;delay_m s(7);}break;}//3键case0x10:{{P1OUT|=BIT3;P1OUT|=BIT4;delay_ms(4);P1OUT&=~B IT3;P1OUT&=~BIT4;delay_m s(6);}break;}//4键case0x38:{{P1OUT|=BIT3;P1OUT|=BIT4;delay_ms(5);P1OUT&=~B IT3;P1OUT&=~BIT4;delay_m s(5);}break;}//5键case0x5a:{{P1OUT|=BIT3;P1OUT|=BIT4;delay_ms(6);P1OUT&=~B IT3;P1OUT&=~BIT4;delay_m s(4);}break;}//6键case0x42:{{P1OUT|=BIT3;P1OUT|=BIT4;delay_ms(7);P1OUT&=~B IT3;P1OUT&=~BIT4;delay_m s(3);}break;}//7键case0x4a:{{P1OUT|=BIT3;P1OUT|=BIT4;delay_ms(8);P1OUT&=~B IT3;P1OUT&=~BIT4;delay_m s(2);}break;}//8键case 0x52:{P1OUT|=BIT3;P1OUT|=BIT4;break;} //9键}}}}//*********************红外遥控器中断程序*******************//#pragma vector=PORT1_VECTOR //中断程序的格式:#pragma vector=中断矢量__interrupt void port1(void)//格式:__interrupt void 函数名(void){P1IFG=0X00; //清P1中断标志int count=0; //高电平持续时间计数值while(!(P1IN&BIT1)); //等电平变为高电平while(P1IN&BIT1) //计算高电平持续时间{count++;if(count>8000)return;//如果高电平持续时间过长则推出中断程序}if(j>16) //一体化红外接收头一接收遥控器信号,就会输出32位的脉冲序列波,其中后16位{ //决定遥控器的按键地址,16位由8位数据码和数据反码组成,我们需要将其解码//time[j-17]=count; //将记得的高电平持续时间放入时间数组中if(j==25)k++; //到数据反码的起始位的时候,我让receive数组元素下标+1receive[k]<<=1; //接收数据码左移一位,比如:xxxx xxxx 左移一位后xxxx xxx0if(count>80)receive[k]|=0x01;//高电平持续时间超过80,则将左移一位后的最低位变1,} //结果变为,xxxx xxx1,如果没超过80则保持不变,xxxx xxx0 j++;if(j>32){j=0;k=0; //解码结束,j,k值清零delay_ms(150);}}。
MSP430G2553红外线编码键盘
temp_time<<=8;
temp_time+=TL1;*/
if(temp_time>49)///数据位为1;
KEY_value|=0x01;
KEY_value<<=1;
if(I_count==34)
{
KEY_value>>=1;///
}
}
}
///定时时间到。归零;
#pragma vector=TIMER0_A1_VECTOR
__interrupt void time0()
{
switch(TA0IV)
{
case 2:break;
void inter_init();///P2.2红外线中断入口;
{
P2REN|=INIFG;///电阻控制;
P2OUT|=INIFG;///电阻上拉;
P2DIR&=~INIFG; //清除标志位
P2IES|=INIFG; //选择上跳沿中断
P2IE|=INIFG; //使能中断
_EINT(); //开总中断
}
#pragma vector=PORT2_VECTOR
__interrupt void cood_interrup()
{
if(P2IFG&INIFG==INIFG)
}
TAR=0;//TH1=0;TL1=0;///每一次检测定时器必须清零;
}
else
{
if(I_count==1)
//TACTL&=~MC0; //连码也会进入此函数;//但第三次
MSP430G2553的红外学习调试方法
敬请登录网站在线投稿 2018年第1期79M S P 430G 2553的红外学习调试方法吴丽萍,戈志明(苏州工业园区职业技术学院,苏州215123)摘要:电视遥控器使用的是专用集成发射芯片来实现遥控码的发射,不同公司的遥控芯片采用的遥控码格式不同,较普遍的有两种,一种是N E C 标准,另一种是P H I L I P S 标准㊂有些公司摄像机的遥控器是不遵循任何标准的红外编码格式的,针对这种情况我们提出定时器捕获的方法,记录接收到的波形的过程即实现红外学习过程㊂关键词:M S P 430G 2553;遥控器;红外学习中图分类号:T P 336 文献标识码:AI n f r a r e dL e a r n i n g D e b u g g i n g Me t h o dB a s e do nM S P 430G 2553W uL i p i n g ,G eZ h i m i n g(S u z h o u I n d u s t r i a l P a r k I n s t i t u t e o fV o c a t i o n a lT e c h n o l o g y,S u z h o u215123,C h i n a )A b s t r a c t :T h e s p e c i a l i n t e g r a t e de m i s s i o nc h i p isu s e dt or e a l i z e r e m o t ec o n t r o l c o d e t r a n s m i s s i o n i nt h e t e l e c o n t r o l l e r ,b u t t h er e m o t e c o n t r o l c h i p s c o m e f r o md i f f e r e n t c o m p a n i e sw h i c hu s i n g t h e d i f f e r e n t f o r m a t .T h e r e a r e t w o c o mm o n t y p e s ,o n e i s t h eN E Cs t a n d a r d ,t h e o t h e r i s t h eP H I L I P S s t a n d a r d .H o w e v e r ,s o m e c o m p a n y 's r e m o t e c a m e r a s d o n o t f o l l o wa n y i n f r a r e d e n c o d i n gf o r m a t s t a n d a r d .I n v i e wo f t h i s s i t u a t i o n ,t h em e t h o d o f t i m e r c a p t u r e i s p r o p o s e d ,w h i c h c a n r e c o r d t h e r e c e i v e dw a v e f o r ma n d t h e n a c h i e v e s t h e p r o c e s s o f i n f r a r e d l e a r n i n g.K e y wo r d s :M S P 430G 2553;t e l e c o n t r o l l e r ;i n f r a r e d l e a r n i n g 引 言电视遥控器使用专用集成发射芯片来实现遥控码的发射,如东芝T C 9012㊁飞利浦S A A 3010T 等㊂通常彩电遥控信号的发射,就是将某个按键所对应的控制指令和系统码(由0和1组成的序列)调制在38k H z 的载波上,然后经放大㊁驱动红外发射管将信号发射出去㊂本文使用的是一体化接收头,当一体化接收头收到38k H z 红外信号时,输出端输出低电平,否则为高电平㊂不同公司的遥控芯片,采用的遥控码格式也不一样㊂较普遍的有两种:一图1 N E C 标准种是N E C 标准,另一种是P H I L I P S 标准㊂1 背景分析N E C 标准:遥控载波的频率为38k H z (占空比为1:3),当某个按键按下时,系统首先发射一个完整的全码,如果键按下超过108m s 仍未松开,接下来发射的代码(连发代码)将仅由起始码(9m s )和结束码(2.5m s)组成㊂一个完整的全码=引导码+客户码+客户码+数据码+数据反码㊂其中,引导码是由高电平4.5m s 和低电平4.5m s 组成;接着是客户码的低8位㊁客户码的高8位㊁数据码8位㊁数据码的反码8位,共32位数据;其中前16位为客户码,能区别不同的红外遥控设备,防止不同机种遥控器互相干扰;后16位为8位的数据码和8位的数据反码,数据反码用于核对数据是否接收准确㊂N E C ㊁T O S H I B A ㊁S A M S O N G 公司的编码格式有其共通之处:全码都由 引导码+客户码+客户码+数据码+数据码反码 组成;接收端根据数据码作出应该执行什么动作的判断㊂连发代码是在持续按键时发送的码,它告知接收端,某键是在被连续地按着㊂N E C 标准如图1所示㊂发射数据0时用 0.56m s 高电平+0.565m s 低电平=1.125m s 表示,数据1用 高电平0.56m s +低电平1.69m s =2.25m s 表示㊂即发射码 0 表示发射38k H z 的红外线0.56m s ,停止发射0.565m s ㊂发射码 1 表示发射38k H z 的红外线0.56m s ,停止发射1.69m s㊂需要注80M i c r o c o n t r o l l e r s&E m b e d d e dS ys t e m s 2018年第1期w w w .m e s n e t .c o m .c n意的是:当一体化接收头收到38k H z 红外信号时,输出端输出低电平,否则为高电平㊂所以一体化接收头输出的波形是与发射波形是反向的,如图2所示㊂图2 遥控发射码与一体化接收头信号比较N E C ㊁T O S H I B A ㊁S AM S O N G 公司的编码格式有其共通之处:全码都由 引导码+客户码+客户码+数据码+数据码反码 组成;数据 0 和 1的定义相同,不同的只是引导码高低电平的持续时间不同,客户码位数有长有短,第一个简码和全码最后一位之间的延时不同,简码的引导脉冲不同等㊂所以,可以把相同的部分做成通用子程序,包括产生数据 0 和 1 的子程序 O N E 和 Z E R O,9m s ㊁4.5m s ㊁2.25m s ㊁22m s ㊁45m s 等时间控制子程序㊂当使用M S P 430G 2553时,红外遥控器的学习需要和通信功能相结合,单片机不能存储学习到的红外键值,需要传给存储器保存,也需要由存储器来传输要还原的键值㊂同时由于M S P 430G 2553的R AM 比较小,只有512字节,如果要实现红外键值的学习,需要谨慎使用R AM 空间㊂2 解决方案有些公司的摄像机的遥控器是不遵循任何标准的红外编码格式的,所以要进行红外学习只能采集到红外接收头端收到的码值波形,在还原的时候,也就是在低电平时间内红外输出端发送38k H z 的载波,在高电平时间内红外输出端保持低电平㊂记录接收到的波形的过程就是红外学习的过程,可以采用定时器捕获的方法,定时器设置为上升沿㊁下降沿都捕获㊂M S P 430G 2553有两个定时器,其中一个用来记录系统T I C K S (精度为10μs),另外一个用作定时器捕获㊂使用这两个定时器就可以记录下红外接收头接收到的波形,中断处理流程图如图3所示㊂我们记录波形中高㊁低电平的时间,由于开始学习的第一个状态一定是低电平状态,所以不需要记录高低电平位置,那么接下来需要把记录下来的高低电平的值传给业图3处理流程图4 业务程序处理流程务,此时要区别下是不是干扰,如果记录的值太少就不是键值,而是干扰源发出的,然后在业务程序需要进行发送的时候再把这组值发给我们,业务程序处理流程如图4所示㊂那么如果业务将包含一个键值信息的高低电平值发给我们,该怎么处理呢?在红外键值还原过程中只需要用到一个用于计时功能的定时器,结合接收到的键值延时信息进行还原就可以了㊂其中的长延时是公司的摄像机遥控器在按键按下后发送的若干组值,这些代表一个键值,每组之间会有20m s左右的延时,这个延时也需要记录下来,并且需要记录下这个长延时出现在第几个高低电平位置,以便能正确还原出键值㊂还原流程如图5所示㊂敬请登录网站在线投稿2018年第1期81图5还原处理流程结语在调试过程中,首先需要弄明白红外编码和解码的原理,然后针对具体情况学习不止一种遥控器㊂由于不能针对某种红外协议标准进行学习,所以直接将接收到的红外波形的高低电平时间记录下来,还原时也是依据这个时间值进行还原㊂调试中总是遇到学习到的数据错误的问题,原因一般都是定义的中间全局变量的范围超出,因为M S P430G2553的R AM空间很小,如果定义的变量已经超出了范围,那么这个变量里存的值都是错误的㊂参考文献[1]T I.R S422a n dR S485S t a n d a r d sO v e r v i e wa n dS y s t e mC o n f i g u r a t i o n s,2010.[2]T I.G P I O U s e r'sG u i d e,2011.[3]J o n a h a nC o r b e,A l e s s a n d r o R u b i n i,G r e g K r o a h-H a r t m a n. L I N U X设备驱动程序[M].魏永明,等译.北京:中国电力出版社,2010.[4]刘刚,赵建川.L I N U X系统移植[M].北京:清华大学出版社,2011.吴丽萍(讲师),主要研究方向为自动控制系统;戈志明(工程师),主要研究方向为嵌入式系统,软件测试㊂(责任编辑:杨迪娜收稿日期:2017-09-14)传输,管理人员可以在多个平台上登录,实时掌控酒店房间动态,集中控制管理㊂此设计可帮助酒店节能省电,提高管理效率,给客人更加安全舒适的环境㊂参考文献[1]江苏沁恒股份有限公司.C H563D S1.P D F,2017.[2]K e v i nRF a l l,W.R i c h a r dS t e v e n s.T C P/I P详解(卷一)[M].北京:机械工业出版社,2016.[3]R F C2616H y p e r t e x tT r a n s f e rP r o t o c o l H T T P/1.1[E B/O L].[201710].h t t p://w w w.d o c i n.c o m/p7*******.h t m l&e n d p r o=t r u e.(责任编辑:杨迪娜收稿日期:2017-10-31)摔倒㊂此时设备向井上服务器传达人员处于摔倒状态的信息,通知井上人员对该井下人员采取相应急救措施㊂如果是误报警,该携带装置的人员可以通过误报警按钮取消㊂防摔倒检测功能软件设计流程如图3所示㊂图3防摔倒检测功能软件设计流程结语实验结果表明,本定位装置具有设备简单㊁成本低㊁实施方便㊁可靠性㊁精度和灵敏度高等特点,能适应井下恶劣环境并长期稳定工作,还结合R S S I技术与步长估计技术进行定位,得到具体的精确位置信息,以这样的方式对井下人员进行定位,可以减少事故发生后人员抢救的时间,保证人员的安全㊂参考文献[1]于平.煤矿井下人员定位系统的现状和发展[J].环球市场,2016(15):41-43.[2]何伟刚,吴其琦.煤矿井下小型无线定位器的设计[J].煤矿机械,2013(10):154-156.[3]苏静,吴桂义.煤矿井下人员定位系统现状与发展趋势[J].内蒙古煤炭经济,2012(9):111-112.[4]季利佳.基于W i F i和Z i g B e e技术的无线通信及人员定位系统在矿山的应用[J].电子世界,2016(14).(责任编辑:杨迪娜收稿日期:2017-10-19)。
msp430红外解码
#include <msp430x14x.h>#define uchar unsigned char#define uint unsigned intuint count=0;uchar value = 0;uint ifclr = 0;long LastTime;/*********发送的码都是高位在后,低位在前********/long preamble_code; //引导码长int address_code[16]; //地址码,先是低位地址码,再是高位地址码int data_code[16]; //数据码,先是8位数据,再是8位数据反码uchar infrared_address_high = 0;uchar infrared_address_low = 0;uchar infrared_data = 0;uchar infrared_back_data = 0;/*******************************************函数名称:Delay_1ms功能:延时约1ms的时间参数:无返回值:无********************************************/void Delay_1s(){long a,i;for(a=200;a>0;a--){for(i = 10000;i > 0;i--) _NOP();}}/*******************************************函数名称:Infrared_decoding()功能:红外解码参数:无返回值:无********************************************/void Infrared_decoding(){uint count1;if(count>32){_DINT();count = 0;value = 0;ifclr = 0;if(preamble_code>13000 && preamble_code<14000){for(count1=0;count1<8;count1++){infrared_address_low = infrared_address_low>>1;if(address_code[count1]<2500 && address_code[count1]>1500) infrared_address_low |= 0x80;elseinfrared_address_low |= 0x00;}for(count1=8;count1<16;count1++){infrared_address_high = infrared_address_high>>1;if(address_code[count1]<2500 && address_code[count1]>1500) infrared_address_high |= 0x80;elseinfrared_address_high |= 0x00;}for(count1=0;count1<8;count1++){infrared_data = infrared_data>>1;if(data_code[count1]<2500 && data_code[count1]>1500){infrared_data |= 0x80;}elseinfrared_data |= 0x00;}for(count1=8;count1<16;count1++){infrared_back_data = infrared_back_data>>1;if(data_code[count1]<2500 && data_code[count1]>1500)infrared_back_data |= 0x80;elseinfrared_back_data |= 0x00;}}/* P1OUT = infrared_address_low; //实验测得为0x00Delay_1s();P1OUT = infrared_address_high; //实验测得为0xffDelay_1s();P1OUT = infrared_data;/**************************************************************** 实验测得为01 2 3 ** 4 5 6 ** 7 8 9 **OXA2 0X62 0XE2 0X22 0X02 0XC2 0XE0 0XA8 0X9010 11 12 ** 13 14 15 ** 16 17 18 **OX68 0X98 0XB0 0X30 0X18 0X7A0X10 0X31 0X5A19 20 210X42 0X4A0X52******************************************************************/ Delay_1s();P1OUT = infrared_back_data; //实验测得为0xff*//* if((infrared_data & infrared_back_data)==0X00)P1OUT = 0X00;else P1OUT = 0XFF;*/P1OUT = infrared_data;_EINT();}}/*******************************************函数名称:init_clk()功能:时钟初始化参数:无返回值:无********************************************/void init_clk(){uchar i;BCSCTL1&=~XT2OFF; //打开XT振荡器do{IFG1 &= ~OFIFG; //清除振荡错误标志for(i = 0; i < 100; i++)_NOP(); //延时等待}while ((IFG1 & OFIFG) != 0); //如果标志为1继续循环等待BCSCTL2 |= SELM_2 + SELS + DIVS_3; //MCLK SMCLK 选择外部高频时钟}/***********************主函数*************************************/int main( void ){// Stop watchdog timer to prevent time out resetWDTCTL = WDTPW + WDTHOLD;/*下面六行程序关闭所有的IO口*/P1DIR = 0XFF;P1OUT = 0XFF;P2DIR = 0XFF;P2OUT = 0XFF;P3DIR = 0XFF;P3OUT = 0XFF;P4DIR = 0XFF;P4OUT = 0XFF;P5DIR = 0XFF;P5OUT = 0XFF;P6DIR = 0XFF;P6OUT = 0XFF;init_clk();P4DIR&=~BIT0;P4SEL|=BIT0;TBCCTL0 |= CM_2 + CCIS_0 + SCS + CAP + CCIE; //设置捕获模式,下降沿捕获,同步,开中断TBCTL |= TBSSEL_2 + MC_2 + TBCLR; //选择SMCLK 连续计数模式1us 1MHZ//TBCLR 清零_EINT();while(1){Infrared_decoding();}// LPM1;}/**********************捕获中断函数******************************/#pragma vector=TIMERB0_VECTOR__interrupt void TIMERB0(){if(ifclr==0){TBCTL |= TBCLR;ifclr=1;}else if(ifclr==1){LastTime = TBCCR0;TBCTL |= TBCLR;if(count==0){preamble_code = LastTime;}else if(count>=1 && count<=16){address_code[count-1] = LastTime;}else if(count>16 && count<=32){data_code[count-17] = LastTime;}if(preamble_code>13000 && preamble_code<14000) count++;}}。
msp430单片机红外遥控小车设计程序_1
/*************************************************************************原理:根据高电平持续时间判断信号传输的是0还是1进行解码方法:采用定时器这里用width=end-start,width的长度来判断解码信号为1还是0 功能:按一个键,单片机数码管上显示按键的用户码、数据码和数据反码**************************************************************************/#include <msp430f5438a.h>#include "PIN_DEF.H"#define uchar unsigned char#define uint unsigned intuint start = 0,end = 0; //计数开始和结束标志uint width = 0; //用于存放脉宽uint en = 0,n = 0; // en用于保存是否有引导码进入,n表示保存信号的数组IR[]下标uchar IR[32]; //先用数组将接收到的数据保存起来uchar IR_buf[4]={0x00,0x00,0x00,0x00};//IR_buf[0]、IR_buf[1]为用户码低位、用户码高位接收缓冲区// IR_buf[2]、IR_buf[3]为键数据码和键数据码反码接收缓冲区uchar disp_buf[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; //显示缓冲单元,初值为0x00,指向显示码的8个"0"uchar seg_data[]={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf};//0~F和"-"符的显示码(字形码)/* 50us的延迟函数*/void delay_50us(unsigned int t){unsigned int j;for(;t>0;t--)for(j=10;j>0;j--);}/********以下是显示函数********/void Display(){P8DIR = 0XFF; //段选方向打开P8OUT = seg_data[disp_buf[0]]; //用户码低P9DIR = 0x01; //选位P9OUT = ~0x01; //数码管第一位输出delay_50us(1); //延迟50usP8OUT = seg_data[disp_buf[1]]; //用户码低P9DIR = 0x02;P9OUT = ~0x02;delay_50us(1);P8OUT = seg_data[disp_buf[2]]; //用户码高P9DIR = 0x04;P9OUT = ~0x04;delay_50us(1);P8OUT = seg_data[disp_buf[3]]; //用户码高P9DIR = 0x08;P9OUT = ~0x08;delay_50us(1);P9DIR = 0x00;P8OUT = seg_data[disp_buf[4]]; //数据码P1DIR = 0x10;P1OUT = ~0x10;delay_50us(1);P8OUT = seg_data[disp_buf[5]]; //数据码P1DIR = 0x20;P1OUT = ~0x20;delay_50us(1);P8OUT = seg_data[disp_buf[6]]; //数据反码P1DIR = 0x40;P1OUT = ~0x40;delay_50us(1);P8OUT = seg_data[disp_buf[7]]; //数据反码P1DIR = 0x80;P1OUT = ~0x80;delay_50us(1);P1DIR = 0x00;}//***************************************************************************// // // // Init_Port(void): 设置IO端口//// // //***************************************************************************// void Init_Port(void){P5DIR |= POWER ; // 主电源MAIN_POWER_ON ;}//***************************************************************************//// // //函数:Init_CLK(void) ////功能:初始化主时钟: MCLK = XT2=16MHZ // // // //***************************************************************************// void Init_CLK(void){P5SEL |= 0x0c; //选择内部16MHZ晶振,将引脚作为第二功能使用P5DIR |= 0x0c;UCSCTL6 &= ~XT2OFF; //EN XT2//因为XT1未开启,所以给默认为XT1的时钟重新选择时钟来源UCSCTL4 |= SELA_1; //先将ACLK配置为VLOCLKUCSCTL3 |= SELREF_2; //将FLLREFCLK配置为REFCLKwhile (SFRIFG1 & OFIFG){UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + DCOFFG); // 清除时钟标志位SFRIFG1 &= ~OFIFG; // 清除时钟错误标志位}UCSCTL4 |=SELS_5; //将SMCLK时钟源配置为XT2}//***************************************************************************// // // // Init_IRUART(void): 设置红外端口//// // //***************************************************************************// void Init_IRUART(void){P1SEL |= (0x01<<2); //捕获的输入引脚P1.2P1DIR &= ~(0x01<<2);}/********以下是解码函数********/void Decode(void){if(width > 8600) //如果高电平时间大于4.3ms,则判断为引导码并将解码标志en置为1{en = 1;n = 0;}if(en == 1) //判断是否执行解码操作{if(width >=1700&&width <=4000) //当高电平时间>=0.85ms,<=2ms时判断为1 {IR[n] = 1;n++;width = 0;}if(width > 600&&width<1700) //当高电平时间<0.85ms,>0.3ms时判断为0{IR[n] = 0;n++;width = 0;}if(n >= 32) //当数组存满32位时,n清零,en使能标志位清零{en = 0;n = 0;}}}/*将IR[]里的值八位一组分开并转换到IR_buf[]里面,并将IR_buf的值转换成数码管显示的缓存*/void Process(void){if(n == 0){ //如果n == 0将IR[]的值转存到IR_buf[]里IR_buf[0]=IR[8*0]*128+IR[8*0+1]*64+IR[8*0+2]*32+IR[8*0+3]*16+IR[8*0+4]*8+IR[8*0+5]*4+IR[ 8*0+6]*2+IR[8*0+7];IR_buf[1]=IR[8*1]*128+IR[8*1+1]*64+IR[8*1+2]*32+IR[8*1+3]*16+IR[8*1+4]*8+IR[8*1+5]*4+IR[ 8*1+6]*2+IR[8*1+7];IR_buf[2]=IR[8*2]*128+IR[8*2+1]*64+IR[8*2+2]*32+IR[8*2+3]*16+IR[8*2+4]*8+IR[8*2+5]*4+IR[ 8*2+6]*2+IR[8*2+7];IR_buf[3]=IR[8*3]*128+IR[8*3+1]*64+IR[8*3+2]*32+IR[8*3+3]*16+IR[8*3+4]*8+IR[8*3+5]*4+IR[ 8*3+6]*2+IR[8*3+7];//if(IR_buf[2] == ~IR_buf[3]) //校验{disp_buf[0]=IR_buf[0]>>4; //取键码的低四位送显示缓冲disp_buf[1]=IR_buf[0]&0x0f; //右移4次,高四位变为低四位送显示缓冲disp_buf[2]=IR_buf[1]>>4;disp_buf[3]=IR_buf[1]&0x0f;disp_buf[4]=IR_buf[2]>>4;disp_buf[5]=IR_buf[2]&0x0f;disp_buf[6]=IR_buf[3]>>4;disp_buf[7]=IR_buf[3]&0x0f;}}}/********以下是主函数********/void main(void){WDTCTL = WDTPW + WDTHOLD; // 关闭看门狗Init_Port(); // 电源初始化Init_IRUART(); //红外端口初始化Init_CLK() ; //初始化时钟TA0CTL = TASSEL_2+ID_3+TACLR+TAIE+MC_1; //定时器A时钟信号选择SMCLK,8分频,//同时设置定时器A计数模式为增计模式TA0CCTL1 = CM0+SCS+CAP+CCIE; //输入上升沿捕获,CCI0A为捕获信号源TA0CCR0 = 20000; //设置计数器溢出时间为10ms_EINT() ; //开启全局中断while(1){Process(); //将IR[]数组缓存转换为数码管显示缓存函数Display(); //数码管显示函数}}#pragma vector=TIMER0_A1_VECTOR //定时器A中断处理__interrupt void Timer0_A1(void){switch(TA0IV) //向量查询{ case 2: //捕获中断if(TA0CCTL1&CM0) //捕获到上升沿{TA0CCTL1=(TA0CCTL1&(~CM0))|CM1; //更变设置为下降沿触发start=TA0R; //记录初始时间}else if (TA0CCTL1&CM1) //捕获到下降沿{TA0CCTL1=(TA0CCTL1&(~CM1))|CM0; //==更变设置为上升沿触发end=TA0R; //用start,end,overflow计算脉冲宽度if(end>start)width = end - start; //实际高电平宽度Decode(); //解码end = 0;start = 0;TA0R=0;}break;default:break;}}。
单片机的红外遥控器解码原理与实现
单片机的红外遥控器解码原理与实现红外遥控器是我们日常生活中常见的电子设备,它通过使用红外线信号与接收器进行通信。
而在这个过程中,单片机起到了解码的重要作用。
本文将介绍单片机解码红外遥控器的原理以及实现方法。
一、红外遥控器的工作原理红外遥控器是一种使用红外线进行通信的设备,它主要由发送器和接收器两部分组成。
发送器将指令数据转换为红外脉冲信号并发送出去,接收器通过接收红外线信号并将其转换为电信号,进而解码为可识别的指令。
而单片机则负责接收并解码红外信号,将其转化为具体的操作。
二、单片机解码红外信号的原理单片机解码红外信号主要分为两个步骤:红外信号的接收和信号的解码处理。
1. 红外信号的接收单片机通过外部的红外接收器接收红外信号。
红外接收器可以通过外部电路将接收到的红外信号转换为电压信号,然后通过单片机的IO 口输入。
2. 信号的解码处理接收到的红外信号经过IO口输入后,单片机需要对信号进行解码处理。
解码的过程涉及到红外信号的标准化和解析。
对于常见的红外遥控器协议,单片机需要能够识别其编码方式,确定其协议格式。
这些协议通常包含了引导码、地址码和指令码等信息。
在解析红外信号时,单片机首先需要识别引导码。
引导码是红外信号的起始标志,通常由高、低电平组成,表示编码的开始。
单片机通过判断引导码的时间长度来确定信号的开始。
接下来,单片机需要识别地址码和指令码。
地址码是用来区分不同的红外遥控器设备,指令码则表示具体的操作指令。
单片机通过判断地址码和指令码的高、低电平时间长度来确定具体的操作。
三、单片机解码红外信号的实现方法单片机解码红外信号有多种实现方法,以下是一种简单的实现示例。
首先,需要连接红外接收器到单片机的IO口,将接收到的信号输入到单片机。
接收到的信号可以通过外部中断的方式触发单片机的中断服务程序。
然后,在中断服务程序中,单片机需要根据红外协议的规则,判断引导码、地址码和指令码的时间长度。
利用计时器或延时函数可以实现对信号时间的测量。
基于MSP430单片机的学习型遥控器设计
基于MSP430单片机的学习型遥控器设计MSP430单片机是德州仪器(TI)推出的一种低功耗、高性能的微控制器系列。
它在嵌入式系统中应用广泛,具有低功耗、高集成度、高性能和易于使用的特点。
在本文中,我将介绍基于MSP430单片机的学习型遥控器设计。
学习型遥控器是一种可以学习其他遥控器信号的设备,可以用来控制各种电器、设备和机器。
它通常包含一个红外发射器和一个红外接收器,可以通过学习其他遥控器的红外信号来实现对其他设备的控制。
首先,我们需要选择适合的硬件平台。
MSP430单片机系列中有许多型号可供选择,我们可以根据具体要求选择合适的型号。
同时,我们还需要一些外围设备,如红外发射器、红外接收器、按键和显示屏等。
接下来,我们需要进行硬件设计。
首先,我们需要将MSP430单片机与外围设备进行连接。
MSP430单片机具有多个通用输入输出引脚,我们可以使用这些引脚来连接外围设备。
例如,我们可以将红外接收器的输出引脚连接到MSP430单片机的一个输入引脚,以接收红外信号;同时,我们可以将红外发射器的输入引脚连接到MSP430单片机的一个输出引脚,以发送红外信号。
在硬件设计完成后,我们需要进行软件编程。
MSP430单片机通常使用C语言进行编程,我们可以使用MSP430单片机的软件开发工具包(MSP430SDK)进行软件开发。
首先,我们需要编写程序来接收和解码红外信号。
MSP430单片机提供了一些硬件辅助模块,如计时器和比较器,可以用来实现红外信号的接收和解码。
我们可以使用MSP430SDK提供的相关函数和库来简化这些操作。
然后,我们需要编写程序来发送红外信号。
MSP430单片机的输出引脚可以通过改变电平来发送红外信号,我们可以使用MSP430SDK提供的相关函数和库来控制输出引脚的电平。
最后,我们需要编写程序来控制其他设备。
我们可以使用MSP430单片机的输入引脚来读取按键的状态,然后根据按键的状态来发送相应的红外信号。
MSP430G2553定时器捕获之红外遥控器编码破解
MSP430G2553应用之红外遥控器按键编码的破解(ls_core)之前笔者利用51单片机、FPGA 和S3C2440对红外遥控器的编码破解过。
由于最近手里使用的单片机为MSP430G2553,同时也为了扩展LaunchPad 开发板按键所需,笔者还是将之前弄使用过的红外遥控器拿了起来。
使用遥控器作为开发板的按键使有个好处就是,占用一个IO 口即可扩展出很多按键。
但是,这样做的不足就是,占用了一个定时器和相应中断的资源。
所以,建议大家应该依据具体的项目工程而确定具体的解决方案。
好了进入正题。
一 红外时序在这里笔者探讨的问题是破解红外遥控器的编码,而不是对其编码。
所以,我们直接谈谈红外接收头1838T 接收到红外遥控器发送出的按键编码时序。
笔者在普源(RIGOL)示波器上观察到的时序波形如图1红外遥控器按键编码时序所示:图1 红外遥控器按键编码时序面对这样一列串行的序列,笔者将其测量、记录、整理并为其制作了一张时序图以便讲解,绘制的时序图如下图2 红外编码时序图 所示:ls _c o r e Q Q 1021480125 837278968图2 红外编码时序图接下来,让我们一起详细地探讨一下这一列时序波形。
首先当我们手中的遥控器的按键被按下时,其红外发射头会发射出红外线(该红外线载有数据信息,即对应的按键编码),然后红外接收头1838T 会接收该红外线对其解码还原载波信息。
所还原的信息即为按键编码的串行时序信息,如上图2所示。
那笔者所讲的破解编码是指的什么呢?很显然,笔者所讲的破解就是要把图2所示的串行数据转化成方便微机或者是人记忆识别的并行数据。
好,接着让我们一起分析一下这个时序。
⑴ 空闲状态:当红外接收头1838T 没有数据时(无按键按下,或是数据转化完成),红外接收头的输出引脚会一直保持高电平,即上图2所指的空闲状态。
⑵ 引导码:当红外接收头1838T 接收到了数据,其输出引脚首先会由空闲的高电平状态跳转为低电平状态,该低电平状态会保持9ms ,那么着9ms 的高电平状态即称之为引导码。
基于msp430超低功耗单片机的irda红外数据通信
硬件设计及单片机片内 USCI_Ax 单元分析 USCI_Ax 模块的分析
MSP430G2553 内部配置有 USCI_Ax 单元,在该模 块中支持 IrDA 通信中的脉冲整形,要产生 IrDA 协议的信号 需要经过一系列配置。首先需要选择时钟,在 UC0CLK, ACLK,SMCLK 中选择一个作为时钟的频率,然后在分频 器和调制寄存器中选择合适的分频系数作为发送数据和接收 数据的时钟频率。为了将发送缓冲器中的数据以 IrDA 协议 的方式发送出去,以及能接收 IrDA 协议的红外信号,那么 就需要将 IrDA 的编 / 解码处于使能状态及选通 IrDA 的编 / 解码器。
陈志宏 杨瑞琳 曹 文 *
西南科技大学 信息工程学院 项目资助:四川省高等教育人才培养质量和教学改革项目(JG2018 - 504)
影响力
真实度 行业关联度
基于 MSP430 超低功耗单片机的 IrDA 红外数据通信
普通家用遥控器的红外串行输出多采用 NEC 协议,与基于 IrDA 协议的红外通信之间存在明显差异。基于 IrDA 协议的通信具有安全性 高、波特率高、硬件成本低等优点,在数字万用表等近距离数据通信代码较为复 杂,采用 msp430G2553 等低功耗单片机内部的串行通信状态机生成 红外 IrDA 信号,具有代码效率高、误码率低等优点,推广价值较大。
硬件电路设计
红外接收发送电路如图 3 所示,在该单片机的内部硬件 电路产生的 IrDA 的信号波形没有 38KHz 的载波信号,所以 就不能使用 HS0038 红外二极管接收头接收该红外信号,那 么就需要使用红外接收二极管来直接接收该红外信号,由于红 外接收二极管只是接收红外信号,不对信号进行放大的处理, 因此在电路中需要添加一个三极管,使微弱的信号放大。
基于msp430单片机的红外光通信系统研究
2020年9期研究视界科技创新与应用Technology Innovation and Application基于MSP430单片机的红外光通信系统研究潘佳琪,高韵淇,黄膺达,王哲然,李大宇(东北大学计算机科学与工程学院国家级计算机实验教学示范中心,辽宁沈阳110819)引言光通信是以光波为载波的通信方式。
它采用红外线传输信息,不易被发现,因此其具有保密性强的优点。
近些年来,光通信领域发展迅速,在许多高等院校里,也出现了对红外通信专业学生的实践培养。
光通信位于通信领域发展的前段,整个通信系统的性能对于通信的质量极为重要。
因此,对于传统装置的改进与创新变得更加必要。
本文中设计了一套结合MSP430F5529单片机以及AM 调制技术的光通信系统,可以实时完成语音信号的传输,且效果良好。
1系统总体方案本系统采用TI 公司的MSP430F5529单片机为载体,对采集的语音信号做出处理,结合了AM 调制方法,通过红外发射管进行发送。
红外接收端通过I-V 转换电路实现对信号的放大,经过解调器进行解调处理,再将其通过自适应比较器进行波形整形,之后结合单片机进行DA 处理并滤波,最后通过音箱实时播放传输过来的语音信号。
本系统主要分为发射和接收两个主要部分,红外发射管和红外接收管均采用高带宽的二极管,以光为载体,对电流的变化和感应作为传输信号进行通信。
通过MSP430F5529单片机和模拟电路模块作为工具对语音信号进行数字、模拟的处理。
模拟硬件电路模块均采用Al -tium Designer 软件进行PCB 板设计,实践效果良好。
光通信系统总体模块包括:语音放大滤波、乘法器、振荡器、I-V 转换电路、解调器、自适应比较器、300-3400Hz 滤波电路,DA 转换模块等。
整体系统框图如图1所示。
图1系统总体方案2系统硬件设计根据系统总体设计要求,对几个主要功能模块的设计方案进行介绍。
2.1语音放大及滤波电路麦克风将语音信号转化成电信号,此电信号通过放大以及滤波电路进行电信号的初步信号处理。
基于MSP430的低功耗RF-红外控制器的设计
基于MSP430的低功耗RF/红外控制器的设计
0 引言
在智能化家居控制系统应用中,无线通信和控制已经越来越广泛地被运用。
为了实现对居室电器设备的集中无线控制,可采用电话遥控、手持遥控器进行远程或短距离的无线控制,但所控制和传输的信号都是RF 信号。
然而有些被控对象本身是用红外信号遥控的,例如电视机、空调,由于各种品牌的空调都有自己的红外编码信号,相互不能通用,这就给智能化家居控制系统中红外遥控器的集中无线控制带来了极大的不便。
本文就基于MSP430 的低功耗RF/红外控制器的设计与实现进行介绍。
1 工作原理
大多数红外遥控信号的输出都是用编码后串行数据对38~40KHz 的方波进行脉冲幅度调制而产生的PWM 信号,如图1 所示。
各种品牌的红外遥控器的编码信号互不兼容[1][2]。
对该波形进行测量,并将高低电平的宽度存于Flash 中,而不管其如何编码。
当需要对远端的红外设备进行无线控制时,在内存中取出该数字序列,经Msp430 单片机中的捕获比较功能模块,将其还原成红外编码信号。
为了实现无线传输,将该信号调制到350MHz 或420MHz 的无线电波上进行传送。
由于红外编码信号的频率只有几十K 左右,而无线载波的频率是350MHz,以上变换的误差很小。
而防止产生误动作的关键是脉冲函数的宽度的选取。
采样频率越高,误差就越小,但内存的用量就越大。
本文选取采样频率为红外基波频率(20KHz)的6 倍[6][7]。
接收端的电路先将收到的调制信号解调,得到与图 1 相似的红外波形,。
基于MSP430的红外遥控器解码
基于MSP430的红外遥控器解码遥控发射器专用芯片很多,根据编码格式可以分成两大类,这里我们以运用比较广泛,解码比较容易的一类来加以说明,现以日本NEC的uPD6121G组成发射电路为例说明编码原理(一般家庭用的DVD、VCD、音响都使用这种编码方式)。
当发射器按键按下后,即有遥控码发出,所按的键不同遥控编码也不同。
这种遥控码具有以下特征:采用脉宽调制的串行码,以脉宽为0.565ms、间隔0.56ms、周期为1.125 ms的组合表示二进制的“0”;以脉宽为0.565ms、间隔1.685ms、周期为2.25ms的组合表示二进制的“1”,其波形如图2所示。
当一个键按下超过36ms,振荡器使芯片激活,将发射一组108ms的编码脉冲,这108ms发射代码由一个引导码(9ms),一个结果码(4.5ms),低8位地址码(9ms~18ms),高8位地址码(9ms~18ms),8位数据码(9ms~18ms)和这8位数据的反码(9ms~18ms)组成。
如果键按下超过108ms仍未松开,接下来发射的代码(连发码)将仅由起始码(9ms)和结束码(2.25ms)组成。
接收电路可以使用一种集红外线接收和放大于一体的一体化红外线接收器,不需要任何外接元件,就能完成从红外线接收到输出与TTL电平信号兼容的所有工作,而体积和普通的塑封三极管大小一样,它适合于各种红外线遥控和红外线数据传输。
接收器对外只有3个引脚:Out、GND、Vcc与单片机接口非常方便①脉冲信号输出接,直接接单片机的IO 口。
②GND接系统的地线(0V);③Vcc接系统的电源正极(3~5V);以上信息来自搜集的资料和自己的整理(方便大家学习)以下是我的解码程序(参考C51的程序的成功移植)注意:红外解码对时间延时的精度要求比较高,很难一次成功,需要耐心调试,修改着色部分的数字大小.//利用两位数码管显示遥控器的编码值//如遥控器上的0~9对应在数码管上显示00~09#include <msp430x14x.h>#define wei1_1 P1DIR|=BIT7;P1OUT|=BIT7 //数码管低位置高#define wei1_0 P1DIR|=BIT7;P1OUT&=~BIT7 //数码管低位置低#define wei2_1 P1DIR|=BIT6;P1OUT|=BIT6 //数码管高位置高#define wei2_0 P1DIR|=BIT6;P1OUT&=~BIT6 //数码管高位置低#define duan_out P2DIR=0xff //数码管段选P2口设为输出#define IR_DIR_IN P1DIR&=~BIT0 //红外接收头P1.0设置为输入,#define IRIN (P1IN&BIT0) //红外接收头输入值#define duan P2OUT //数码管段选为P2口char dat[8];char seg[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xC6,0xa1,0x86,0x8e};//函数声明void InitSys();void display();void delay(unsigned char x) //延时子程序(x*0.14MS){unsigned char i,j;while(x--){for (i = 20; i>0; i--)for(j=5;j>0;j--);}}void delay_1ms(unsigned int nValue)//delay 1ms at 8M {unsigned int nCount;unsigned int ii;unsigned int jj;nCount = 1592;for(ii = nValue;ii > 0;ii--){for(jj = nCount;jj > 0;jj--)_NOP();}}void delay_5us(unsigned int nValue)//delay 5us at 8M {unsigned int ii;for(ii = nValue;ii > 0;ii--){_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();}}int main( void ){WDTCTL = WDTPW + WDTHOLD; //关闭看门狗InitSys(); //初始化delay_1ms(1);for(;;)display();}/***************************************************************************** 系统初始化******************************************************************************/ void InitSys(){unsigned int i;BCSCTL1 &= ~XT2OFF;do{IFG1 &= ~ OFIFG ;for ( i = 0 ; i < 100 ; i ++ )_NOP();}while ( IFG1&OFIFG != 0 );BCSCTL2 |= SELM_2 + SELS ;P1IE=BIT0; //P1.0中断功能打开P1IES|=BIT0; //P1.0下降沿触发中断IR_DIR_IN; //PI.0设置为输入duan_out; //P2设置为输出_EINT(); //打开全局中断控制}/***************************************************************************** 端口1中断函数******************************************************************************/ #pragma vector="PORT1"_VECTOR__interrupt void Port1(){char i,j,k,n=0;if((P1IFG&BIT0) == BIT0){P1IFG &= ~BIT0; //清除P1.0中断标志P1IE &=~BIT0; //关闭P1.0中断功能I1:for (i=0;i<4;i++){if (IRIN==0) break;if (i==3) {P1IE|=BIT0;return;}}delay(20);if (IRIN==1) goto I1; //确认IR信号出现while(!IRIN); //等待IR变为高电平for (j=0;j<4;j++){for (k=0;k<8;k++){while (IRIN) //等IR 变为低电平{delay_5us(28);}while (!IRIN) //等IR 变为高电平{delay_5us(28);}while (IRIN) //计算IR高电平时长{delay_5us(28);n++;if (n>=30){P1IE|=BIT0;return;}}dat[j]=dat[j] >> 1;if (n>=11) {dat[j] = dat[j]|0x80;}n="0";}}if (dat[2]!=~dat[3]) {P1IE|=BIT0;return;}//此句刚开始可以屏蔽,见到效果后再尝试打开校验dat[5]=dat[2] & 0x0F;dat[6]=dat[2] & 0xF0;dat[6]=dat[6] >> 4;//beep();P1IE|=BIT0;}}void display(){wei1_1;wei2_0;duan="seg"[dat[5]];delay_1ms(1);wei2_1;wei1_0;duan="seg"[dat[6]];delay_1ms(1);}。
基于MSP430F149为主芯片下的红外线解码资料源程序
头文件<InfraredRX.h>/***MODU+********************************************************************/ /* Copyright (c) 2009.04 WH, All Rights Reserved. *//* FileName : DS18B20.h *//* Description : The Led define *//* History : *//* [Author] [Date] [Version] [Description] *//* [1] dragonhzw 2009/04/09 Ver 1.0.0 Initial file. *//***MODU-********************************************************************/ #ifndef __MSP430_TEST_INFRAREDRX_H__#define __MSP430_TEST_INFRAREDRX_H__//--------------------------------------------------------------------------------//6种接收状态#define IR_Idle 0//空闲#define IR_WaitStart 1//接收引导代码#define IR_GetAddress 2//接收地址#define IR_GetAddressInv 3//接收地址反码#define IR_GetData 4//接收数据#define IR_GetDataInv 5//接收数据反码#define ms_168 0x0690#define ms_9 0x2328#define ms_125 0x30D4#define ms_15 0x3A98//--------------------------------------------------------------------------------void delay_ms(unsigned long ms);#endif/* __MSP430_TEST_INFRAREDRX_H__ */InfraredRX.c//***************************************************************************** *// MSP430P149 Demo - InfraredRX, Ultra-Low Pwr UART 9600 Echo ISR, 32kHz ACLK//// Description: Echo a received character, RX ISR used. Normal mode is LPM3,// USART1 RX interrupt triggers TX Echo.// ACLK = UCLK1 = LFXT1 = 32768, MCLK = SMCLK = DCO~ 800k// Baud rate divider with 32768hz XTAL @9600 = 32768Hz/9600 = 3.41 (0003h 4Ah )// //* An external watch crystal is required on XIN XOUT for ACLK *//////// MSP430F149// -----------------// /|\| XIN|-// | | | 32kHz// --|RST XOUT|-// | |// | |// | P2.7 |<----INR_RXD// | |//// Copyright (c) 2009.04 WH, All Rights Reserved.// WebSite:// Description : The InfraredRX module// History :// [Author] [Date] [Version] [Description]// [1] dragonhzw 2009/04/09 Ver 1.0.0 Initial file.//// Built with IAR Assembler for MSP430V3.20A/W32 (3.20.1.9)//***************************************************************************** *#include <msp430x14x.h>#include "InfraredRX.h"//-------------------------------------------------------------------------------unsigned char dis_code[18] = {0x3f,0x06,0x5b,0x4f,0x66, //段码表// 0 1 2 3 4 对应内容0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7c,0x39,0x5e,0x79,0x71,0xff};// 5 6 7 8 9 A B C D E Funsigned char dis_0 = 0; // 个位值unsigned char dis_1 = 0; // 十位值unsigned char dis_2 = 0; // 百位值unsigned char dis_3 = 0; // 千位值unsigned char IR_State=IR_Idle;//接收状态变量,初值为空闲unsigned char IR_Ready=0;//数据接收完标志unsigned char IR_Repeat=0;//连发标志unsigned char IR_Data[4]={0,0,0,0};//接收到的4字节数据unsigned char Tmp;unsigned char IRtimer=0;//--------------------------------------------------------------------------------/***FUNC+*********************************************************************/ /* Name : Port2INT */ /* Descrp : 端口1中断处理程序*/ /* Input : num. */ /* Output : None. *//* Return : None. *//***FUNC-*********************************************************************/ #pragma vector=PORT2_VECTOR__interrupt void Port2INT(void){unsigned int Count;//红外线接收头中断if(P2IFG&BIT7){Count= TAR;//读取计数值TACTL|=MC0+TACLR;//定时器B重新开始计数switch(IR_State){case IR_Idle:{IR_State = IR_WaitStart;IRtimer = 11;break;}case IR_WaitStart:{if((Count>ms_125)&&(Count<ms_15)){//接收到引导码IR_Data[0]=0;IR_Data[1]=0;IR_Data[2]=0;IR_Data[3]=0;Tmp=1;IR_Repeat=0;IR_State=IR_GetAddress;}else if((Count>ms_9)&&(Count<ms_125)){//接收连发代码IR_Repeat=1;IR_State=IR_Idle;}else{IR_State=IR_Idle;}break;}case IR_GetAddress:{if(Count>ms_168){//接收到1IR_Data[0]|=Tmp;}Tmp<<=1;if(!Tmp){IR_State=IR_GetAddressInv;Tmp=1;}break;}case IR_GetAddressInv:{if(Count>ms_168){//接收到1IR_Data[1]|=Tmp;}Tmp<<=1;if(!Tmp){IR_State=IR_GetData;Tmp=1;}break;}case IR_GetData:{if(Count>ms_168){//接收到1IR_Data[2]|=Tmp;}Tmp<<=1;if(!Tmp){IR_State=IR_GetDataInv;Tmp=1;}break;}case IR_GetDataInv:{if(Count>ms_168){//接收到1IR_Data[3]|=Tmp;}Tmp<<=1;if(!Tmp){if(((IR_Data[0]^IR_Data[1])==0xFF)&&((IR_Data[2]^IR_Data[3])==0xFF))IR_Ready=1;//校验数据IR_State=IR_Idle;}break;}default:{IR_State=IR_Idle;break;}}}P2IFG=0x00;//清除中断标志位}/***FUNC+*********************************************************************/ /* Name : InitTimerA */ /* Descrp : 定时器A初始化*/ /* Input : num. */ /* Output : None. *//* Return : None. *//***FUNC-*********************************************************************/ void InitTimerA(void){TACTL=TASSEL1+ID1+ID0+MC0+TACLR;//选择1/8SMCLK 增计数清除TARTACCR0=65535;//时间间隔10ms}/***FUNC+*********************************************************************/ /* Name : InitTimerB *//* Descrp : 定时器B初始化*/ /* Input : num. */ /* Output : None. *//* Return : None. *//***FUNC-*********************************************************************/ void InitTimerB(void){TBCTL=TBSSEL1+ID1+ID0+MC0+TBCLR;//选择1/8SMCLK 增计数清除TBRTBCCTL0=CCIE;//CCR0中断允许比较模式TBCCR0=10000;//时间间隔10ms}/***FUNC+*********************************************************************/ /* Name : TimerBINT */ /* Descrp : 定时器B中断*/ /* Input : num. */ /* Output : None. *//* Return : None. *//***FUNC-*********************************************************************/ #pragma vector=TIMERB0_VECTOR__interrupt void TimerBINT(void){if(IRtimer){IRtimer--;}else{IR_State = IR_Idle;//解码超时}}/***FUNC+*********************************************************************/ /* Name : Init_CLK */ /* Descrp : Set PLL Clock. *//* Input : None. *//* Output : None. *//* Return : None. *//***FUNC-*********************************************************************/ void Init_CLK(void){int index;BCSCTL1&=~0X00; //打开XT2振荡器do{IFG1 &= ~OFIFG; // 清除振荡器失效标志for (index = 0xFF; index > 0; index--)// 延时,等待XT2起振{;}} while ((IFG1 & OFIFG) != 0);// 判断XT2是否起振BCSCTL2 =SELM_2+SELS; //选择MCLK、SMCLK为XT2}/******* 红外遥控器键值表******45 46 4744 40 4307 15 0916 19 0d0c 18 5e08 1c 5a42 52 4a**********************************//***FUNC+*********************************************************************/ /* Name : main */ /* Descrp : 主程序*//* Input : num. *//* Output : None. *//* Return : None. *//***FUNC-*********************************************************************/ void main( void ){WDTCTL=WDTPW+WDTHOLD;//关闭看门狗Init_CLK();//时钟初始化//Init_UART1();InitTimerA();//定时器A初始化InitTimerB();//定时器B初始化/****************************************************************************/ /* 1、初始化数码管引脚*//****************************************************************************/ // 将P4设置为I/O口P4SEL = 0x00;// 将P4设置为输出方向P4DIR = 0xFF;// 将P4口输出全高P4OUT = 0xFF;// 将P3设置为I/O口P3SEL = 0x00;// 将P3设置为输出方向P3DIR |= 0x0F;P3OUT = 0x0F;/****************************************************************************/ /* 2、初始化红外线接收引脚*//****************************************************************************/P2DIR&=~BIT7;//P2.7设置为输入方向P2IES|=BIT7;//P2.7下降沿触发中断P2IE|=BIT7;//P2.7中断允许_EINT();//打开中断while(1){if(IR_Ready==1){ //计算要显示的每位数字while(1){ //计算要显示的每位数字IR_Ready=0;dis_0 = (IR_Data[2]&0xF0)>>4;//数码管后2位显示数据P4OUT = dis_code[dis_0];P3OUT &= ~BIT1; // 开第一个显示(P2.2口控制个位数码管)delay_ms(5);P3OUT |= BIT1; // 关第一个显示(P2.2口控制个位数码管)dis_1 = (IR_Data[2]&0x0F);P4OUT = dis_code[dis_1];P3OUT &= ~BIT2; // 开第一个显示(P2.2口控制个位数码管)delay_ms(5);P3OUT |= BIT2; // 关第一个显示(P2.2口控制个位数码管)P4OUT =0x76;//'H'P3OUT &= ~BIT3; // 开第一个显示(P2.2口控制个位数码管)delay_ms(5);P3OUT |= BIT3; // 关第一个显示(P2.2口控制个位数码管) }}}}/***FUNC+*********************************************************************/ /* Name : delay_ms */ /* Descrp : delay time *//* Input : num. */ /* Output : None. *//* Return : None. *//***FUNC-*********************************************************************/ void delay_ms(unsigned long ms) // 延时毫秒@12M,ms最大值255{unsigned char i;while(ms--)for(i = 0; i < 124; i++);}。
MSP430G2553的红外学习调试方法
MSP430G2553的红外学习调试方法吴丽萍;戈志明【摘要】The special integrated emission chip is used to realize remote control code transmission in the telecontroller,but the remote control chips come from different companies which using the different format.There are two common types,one is the NEC standard,the other is the PHILIPS standard.However,some company's remote cameras do not follow any infrared encoding format standard.In view of this situation,the method of timer capture is proposed,which can record the received waveform and then achieves the process of infrared learning.%电视遥控器使用的是专用集成发射芯片来实现遥控码的发射,不同公司的遥控芯片采用的遥控码格式不同,较普遍的有两种,一种是NEC标准,另一种是PHILIPS标准.有些公司摄像机的遥控器是不遵循任何标准的红外编码格式的,针对这种情况我们提出定时器捕获的方法,记录接收到的波形的过程即实现红外学习过程.【期刊名称】《单片机与嵌入式系统应用》【年(卷),期】2018(018)001【总页数】3页(P79-81)【关键词】MSP430G2553;遥控器;红外学习【作者】吴丽萍;戈志明【作者单位】苏州工业园区职业技术学院,苏州 215123;苏州工业园区职业技术学院,苏州 215123【正文语种】中文【中图分类】TP336引言图1 NEC标准电视遥控器使用专用集成发射芯片来实现遥控码的发射,如东芝TC9012、飞利浦SAA3010T等。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
while(TAR<=1000); TACTL=0; TAR=0; } #pragma vector=PORT1_VECTOR __interrupt void PORT1_ISR(void) { char m,n,k,CodeTemp; int j; P1IE&=HONGWAI_0;//禁止 P1.0 中断 if((P1IFG&HONGWAI_1)==HONGWAI_1) { P1IFG=0;//清中断标志 //停止计数器
BCSCTL2|=SELM1+SELS+DIVS_2+DIVS_1;//MCLK and SMCLK 1M 8 分频 do { IFG1 &= ~OFIFG; 误标志 for(i = 0; i < 100; i++) _NOP(); //延时等待
// 清除振荡错
} while ((IFG1 & OFIFG) != 0); //如果标志为 1 继续循环等 待 IFG1&=~OFIFG; }
for(k=0;k<10;k++) { delay_07ms(1); if (HONGWAI_IN) HONGWAI_IN=1,说明不是引导码 { k=10;break; } // 如 果 0.7ms 后
else if(k==9) 明是引导码 { while(HONGWAI_IN==0); delay_07ms(5); //跳过持续 4.5ms 的高电平 // 如果持续了 10×0.7ms=7ms 的低电平,说
0x00,0x00,0x00,0xF8,0x88,0x88,0x88,0x89,0x8A,0x8E,0x88,0x88,0x88, 0xF8,0x00,0x00, 0x80,0x40,0x30,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,/*"户",1*/
0x02,0x82,0xE2,0x5E,0x42,0xC2,0x00,0x02,0xFA,0x82,0x82,0x82,0xF
E,0x80,0x00,0x00, 0x01,0x00,0x7F,0x10,0x10,0x3F,0x00,0x04,0x04,0x04,0x44,0x84,0x40, 0x3F,0x00,0x00,/*"码",2*/
hongwaibz=1;///////////////// for(m=0;m<4;m++) { for(n=1;n<=8;n++) { while(HONGWAI_IN==0); delay_07ms(1); 开始延时 0.9ms,再判断 IRsignal if(HONGWAI_IN) 则向右移入一位"1" { delay_1ms(); //延时 1ms // 如果 IRsignal 是 "1", //等待上升沿 // 从上升沿那一时刻 //每个字节 8 个 bit 的判断 //分别读取 4 个字节
如
果
if((IRcode[2]+IRcode[3])!=255)hongwaibz=0; for(j=50;j>0;j--) delay_1ms(); //延时 1ms
} }
}
P1IE|=HONGWAI_1;//外部中断允许 } #endif
0x00,0x00,0x00,0xFE,0x22,0x22,0x22,0x22,0xFE,0x22,0x22,0x22,0x22, 0xFE,0x00,0x00, 0x80,0x40,0x30,0x0F,0x02,0x02,0x02,0x02,0xFF,0x02,0x02,0x42,0x82, 0x7F,0x00,0x00,/*"用",0*/
0x80,0x40,0x20,0xF8,0x07,0x22,0x18,0x0C,0xFB,0x48,0x48,0x48,0x68, 0x48,0x08,0x00, 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0xFF,0x04,0x04,0x04,0x04, 0x06,0x04,0x00,/*"作",5*/
//********************************************************** ************ char IRcode[4]={0,0,0,0}; //定义一个 4 字节的数组用来存储代码
uchar hongwaibz=1; void int_timer(void) { TACTL|=TASSEL1+TACLR;//选择 SMCLK 作为定时器的时钟 TACTL|=MC0;//增加模式,并且使能中断 TACCR0=9999;//中断周期 } void int_ex(void) //初始化 P1.0 口外部中断 { P1DIR&=HONGWAI_0;//输入口 P1SEL&=HONGWAI_0; //使用普通 IO P1IE|=HONGWAI_1;//外部中断允许 P1IES|=HONGWAI_1;//下降沿触发中断 P1IFG= 0x00; // 清除 P1 口中断标志 } void int_clk() { char i; BCSCTL1&=~XT2OFF; //打开 XT 振荡器 BCSCTL2|=SELM1+SELS+DIVS_2+DIVS_1;//MCLK SMCLK 1M 8 分频 do 8M and
d_hz(3,1,1,0); d_hz(5,1,2,0); d_hz(7,1,3,0); d_hz(9,1,2,0); dchar_16(11,1,':',0); dchar_16(12,1,IRcode[1]/100+48,0); dchar_16(13,1,IRcode[1]%100/10+48,0); dchar_16(14,1,IRcode[1]%10+48,0); d_hz(1,2,4,0); d_hz(3,2,5,0); d_hz(5,2,2,0); dchar_16(7,2,':',0); dchar_16(8,2,IRcode[2]/100+48,0); dchar_16(9,2,IRcode[2]%100/10+48,0); dchar_16(10,2,IRcode[2]%10+48,0); d_hz(1,3,4,0); d_hz(3,3,5,0); d_hz(5,3,2,0); d_hz(7,3,3,0); d_hz(9,3,2,0); dchar_16(11,3,':',0); dchar_16(12,3,IRcode[3]/100+48,0);
0x00,0x00,0xFE,0x12,0x72,0x92,0x12,0x12,0x12,0x11,0x91,0x71,0x01, 0x00,0x00,0x00, 0x40,0x30,0x4F,0x40,0x20,0x21,0x12,0x0C,0x0C,0x12,0x11,0x20,0x60, 0x20,0x00,0x00,/*"反",3*/
CodeTemp=CodeTemp|0x80; if(n<8) CodeTemp=CodeTemp>>1; } else
if(n<8)CodeTemp=CodeTemp>>1;// IRsignal 是"0",则向右移一位,自动补"0" } IRcode[m]=CodeTemp; CodeTemp=0; }
_BIS_SR(GIE); 即可。 *******************/ #ifndef _infrared_H #define _infrared_H #include<msp430X14X.h> //********************************************************** ************ #define #define #define HONGWAI_1 HONGWAI_0 HONGWAI_IN 0x01//红外接收头接于 P1.1 0xfe (P1IN&HONGWAI_1) //P1.1 输入
//主函数 #include<msp430x14x.h> #include<12864-9.h> #include<infrared.h> #define uchar unsigned char #define uint unsigned int
char dataa[4]={0,0,0,0}; /**************单片时钟机初始化*************/ void mcu_int(void) { uchar i; WDTCTL = WDTPW + WDTHOLD; //------------------------时钟设置----------------------------------// BCSCTL1&=~XT2OFF; //打开 XT 振荡器 8M
0x08,0x08,0xFF,0x88,0x48,0x00,0xF0,0x97,0xF5,0x05,0xF5,0x95,0x97, 0xF0,0x00,0x00, 0x42,0x81,0x7F,0x00,0x40,0x42,0x22,0x12,0x0A,0xFF,0x06,0x0A,0x32, 0x62,0x22,0x00,/*"操",4*/