留声机遥控器上编程是什么

留声机遥控器上编程是什么,第1张

遥控器上有一个红外发射装置,可以发送红外信号,而mbot小车上有一个红外接收装置(mBot小车自己也有红外发射装置,这里暂时不讲),接收遥控器发送过来的红外信号,再通过程序处理接收到的信号。

mBot小车的红外接收装置位于小车控制板前部,

图片

所以如果我们要用到红外遥控器控制mBot时,红外遥控器需要正对着小车,才能让小车更好地获取红外遥控信号。

图片

二、命令

1. 红外遥控命令

在慧编程中,用来获取红外遥控信号的命令是:【红外遥控器按下】指令。这个命令的功能是,判断选项中的按键是否被按下。当遥控器按下选项中的按键时,返回逻辑值1,也就是“被按下”,否则返回逻辑值0,也就是“没有被按下”。

2. 红外遥控控制LED

下面我们试着用红外遥控控制mBot上的LED灯。拖动[如果那么否则]指令到脚本区,当[红外遥控器按下左]时,让左灯亮红色.再拖动[如果那么]指令到否则这个分支里,当[红外遥控器按下右]时,让右灯亮红色,为了不停的进行检测,还需要在外层加上[重复执行]指令得到以下程序

把程序上传到小车中。

我们发现,当按下遥控器左键,小车左边亮红灯,当按下遥控器右键,小车右边亮红灯。

3. 红外遥控控制电机

类似地,我们再试着用红外遥控控制mBot上的电机。当按下[上]键盘,让小车以50%的速度前进,当按下[下]键时,让小车以50%的速度后退,按下其它键时,小车停止运动.

程序太长,须仔细研究。

#define main_GLOBALS

#include <reg51.h>

#include "main.h"

#include "SAA3010.h"

unsigned char counter

unsigned char temp

sbit P2_0 = 0xA0

sbit P2_1 = 0xA1

sbit P2_2 = 0xA2

sbit P2_3 = 0xA3

void decode_init(void)

{

load_code_detected=0

repeat_code_detected=0

decode_error=0

temp1=0

temp2=0

temp3=0

temp4=0

TH1=0

TL1=0

TR1=0

}

void main(void)

{  

EX0=1

IT0=1

TMOD=0x11

ET0=1

TH0=128

TL0=0

TR0=1

P0=0

TH1=0

TL1=0

decode_init()

EA=1

counter=0

data_available=0

while(1)

{

if(data_available==1)

{

            if (key_code==01) //display "1"

            {

P2_0=0 //选中四个数码管  

P2_1=0  

P2_2=0 

P2_3=0   

P0=0xf9 

            }

            if (key_code==0x02) //display "2"

            {

P2_0=0 //选中四个数码管  

P2_1=0  

P2_2=0 

P2_3=0   

P0=0xa4 

            }

            if (key_code==0x03) //display "3"

            {

P2_0=0 //选中四个数码管  

P2_1=0  

P2_2=0 

P2_3=0   

P0=0xb0 

            }

            if (key_code==0x04) //display "4"

            {

P2_0=0 //选中四个数码管  

P2_1=0  

P2_2=0 

P2_3=0   

P0=0x99 

            }

            if (key_code==0x05) //display "5"

            {

P2_0=0 //选中四个数码管  

P2_1=0  

P2_2=0 

P2_3=0   

P0=0x92 

            }

            if (key_code==0x06) //display "6"

            {

P2_0=0 //选中四个数码管  

P2_1=0  

P2_2=0 

P2_3=0   

P0=0x82 

            }

            if (key_code==0x07) //display "7"

            {

P2_0=0 //选中四个数码管  

P2_1=0  

P2_2=0 

P2_3=0   

P0=0xf8

            }

            if (key_code==0x08) //display "8"

            {

P2_0=0 //选中四个数码管  

P2_1=0  

P2_2=0 

P2_3=0   

P0=0x80 

            }

            if (key_code==0x09) //display "9"

            {

P2_0=0 //选中四个数码管  

P2_1=0  

P2_2=0 

P2_3=0   

P0=0x90 

            }

            if (key_code==0x00) //display "0"

            {

P2_0=0 //选中四个数码管  

P2_1=0  

P2_2=0 

P2_3=0   

P0=0xc0 

            }

data_available=0

}

}

}

//**********************************************************************************************************************

void key_isr(void) interrupt 0

{

EX0=0                                 // 立即关闭外部中断,转为查询方式解码

led=0                                 // 开LED表示收到红外信号

    temp=SAA3010_decode()   // 解码

if(temp==1) goto key_isr_exit

counter=0

key_isr_exit:

decode_init()

led=1

EX0=1

}

void Timer0_isr(void) interrupt 1

{

counter++

if(counter>3)

{

if(led==0) led=1

counter=0

}

ET0=1

}

#define SAA3010_GLOBALS

#include <reg51.h>

#include "SAA3010.h"

