找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2765|回复: 2
收起左侧

STM32战舰迷你板的红外实验加了蜂鸣器 附程序

[复制链接]
ID:562896 发表于 2019-6-15 12:08 | 显示全部楼层 |阅读模式
红外遥控是一种无线、非接触控制技术,具有抗干扰能力强,信息传输可靠,功耗低,成
本低,易实现等显著优点,被诸多电子设备特别是家用电器广泛采用,并越来越多的应用到计
算机系统中。
由于红外线遥控不具有像无线电遥控那样穿过障碍物去控制被控对象的能力,所以,在设
计红外线遥控器时,不必要像无线电遥控器那样,每套(发射器和接收器)要有不同的遥控频率
或编码(否则,就会隔墙控制或干扰邻居的家用电器),所以同类产品的红外线遥控器,可以有
相同的遥控频率或编码,而不会出现遥控信号“串门”的情况。这对于大批量生产以及在家用
电器上普及红外线遥控提供了极大的方面。由于红外线为不可见光,因此对环境影响很小,再
由红外光波动波长远小于无线电波的波长,所以红外线遥控不会影响其他家用电器,也不会影
响临近的无线电设备。
红外遥控的编码方式目前广泛使用的是:PWM(脉冲宽度调制)的 NEC 协议和 Philips
PPM(脉冲位置调制) 的 RC-5 协议的。ALIENTEK MiniSTM32 开发板配套的遥控器使用的是
NEC 协议,其特征如下:
1、8 位地址和 8 位指令长度;
2、地址和命令 2 次传输(确保可靠性)
3、PWM 脉冲位置调制,以发射红外载波的占空比代表“0”和“1”;
4、载波频率为 38Khz;
5、位时间为 1.125ms 或 2.25ms;
NEC 码的位定义:一个脉冲对应 560us 的连续载波,一个逻辑 1 传输需要 2.25ms(560us
脉冲+1680us 低电平),一个逻辑 0 的传输需要 1.125ms(560us 脉冲+560us 低电平)。而遥控
接收头在收到脉冲的时候为低电平,在没有脉冲的时候为高电平,这样,我们在接收头端收到
的信号为:逻辑 1 应该是 560us 低+1680us 高,逻辑 0 应该是 560us 低+560us 高。
NEC 遥控指令的数据格式为:同步码头、地址码、地址反码、控制码、控制反码。同步码
由一个 9ms 的低电平和一个 4.5ms 的高电平组成,地址码、地址反码、控制码、控制反码均是
8 位数据格式。按照低位在前,高位在后的顺序发送。采用反码是为了增加传输的可靠性(可
用于校验)。
我们遥控器的按键▽按下时,从红外接收头端收到的波形如图
红外遥控是一种无线、非接触控制技术,具有抗干扰能力强,信息传输可靠,功耗低,成
本低,易实现等显著优点,被诸多电子设备特别是家用电器广泛采用,并越来越多的应用到计
算机系统中。
由于红外线遥控不具有像无线电遥控那样穿过障碍物去控制被控对象的能力,所以,在设
计红外线遥控器时,不必要像无线电遥控器那样,每套(发射器和接收器)要有不同的遥控频率
或编码(否则,就会隔墙控制或干扰邻居的家用电器),所以同类产品的红外线遥控器,可以有
相同的遥控频率或编码,而不会出现遥控信号“串门”的情况。这对于大批量生产以及在家用
电器上普及红外线遥控提供了极大的方面。由于红外线为不可见光,因此对环境影响很小,再
由红外光波动波长远小于无线电波的波长,所以红外线遥控不会影响其他家用电器,也不会影
响临近的无线电设备。
红外遥控的编码方式目前广泛使用的是:PWM(脉冲宽度调制)的 NEC 协议和 Philips
PPM(脉冲位置调制) 的 RC-5 协议的。ALIENTEK MiniSTM32 开发板配套的遥控器使用的是
NEC 协议,其特征如下:
1、8 位地址和 8 位指令长度;
2、地址和命令 2 次传输(确保可靠性)
3、PWM 脉冲位置调制,以发射红外载波的占空比代表“0”和“1”;
4、载波频率为 38Khz;
5、位时间为 1.125ms 或 2.25ms;
NEC 码的位定义:一个脉冲对应 560us 的连续载波,一个逻辑 1 传输需要 2.25ms(560us
脉冲+1680us 低电平),一个逻辑 0 的传输需要 1.125ms(560us 脉冲+560us 低电平)。而遥控
接收头在收到脉冲的时候为低电平,在没有脉冲的时候为高电平,这样,我们在接收头端收到
的信号为:逻辑 1 应该是 560us 低+1680us 高,逻辑 0 应该是 560us 低+560us 高。
NEC 遥控指令的数据格式为:同步码头、地址码、地址反码、控制码、控制反码。同步码
由一个 9ms 的低电平和一个 4.5ms 的高电平组成,地址码、地址反码、控制码、控制反码均是
8 位数据格式。按照低位在前,高位在后的顺序发送。采用反码是为了增加传输的可靠性(可
用于校验)。
我们遥控器的按键▽按下时,从红外接收头端收到的波形如图

