唯众万能红外模块,外形如图所示,共有4个红外发射头,其中有一个是发射学习一体的,红外学习的时候一定要对准发射学习一体的头子。万能红外模块是使用串口跟CC2530单片机通信的。CC2530通过串口给模块发送“0x88 0x01 0x00 0x00 XX”则模块进入学习模式;发送“0x86 0x01 0x00 0x00 XX”则模块进入执行模式。各个字段的含义Byte1表示命令,Byte2表示键值,Byte3和Byte4预留,XX表示前4个自己的异或和。
#include "main.h" //*------------------------------------------------------------- //*功能说明: 定时器3,可用于系统定时器,System1MsCnt毫秒计时器 //*全局参数: System1MsCnt--毫秒计数器 //*------------------------------------------------------------- unsigned long System1MsCnt=0; void Timer3Init(void) { T3CTL |= 0x08 ; //开溢出中断 T3IE = 1; //开总中断和T3中断 T3CTL &= ~0x03; //自动重装00->0xff T3CTL |= 0x10; //启动 EA = 1; //开总中断 } #pragma vector = T3_VECTOR __interrupt void T3_ISR(void) { static unsigned char cnt=0; IRCON = 0x00; //清中断标志, 也可由硬件自动完成 if(cnt++ > 51) //1ms 示波器观察1.02ms { //经过示波器测量确保精确 cnt = 0; //计数清零 System1MsCnt++; } } void clock_setup(void) { CLKCONCMD &= ~0x40; //设置系统时钟源为32MHZ晶振 while(CLKCONSTA & 0x40); //等待晶振稳定 CLKCONCMD &= ~0x47; //设置系统主时钟频率为32MHZ Delay_ms(500); //让设备稳定 Timer3Init(); //可选项,系统1ms计数器 } void InitBuzzer(void) { P1DIR |= 0x08; //P1_3 定义为输出 BUZZER = 0; //BUZZER 初始化关闭 } void init_sensor_io(void) { //1.设置IO为普通IO P0SEL |= 0xC0; P1SEL |= 0x07; //2.设置编码口为输入 P0DIR &= ~0xC0; P1DIR &= ~0x07; } uchar get_sensor_id(void) { volatile uchar temp = P0_6<<4|P0_7<<3|P1_0<<2|P1_1<<1|P1_2; return temp; } void InitKey(void) { P2DIR &= ~0x01; //P20定义为输入 KEY = 1; } uchar CheckKey(void) { uint i=0; if(KEY == 0) { do{ i++; Delay_ms(10); }while(KEY==0); if(i>1 && i<50){ return 1; } if(i>100 && i<300){ return 2; } } return 0; } void InitIrCmd(uchar* ieBuf,uchar d0,uchar d1,uchar d2,uchar d3) { ieBuf[0] = d0; ieBuf[1] = d1; ieBuf[2] = d2; ieBuf[3] = d3; ieBuf[4] = d0^d1^d2^d3; } void main(void) { uchar mode=0,temp8=0,key=0; uchar irCmd[5]; clock_setup(); //系统时钟设置,精确延时必须要设置 port_init(); initial_lcd(); InitBuzzer(); InitUart(9600); clear_screen(); //清屏 disp_string_8x16_16x16(1,1,"武汉唯众智创科技"); //显示字符串,括号里的参数分别为(PAGE,列,字符串指针) disp_string_8x16_16x16(3,1,"----实验3.4-----"); Delay_ms(1000); clear_screen(); disp_string_8x16_16x16(1,1,"----执行模式----"); //默认进入执行模式 while(1) { Delay_ms(10); temp8 = get_sensor_id(); if(temp8!=10){ disp_string_8x16_16x16(1,1,"请插万能红外模块"); disp_string_8x16_16x16(3,1,"----实验3.4-----"); Delay_ms(1000); continue; } key = CheckKey(); if(key==1){ //短按--触发执行或者学习功能 clear_vertical(2); InitIrCmd(irCmd,mode+0x86,1,0,0); //0x86--执行 0x88--学习 UartSendBytes(irCmd,5); UartRecvBytes(&temp8,1,50); if(temp8 == 0x89){ disp_string_8x16_16x16(3,1,"成功"); } }else if(key==2){ //长按--切换执行和学习 clear_screen(); mode = mode==0?2:0; if(mode==0){ //默认执行模式 disp_string_8x16_16x16(1,1,"----执行模式----"); }else{ //长按后进入学习模式 disp_string_8x16_16x16(1,1,"----学习模式----"); } } } } |