#include "main.h"

//===========================================================================================================

// 该函数的作用是每调用一次就在temp1-4组成的32bit长度的最低位上移入

// 一个0或者1,数据由bitdata确定

void SAA3010_cycle_data(unsigned char bitdata)

{

temp4=temp4<<1

if((temp3&0x80)==1) temp4=temp4|0x01

else temp4=temp4&0xfe

temp3=temp3<<1

if((temp2&0x80)==1) temp3=temp3|0x01

else temp3=temp3&0xfe

temp2=temp2<<1

if((temp1&0x80)==1) temp2=temp2|0x01

else temp2=temp2&0xfe

temp1=temp1<<1

if(bitdata==1) temp1=temp1|0x01

else temp1=temp1&0xfe

}

//===========================================================================================================

// 解码出错返回1,对则返回0

unsigned char SAA3010_decode(void)

{

//-----------------------------------------------------------------------------------------------------------

unsigned char count=0

TR1=1                                 // 启动计时

while(1)

{

while(ir_receive==0)                  // 等待电平变高,不需要超时监测

TR1=0                                 // 高电平(对发射电路而言)测试结束

high_level_time=TH1*256+TL1           // 记录高电平的数据

//-----------------------------------------------------------------------------------------------------------

TH1=0 TL1=0 TR1=1                  // 启动对低电平的测试

//-----------------------------------------------------------------------------------------------------------

// 处理低电平

if((high_level_time<750)||(high_level_time>1800)) return 1    // 不是合格的电平

if((high_level_time>750)&&(high_level_time<1000)){SAA3010_cycle_data(0)count+=1} // 移入一个0

if((high_level_time>1500)&&(high_level_time<1800)) {SAA3010_cycle_data(0)SAA3010_cycle_data(0)count+=2} // 移入两个0

while(ir_receive==1)                   // 等待电平变低

{

if(TH1>0x08) break                // 高电平超时,正常情况下是测试结束,异常时则是出错

}

       

TR1=0                                 // 低电平(对发射电路而言)测试结束

if(TH1>0x08) {break}

low_level_time=TH1*256+TL1            // 保存低电平的数据

TH1=0 TL1=0 TR1=1  // 为增加计时的准确性,数据的处理都是在计时过程里

//-----------------------------------------------------------------------------------------------------------

// 处理高电平

if((low_level_time<750)||(low_level_time>1800)) return 1    // 不是合格的电平

if((low_level_time>750)&&(low_level_time<1000)) {SAA3010_cycle_data(1) count+=1} // 移入一个0

if((low_level_time>1500)&&(low_level_time<1800)) {SAA3010_cycle_data(1) SAA3010_cycle_data(1)count+=2} // 移入两个0

}                           

if(count==26) {SAA3010_cycle_data(1) count++}

if(count!=27) return 1

led=0

// 提取按健信息

key_code=0

if((temp1>>1)&0x01) key_code=key_code|0x01

else key_code=key_code&0xfe

if((temp1>>3)&0x01) key_code=key_code|0x02

else key_code=key_code&0xfd

if((temp1>>5)&0x01) key_code=key_code|0x04

else key_code=key_code&0xfb

if((temp1>>7)&0x01) key_code=key_code|0x08

else key_code=key_code&0xf7

if((temp2>>1)&0x01) key_code=key_code|0x10

else key_code=key_code&0xef

if((temp2>>3)&0x01) key_code=key_code|0x20

else key_code=key_code&0xdf

// 提取系统信息

sys_code=0

if((temp2>>5)&0x01) sys_code=sys_code|0x01

else sys_code=sys_code&0xfe

if((temp2>>7)&0x01) sys_code=sys_code|0x02

else sys_code=sys_code&0xfd

if((temp3>>1)&0x01) sys_code=sys_code|0x04

else sys_code=sys_code&0xfb

if((temp3>>3)&0x01) sys_code=sys_code|0x08

else sys_code=sys_code&0xf7

if((temp3>>5)&0x01) sys_code=sys_code|0x10

else sys_code=sys_code&0xef

if((temp3>>7)&0x01) sys_code=sys_code|0x20

else sys_code=sys_code&0xdf

data_available=1

return 0

}

//===========================================================================================================

手机中开启红外线功能,主要是智能遥控,控制设备开启、关闭和调节时,发射红外线,这里介绍下方法。

1、首先解锁vivo x6,在Android 5.0.2中找到实用工具中的【智能遥控】。

2、打开【智能遥控】 *** 作界面,选择遥控设置类型,这里遥控空调。

3、接着选择遥控器类型,点击空调图标。

4、选中跟实物空调一样的品牌遥控器,点击电源键,发射红外线,查看空调是否有响应,如果有点击【是】按钮。

5、这时上方的电源键变成了模式按钮,可以用来调节空调(温度、风向等)。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11275881.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-14
下一篇 2023-05-14

发表评论

登录后才能评论

评论列表(0条)

保存