红外遥控是一种无线、非接触控制技术,具有抗干扰能力强,信息传输可靠,功耗低,成
本低,易实现等显著优点,被诸多电子设备特别是家用电器广泛采用,并越来越多的应用到计
算机系统中。
由于红外线遥控不具有像无线电遥控那样穿过障碍物去控制被控对象的能力,所以,在设
计红外线遥控器时,不必要像无线电遥控器那样,每套(发射器和接收器)要有不同的遥控频率
或编码(否则,就会隔墙控制或干扰邻居的家用电器),所以同类产品的红外线遥控器,可以有
相同的遥控频率或编码,而不会出现遥控信号“串门”的情况。这对于大批量生产以及在家用
电器上普及红外线遥控提供了极大的方面。由于红外线为不可见光,因此对环境影响很小,再
由红外光波动波长远小于无线电波的波长,所以红外线遥控不会影响其他家用电器,也不会影
响临近的无线电设备。
红外遥控的编码方式目前广泛使用的是:PWM(脉冲宽度调制)的 NEC 协议和 Philips
PPM(脉冲位置调制) 的 RC-5 协议的。ALIENTEK MiniSTM32 开发板配套的遥控器使用的是
NEC 协议,其特征如下:
1、8 位地址和 8 位指令长度;
2、地址和命令 2 次传输(确保可靠性)
3、PWM 脉冲位置调制,以发射红外载波的占空比代表“0”和“1”;
4、载波频率为 38Khz;
5、位时间为 1.125ms 或 2.25ms;
NEC 码的位定义:一个脉冲对应 560us 的连续载波,一个逻辑 1 传输需要 2.25ms(560us
脉冲+1680us 低电平),一个逻辑 0 的传输需要 1.125ms(560us 脉冲+560us 低电平)。而遥控
接收头在收到脉冲的时候为低电平,在没有脉冲的时候为高电平,这样,我们在接收头端收到
的信号为:逻辑 1 应该是 560us 低+1680us 高,逻辑 0 应该是 560us 低+560us 高。
NEC 遥控指令的数据格式为:同步码头、地址码、地址反码、控制码、控制反码。同步码
由一个 9ms 的低电平和一个 4.5ms 的高电平组成,地址码、地址反码、控制码、控制反码均是
8 位数据格式。按照低位在前,高位在后的顺序发送。采用反码是为了增加传输的可靠性(可
用于校验)

