|
|
楼主 |
发表于 2016-11-1 03:58:32
|
显示全部楼层
本帖最后由 我爱萝丽爱萝丽 于 2016-11-1 04:18 编辑
1.4 制定一个简单的通信协议
实验到这里,还有一个很不爽的问题需要解决:别的遥控器也能控制我们的接收机!
怎样让电视的遥控器只能控制电视,我们的遥控器只控制我们的呢?
这就跟二战时的电台谍战一样了,我们的电台可以收到敌人的信息,敌人的电台也能收到我们的,当时是怎么保密的呢?
欲保密,先加密。
制定一套跟别人不同的通信协议,就能让别的遥控器对你失灵了!
电视遥控器的通信协议很复杂,我们不必学他,给自己添烦恼,而是另辟蹊径,自己定义自己的协议。
这里先举个例子,定义一个超简单的协议:
发射20ms红外信号,代表按键1;
发射30ms红外信号,代表按键2;
发射40ms红外信号,代表按键3……
是不是特别简单(∩_∩)
在上一小节,我们发射红外的程序,发射一次是26微秒,发射100次才2.6ms,20ms需要769次。
用程序控制循环的时间,是不是跟以前的学的delay_n_ms()类似?如果忘记可以回去复习一下知识点(18)。
void TX_IR(unsigned int n)//发射N个红外信号 时间是26us*N
{
while(n)
{
IR_LED=1; //发射一个38KHz方波红外信号
Delay13us();
IR_LED=0;
Delay13us();
n=n-1;
}
}
遥控器用旧知识可以搞定,接收机要测量时间需要新技能:
知识点(42) 用while测量低电平时间
while(IR_IN==0) //如果引脚一直为低电平,一直循环
{
Delay1ms();
time=time+1; //每循环一次,就记录了1ms时间
}
循环程序不仅可以用来延时,还可以用来计时。当引脚变成高电平1时,IR_IN==0就不是“真”的了,
循环自动结束,这时看time的值就知道时间过去多少毫秒了。
当遥控器发射了20ms,由于环境的干扰,接收机可能收到20ms,也可能只收到18ms,有没有办法判断一个范围呢?
知识点(43) && “并且”运算符
if(time>15 && time<25)
两个&&代表“并且”的意思,time大于15,并且小于25,两个都正确才行。
用这样的方式,可以同时判断两个条件。
接收机参考程序,遥控器可以控制接收机的亮灭,更多功能就要看大家自己的练习了。甚至可以和第一个项目结合起来,遥控控制七色光芒。大家可以把自己的程序上传上来相互交流。
- #include<reg51.h>
- sbit LED=P3^5; //定义指示灯
- sbit IR_IN=P3^4; //定义红外接收头引脚
- unsigned char time; //定义一个数据,记录时间
- void Delay1ms() //@12.000MHz
- {
- unsigned char i, j;
- i = 12;
- j = 169;
- do
- {
- while (--j);
- } while (--i);
- }
- main()
- {
-
- while(1)
- {
-
- if(IR_IN==0) //收到红外数据引脚变成低电平,开始测量
- {
- time=0; //先把时间清零
- while(IR_IN==0) //如果引脚一直为低电平,一直循环
- {
- Delay1ms();
- time=time+1; //每循环一次,就记录了1ms时间
- }
- //引脚变成高电平,循环结束
-
- if(time>15&&time<25)//16ms~24ms低电平,按键1按下
- {
- LED=1;
- }
-
- if(time>25&&time<35)//26ms~34ms低电平,按键2按下
- {
- LED=0;
- }
- }
-
- }
- }
复制代码
遥控器参考程序:
|
| |