单片机源程序如下:
  1. #include "led.h"
  2. #include "delay.h"
  3. #include "sys.h"
  4. #include "usart.h"
  5. #include "lcd.h"
  6. #include "remote.h"  
  7. #include "ds18b20.h"  
  8. #include "beep.h"

  9. void ds18b20(void)
  10. {
  11. u8 t=0;        
  12. short temperature;
  13.                 while(DS18B20_Init())        //DS18B20初始化        
  14.         {
  15.                 LCD_ShowString(60,130,200,16,16,(u8*)"DS18B20 Error");
  16.                 delay_ms(200);
  17.                 LCD_Fill(60,130,239,90+16,WHITE);
  18.                  delay_ms(200);
  19.         }               
  20. POINT_COLOR=BLUE;//设置字体为蓝色
  21.          LCD_ShowString(60,130,200,16,16,(u8*)"Temp:   . C");        
  22. if(t%10==0)//每100ms读取一次
  23.                 {                                                                          
  24.                         temperature=DS18B20_Get_Temp();        
  25.                         if(temperature<0)
  26.                         {
  27.                                 LCD_ShowChar(60+40,130,'-',16,0);                        //显示负号
  28.                                 temperature=-temperature;                                        //转为正数
  29.                         }else LCD_ShowChar(60+40,130,' ',16,0);                        //去掉负号
  30.                         LCD_ShowNum(60+40+8,130,temperature/10,2,16);        //显示正数部分            
  31.                            LCD_ShowNum(60+40+32,130,temperature%10,1,16);        //显示小数部分                    
  32.                 }                                   
  33.                  delay_ms(10);
  34.                 t++;
  35. }

  36. int main(void)
  37. {
  38.         u8 key;
  39.         u8 *str=0;         
  40.         delay_init();                     //延时函数初始?
  41.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断优先级分组2         
  42.         uart_init(9600);                 //串口初始化为9600
  43.         LED_Init();                                  //初始化与LED连接的硬件接口
  44.          LCD_Init();
  45.         Remote_Init();                        //红外接收初始化        
  46.         BEEP_Init();//蜂鸣器初始化                        
  47.          POINT_COLOR=RED;//设置字体为红色
  48.                 LCD_ShowString(60,50,200,16,16,(u8*)"Mini STM32");        
  49.                 LCD_ShowString(60,70,200,16,16,(u8*)"REMOTE TEST");        
  50.            LCD_ShowString(60,90,200,16,16,(u8*)"KEYVAL:");               
  51.            LCD_ShowString(60,110,200,16,16,(u8*)"SYMBOL:");
  52.         while(1)
  53.         {
  54.                 key=Remote_Scan();        
  55.                 if(key)
  56.                 {         
  57.                         LCD_ShowNum(116,90,key,3,16);                //显示键值         
  58.                         switch(key)
  59.                         {
  60.                                 case 0:str=(u8*)"ERROR";break;                           
  61.                                 case 162:str=(u8*)"POWER",NVIC_SystemReset();break;         //复位   
  62.                                 case 98:str=(u8*)"UP",LED1=0;break; //DS1点亮   
  63.                                 case 2:str=(u8*)"PLAY",ds18b20();break;        //DS1熄灭         
  64.                                 case 226:str=(u8*)"ALIENTEK",play();break;                  
  65.                                 case 194:str=(u8*)"RIGHT",LED0=0;break;         //DS0点亮  
  66.                                 case 34:str=(u8*)"LEFT",LED0=1;break;         //DS0熄灭
  67.                                 case 224:str=(u8*)"VOL-",LCD_Fill(10,200,230,300,LGRAY);break;                  
  68.                                 case 168:str=(u8*)"DOWN",LED1=1;break;                  
  69.                                 case 144:str=(u8*)"VOL+",LCD_Fill(10,200,230,300,BROWN);break;                    
  70.                                 case 104:str=(u8*)"1",LCD_Fill(10,200,230,300,WHITE);break;                  
  71.                                 case 152:str=(u8*)"2",LCD_Fill(10,200,230,300,BLACK);break;           
  72.                                 case 176:str=(u8*)"3",LCD_Fill(10,200,230,300,BLUE);break;            
  73.                                 case 48:str=(u8*)"4",LCD_Fill(10,200,230,300,RED);break;                    
  74.                                 case 24:str=(u8*)"5",LCD_Fill(10,200,230,300,MAGENTA);break;                    
  75.                                 case 122:str=(u8*)"6",LCD_Fill(10,200,230,300,GREEN);break;                  
  76.                                 case 16:str=(u8*)"7",LCD_Fill(10,200,230,300,CYAN);break;                                                                  
  77.                                 case 56:str=(u8*)"8",LCD_Fill(10,200,230,300,YELLOW);break;         
  78.                                 case 90:str=(u8*)"9",LCD_Fill(10,200,230,300,BRRED);break;
  79.                                 case 66:str=(u8*)"0",LCD_Fill(10,200,230,300,GRAY);break;
  80.                                 case 82:str=(u8*)"DELETE",LCD_Fill(60,130,239,130+16,WHITE);;break;                 
  81.                         }
  82.                         LCD_Fill(116,110,116+8*8,110+16,WHITE);        //清除之前的显示
  83.                         LCD_ShowString(116,110,200,16,16,str);        //显示SYMBOL
  84.                 }else delay_ms(10);         
  85.                
  86.         }
  87. }
复制代码

所有资料51hei提供下载:
红外遥控器实验.rar (380.46 KB, 下载次数: 16)
回复

使用道具 举报

ID:656093 发表于 2019-12-4 17:05 | 显示全部楼层
添加蜂鸣器功能,怎么不响呢,上边代码并不是蜂鸣器的,还请大神请教
回复

使用道具 举报

ID:657755 发表于 2019-12-6 19:56 | 显示全部楼层
蜂鸣器代码怎么写啊
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表