如何制作一个简易的自制红外线发射器去

怎样制作一个简单的红外报警器,给个电路图谢谢啦
这个简单,试一下吧
为您推荐:
其他类似问题
扫描下载二维码2016 R&S多域测试应用会议
智能后视镜产品方案对接会
中国LED智能照明高峰论坛
第三届·无线通信技术研讨会
第二届·中国IoT大会
ETFo智能安防技术论坛
移入鼠标可放大二维码
动式红外线报警器的简易制作方法
来源:不详
作者:527dz日 10:14
[导读] 被动式红外线报警器的简易制作方法
本实验将制做一个简单的被动式红外线防盗报警器。该报警器由红外线发射、接收、蜂鸣器和LED指示灯组
被动式红外线报警器的简易制作方法
本实验将制做一个简单的被动式红外线防盗报警器。该报警器由红外线发射、接收、蜂鸣器和LED指示灯组成。正常情况下,绿色的LED常烁,表示监控区域正常。一旦监控区域有人闯入,绿色LED熄灭,红色的LED快速闪烁,同时蜂鸣器立即报警。
需要准备的器材:Atmega8、红色LED一只、绿色LED一只、万能实验板一块、5V电源、电阻、TTL0038或者其他类似38KHZ的红外接收头、5V长鸣型蜂鸣器。
实验电路图及工作原理
该电路工作原理非常简单,Atmega8的PD0端口输出经过调制的38KHZ的方波信号,然后经Q2驱动红外线发射管LED0发出红外线信号。TL0038是集红外线信号接收放大为一体的接收器。其中心接收频率为38KZH,输出为TTL电平,平时输出高电平,当收到码信号后,输出低电平。
BELL为长鸣蜂鸣器,两个引脚分别为正负极,当正负极两端加上5V电压后,蜂鸣器发出响声。注意,该蜂鸣器两脚不能接反,否则蜂鸣器会烧毁。
电路工作后,正常情况下TL0038接收不到红外信号,而输出高电平。当有物体出现在发射管前方时,TTL0038会接收到从物体上反射回来的红外光信号,然后输出低电平通知MCU打开蜂鸣器报警。
本实验的程序主要要完成三大功能:38KHZ载波信号的产生、红外接收头TL0038输出电平的检测、LED和蜂鸣器的驱动。本程序使用8位定时计数器T/C0溢出中断使PD0产生38KHZ的方波信号,然后驱动红外线发射管。T/C0计数器是单一向上计数器,其计数值TCNT0一旦计数到0XFF后,T/C0马上产生溢出中断。因此,我们可以通过设置TCNT0的初始值来调整中断产生的频率。每产生一次中断就改变一次PD0的电平状态,从而在PD0口产生38KHZ的方波信号。
本实验MCU采用内部8MHZ的RC时钟信号,T/C0的时钟源采用系统时钟8分频,即每计一个数(TCNT0增加1)需要1us的时间。38KZH的时钟周期大约为26us左右,因此,半周期需要计数13次左右,即TCNT0初始值为256-13=243。另外,我们还需要在38KHZ的载波信号上调制上一个码信号,也就是说38KHZ的载波信号不是一直在产生,而是间断的发射。如下图所示:
同时,程序通过不断地读取
PC5脚的电平值来判断TL0038是否接收到红外信号。一旦连续检测到N次PC5为低电平,则立即打开蜂鸣器和红色的LED。之所以要连续检测N次,主要是防止TL0038上产生杂波信号而误告警。
报警器的相关文章
报警器的相关下载
红外线相关文章
红外线相关下载
技术交流、积极发言! 发表评请遵守相关规定。
不论是不温不火的智能穿戴、智能家居类产品,还是最近大火的各种用途的智能机器人。我们明显感受到在硬件智能化的过程中,语音交互已成为一项普遍...
做存储将近17年历史江波龙电子,一直坚持对存储产品的耕耘,目前产品包含U盘、卡类、SSD以及eMMC,公司秉持DMS的服务理念,不断创新存储产品设计与研发...
创新实用技术专题
版权所有 & 深圳华强聚丰电子科技有限公司如何制作简单的红外线发射器与接收器!_百度知道手把手教你制作红外遥控/巡线小车,素材简单,制作容易 - 第2页 - 单片机论坛 -
中国电子技术论坛 -
最好最受欢迎电子论坛!
后使用快捷导航没有帐号?
19:54:13  
对了,问一下,这些材料哪里买得到啊??
如果不嫌打广告的话,我自己开了家淘宝店,可以在那里买到相关材料,/item.htm?spm=a1z10.1.w006.12.ATJUzQ&id=
14:34:02  
驱动电路搭建补充知识& && &用面包板制作电机驱动电路,有个好处就是可以随时搭建实验电路,然后进行相关测试,比如上节的电源部分测试,还有L298n芯片搭建的测试,往后的红外线路测试等等,这些都可以在面包板上进行。但这同时也是其缺点,就是整个线路太过散乱,偶尔某根连接线出现插接故障,整个线路就没办法运行,专业点讲就是不具有模块化稳定性。当你需要用时需要将整个面包板拿过来使用,或者当你只有一个面包板,而你又需要进行别的电路测试,你需要将搭建好的电路拆除,再进行别的测试,这样会很不方便。所以我自己会备用好几块面包板,或者将经常用到的电路模块化。
& && &模块化电路有几种方式,一:将线路用pcb绘图软件(比如Protel、Altium Designer、Proteus等等)画好,通过自制印制电路板或者拿到专业的PCB生产商制作(拿给PCB生产商制作,会涉及到加工成本这块,一个两个不建议采用)。二:直接购买相关模块,这样最省事,但对于你学习相关的知识,比如线路板设计,跟线路板制作没有太大帮助。
& &&&对于第一种模块化电路方式,都必须掌握PCB绘图软件。对于不会的其实也不难,不需要买什么教材之类,现在就打开你的PCB绘图软件,开始画,这是唯一的途径,中间会碰到很多问题,解决它就OK了。
& &&&如果想自制印制电路板,可以参考下面的博客 /zhdiao@126/blog/static//&&有些地方需要告知各位注意下:1、单面/双面覆铜板一定要选好的,我之前买过差的覆铜板结果焊接的时候铜盘都断了。2、热转印纸,名字挺高大上的,其实大家现实生活中都有见过,就像双面胶或者海报撕掉留下来的油亮亮的那层纸,网上有售的,一沓A4纸大小几块钱搞定。3、打印的时候,一定要选用激光打印机打印。4、转印的时候需要自己把握火候,一次不行,多印几次就能掌握了。5、腐蚀液,如果有双氧水、盐酸时最好了,没有的话网上也有相关的腐蚀剂,但需要腐蚀相当长的时间。6、钻孔的时候会很蛋疼,如果画PCB的时候过孔设置的很小比如只有20mil,你就等着哭吧。用0.6mm的钻头,你会发现钻完后,连焊盘都钻没了。所以画PCB的时候一定要将过孔跟连线放大,放粗。
& && &这里说了自制PCB的注意事项,只有你自己做了,你才会知道。所以还是实践+实践。
& && &当你将自己画的PCB文件发给专业PCB板生产商的时候,你就迈出了另一步,就是商业化生产的这一步,你会发现网上卖的各种模块化的电路板,原来我也能做了。
14:40:48  
一:车体制作
材料:N20减速电机2只,电机固定座2只 固定螺丝M2x10及M2螺母各4只,万向轮1只 万向轮固定螺丝M3x6及M3螺母各4只,洞洞板1块,导线若干
制作工具:电烙铁,剪刀(钻孔用)
& && & 本智能小车选用的是N20减速电机,市面上常见的智能小车电机减速机有N20减速电机跟TT减速电机。N20跟TT减速电机的区别是齿轮箱的材质,N20是金属齿轮加金属支架,TT用的是塑料齿轮加塑料支架,N20较TT更加耐用些,另外本智能小车车架用的是洞洞板,N20的电机固定架能比较好的在洞洞板上固定。两种电机没有哪个更好,只有适合不适合。
N20减速电机& && && && && && && && && && &&&& &TT减速电机
& && &减速电机相关知识& && &减速电机分为两个个部分,电机部分跟减速机部分。电机参数一般看的是额定功率跟额定转速,减速机一般看的是速比跟齿轮传动结构。工程上一般电机功率单位用的是千瓦(KW),转速单位是转每分(rpm)。齿轮传动结构有直齿轮传动、斜齿轮传动、锥齿轮传动。
& && & 输出扭矩是电机减速机唯一要看得东西,因为扭矩才是驱动物体转动的动力,我们说的某某减速电机力大,指的就是输出扭矩大。工程上扭矩的计算公式为T=9550*P/n,T:扭矩 单位是Nm,P:功率 单位是KW,n:转速 单位是rpm。通过这样的公式可以计算出减速电机各部分的输出扭矩。下面两张图是选自某N20减速电机厂样本,各位可以进行参考计算。
某厂N20电机参数
某厂减速机参数跟图例
& && &图中电机转速除以不同的减速比得到的就是最终输出转速,你可以根据你的智能小车的实际情况进行选取,就拿我现在制作的小车为例,电机转速15200rpm,选用的是250速比减速机,输出转速为.8rpm,平均下就是1转每秒,车轮直径是43mm,乘以圆周率,大概就是一秒钟走135mm,这是空载时的速度,加上负载后速度会降低,电机参数都会有介绍,这里就不详举了。& && &另外一点可能有些人会问为什么要加减速机呢,速度还变慢了?我们可以从扭矩计算公式来看,T=9550*P/n ,转速变慢,扭矩就增大了。
& && &另外可能有人会问扭矩跟扭力一样么?其实还是有差别的,扭力=扭矩x力臂,力臂在这里就是车轮半径,那是不是车轮半径越大,扭力就越大呢?对的,你可以增加车轮半径达到增加扭力的作用。那能不能无限增大轮子半径呢,这样我的扭力不就可以无限大了么?其实里面还牵涉到一个物体的转动惯量的问题,物体转动惯量越大就越难让它转动起来。接下来就是纯机械方面的东西了,有兴趣的朋友可以深入去研究,这里就不过多深入了。
& && &接下来将电机安装架跟电机还有万向轮放在洞洞板合适的位置做上记号,安装孔位置最好在洞洞板孔上,方便打孔。注意车轮外廓不要伸出洞洞板前后沿。万向轮尽量靠近洞洞板宽度方向的中间位置,然后用剪刀钻孔,当然你可以用别的锐利的东西,或者专业的手电钻,台钻等等。
安装架摆放示意图
万向轮摆放示意图
钻孔后示意图
焊接电机引出导线,导线可以用面包板连接插线制作,我这里用的是电话线,有一定的硬度,可以跟面包板连接。
导线焊接完示意图
将M2螺母嵌入电机安装架内
将安装架固定在打好孔的洞洞板上,不要拧死,方便电机插入。(建议安装步骤)
车体制作完成示意图
车体制作完成示意图
& && &&&这里着重强调下,由于万向轮安装高度为35mm,而车轮安装高度为车轮半径21.5mm再加上电机厚度的一半6mm为27.5mm,这样会造成车体高度前后有高差,影响美观。万向轮转动会引起车体倾斜角度变化,这对后面的红外安装高度会有一定影响,但影响可以忽略。解决办法是选用一个高度为27.5mm的万向轮或者另外换车轮或者电机,或者在电机安装位置添加隔离柱等。
& && &到这里车体部分就算制作完成。
22:45:02  
笑嘻嘻谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢&&lz好人
高级工程师
00:56:53  
支持,很好很不错,原来自己也做过,有超声有循迹有无线等,后来搞ARM又加上了视频采集,看到楼主图文并茂想起了当年的自己。在此,祭奠自己的过去,同时顶一下楼主!
10:37:03  
支持,很好很不错,原来自己也做过,有超声有循迹有无线等,后来搞ARM又加上了视频采集,看到楼主图文并茂 ...
谢谢 谢谢&&想必当初做的时候也会碰到各种问题。
高级工程师
13:55:23  
谢谢 谢谢&&想必当初做的时候也会碰到各种问题。
是啊,遇到问题查资料解决问题,耐得住性子就好~
13:57:30  
三:最小51单片机制作材料全图
序号 名称 数量 1 洞洞板 1 2 220欧姆电阻 若干 3 40Pin排针 2 4 40IC插座 1 5 STC 51单片机 1 6 自锁开关 1 7 微触开关 1 8 10K欧姆电阻 1 9 10uF 25v电解电容 1 10 LED灯(颜色自定) 若干 11 30pF瓷片电容 2 12 11.0592M 晶振 1
制作工具:电烙铁,斜口钳
& && &首先,将要制作的最小51单片机系统原理图贴示如下
本制作的单片机系统跟上图有两点不同,1:本制作用的是11.0592M晶振,上图用的12M晶振,两种规格都可以,至于为什么要选择多少频率晶振,可以参考相关材料,2:本制作用的是10uF 耐压为25v的电解电容,上图用的是耐压16v的,没有太大关系。
第一步,焊接40PinIC插座
找个合适的位置放置芯片,需要考虑周边要放置那些元件,建议距离洞洞板长度方向边部5个孔眼距离,洞洞板宽度方向放置在中间位置即可。
第二步,焊接晶振跟30pF电容
将晶振靠近IC插座放置 正面
将晶振靠近IC插座放置
将晶振两引脚分别跟IC插座第18,,19管脚相连焊接
在晶振两引脚旁边分别放置30pF瓷片电容
焊接30pF电容,将电容靠近晶振的两个管脚分别与晶振管脚相连焊接,另外两个电容管脚跟IC插座第20管脚相连焊接
第三步,焊接复位电路
放置10K电阻跟10uF电容
这里需要注意电解电容正负极,电解电容负极跟电阻一个管脚放置在IC插座第9管脚附近,电阻另一个管脚放置在瓷片电容跟 接地线路 附近
第四步,电路其余部分焊接
这里参考原理图进行焊接,最上面两根引线间连的是微触开关
到上面51最小系统核心部分就焊接完成,接下来是外围电路,本制作用的是下面的外围原理图
外围线路原理图
外围线路pcb示意图
上面原理图跟pcb图中p5跟p6插接件是为了增加 电源 、地线的接口,D17发光二极管电源接通指示,S1自锁开关为整个电路总开关,下载程序时冷启动需要使用到。
增加的接地引脚
电源部分图解
背面,注意图中的黑线是电源指示部分跟地脚的连线
焊接完成图
合上单片机图,注意右侧的数码管不要去管他,这样的单个数码管在洞洞板上焊接异常麻烦,不建议。
测试所需元件图
序号 名称 数量 1 制作后的51单片机最小系统 1 2 CH340下载器 1 3 杜邦线 若干 4 跳线帽(非必须,可以用杜邦线代替) 若干
制作工具:电脑一台,Keil uVision软件,PZISP自动下载软件或者STC_ISP烧录软件
用跳线帽或者杜邦线将P2口跟旁边的led显示电路排针连接
下载器背面图
下载器的+5v跟总电源接口相连,地线跟单片机地线相连,RXD跟单片机第10引脚相连,TXD跟单片机第11引脚相连。
将下面的代码烧录进去,成功的话P2口相连的LED灯会闪烁。
#include&REG52.H&
#define uchar unsigned char
#define uint unsigned int
void delay_long(uint uiDelaylong);
void main()
{& & & &&&
& & & & P2=0; //P2口初始化
& & & & while(1)
& & & & {
& & & & & & & & P2=~P2; //将P2口取反
& & & & & & & & delay_long(200);//调用延时函数,可以将参数200修改成自己想要的闪烁间隔
& & & & }
}
void delay_long(uint uiDelayLong)
{
& &
& &
& & for(i=0;i&uiDelayLi++)
& & {
& && & for(j=0;j&500;j++)&&//内嵌循环的空指令数量
& && && &&&{
& && && && &&&; //一个分号相当于执行一条空语句
& && && &&&}
& & }
复制代码& &&&到这一步,最小51单片机系统就制作完成,接下来就是将这个系统跟前两大步制作好的车体跟驱动相连,然后通过红外遥控器遥控其进行不同动作。
14:10:04  
是啊,遇到问题查资料解决问题,耐得住性子就好~
对的,有些规律往往就是在那一刹那就发现了。帖子如果有什么不对的地方还望能够给指正下。
16:11:00  
单片机跟车体及驱动测试这一节将测试两者的结合
第一步,将L298n驱动电路的输入引脚跟单片机接口相连,具体的为L298n第5引脚跟单片机P1.0口相连,L298n第7引脚跟单片机P1.1口相连,L298n第10引脚跟单片机P1.2口相连,L298n第12引脚跟单片机P1.3口相连.如下图所示
连线比较乱,大概知道是从L298n第5、7、10、12口引线然后跟分别跟单片机的P1.0、P1.1、P1.2、P1.3口相连就好了
第二步,将电机测试程序下载到单片机中。测试程序有两个版本,简单的,复杂的。
先看简单的
#include&REG52.H&
sbit P1_0=P1^0;//单片机P1.0口接l298n驱动芯片第5引脚
sbit P1_1=P1^1;//单片机P1.1口接l298n驱动芯片第7引脚
sbit P1_2=P1^2;//单片机P1.2口接l298n驱动芯片第10引脚
sbit P1_3=P1^3;//单片机P1.3口接l298n驱动芯片第12引脚
void main()
{
while(1)
{
& && &P1_0=1;
& && &P1_1=0;
& && &P1_2=1;
& && &P1_3=0;& && &&&
}
}
复制代码这里直接将单片机逻辑信号输入到L298n的输入引脚中,简单粗暴。这里有两点需要大家注意
一:程序烧录到单片机后,需要将下载器拔除,需要用第二大步骤中电机驱动电路中的+5v电源给单片机供电,不然可能会出现电机无反应的情况。
从驱动电路中引出+5v跟地线给单片机供电
二:前进跟后退,左转跟右转的问题,这里只需要修改P1_0、 P1_1 、 P1_2 、 P1_3的逻辑值组合,这里跟你电机的正负极引线有关,每个人可能都不一样。现在规定车体靠电机的一侧为前进方向,也就是说车体前进时电机轮在前面,万向轮在后面,至于为什么,到后面红外巡线的时候会讲。
再来复杂的
#include &REG52.H&
#define uchar unsigned char
#define uint unsigned int
#define const_key_time1 20 //按键去抖动延时的时间
#define const_key_time2 20 //按键去抖动延时的时间
#define const_key_time3 20 //按键去抖动延时的时间
#define const_key_time4 20 //按键去抖动延时的时间
#define const_key_time5 20 //按键去抖动延时的时间
void initial_myself();
void initial_peripheral();
void delay_short(uint uiDelayShort);
void delay_long(uint uiDelaylong);
void T0_time();
void run();
void key_scan();
sbit P1_0=P1^0;//单片机P1.0口接l298n驱动芯片第5引脚
sbit P1_1=P1^1;//单片机P1.1口接l298n驱动芯片第7引脚
sbit P1_2=P1^2;//单片机P1.2口接l298n驱动芯片第10引脚
sbit P1_3=P1^3;//单片机P1.3口接l298n驱动芯片第12引脚
sbit key_sr1=P2^0;//前进选择按键,可以将P2.0口用杜邦线接地,模拟按键操作
sbit key_sr2=P2^1;//后退选择按键,可以将P2.1口用杜邦线接地,模拟按键操作
sbit key_sr3=P2^2;//左转选择按键,可以将P2.2口用杜邦线接地,模拟按键操作
sbit key_sr4=P2^3;//右转选择按键,可以将P2.3口用杜邦线接地,模拟按键操作
sbit key_sr5=P2^4;//停止选择按键,可以将P2.4口用杜邦线接地,模拟按键操作
uchar ucKeySec=0; //被触发的按键编号
uint uiKeyTimeCnt1=0; //按键去抖动延时计数器
uchar ucKeyLock1=0; //按键触发后自锁的变量标志
uint uiKeyTimeCnt2=0; //按键去抖动延时计数器
uchar ucKeyLock2=0; //按键触发后自锁的变量标志
uint uiKeyTimeCnt3=0; //按键去抖动延时计数器
uchar ucKeyLock3=0; //按键触发后自锁的变量标志
uint uiKeyTimeCnt4=0; //按键去抖动延时计数器
uchar ucKeyLock4=0; //按键触发后自锁的变量标志
uint uiKeyTimeCnt5=0; //按键去抖动延时计数器
uchar ucKeyLock5=0; //按键触发后自锁的变量标志
void main()
{
& && &initial_myself();
& && &delay_long(100);
& && &initial_peripheral();
& && &while(1)
& && && & run();
& && & }
void key_scan()//按键扫描函数 放在定时中断里
{
if(key_sr1==1)//IO是高电平,说明按键没有被按下,这时要及时清零一些标志位
{
ucKeyLock1=0; //按键自锁标志清零
uiKeyTimeCnt1=0;//按键去抖动延时计数器清零,此行非常巧妙,是我实战中摸索出来的。
}
else if(ucKeyLock1==0)//有按键按下,且是第一次被按下
{
uiKeyTimeCnt1++; //累加定时中断次数
if(uiKeyTimeCnt1&const_key_time1)
{
uiKeyTimeCnt1=0;
ucKeyLock1=1; //自锁按键置位,避免一直触发
ucKeySec=1; //触发1号键
}
}
if(key_sr2==1)//IO是高电平,说明按键没有被按下,这时要及时清零一些标志位
{
ucKeyLock2=0; //按键自锁标志清零
uiKeyTimeCnt2=0;//按键去抖动延时计数器清零,此行非常巧妙,是我实战中摸索出来的。
}
else if(ucKeyLock2==0)//有按键按下,且是第一次被按下
{
uiKeyTimeCnt2++; //累加定时中断次数
if(uiKeyTimeCnt2&const_key_time2)
{
uiKeyTimeCnt2=0;
ucKeyLock2=1; //自锁按键置位,避免一直触发
ucKeySec=2; //触发2号键
}
}
if(key_sr3==1)//IO是高电平,说明按键没有被按下,这时要及时清零一些标志位
{
ucKeyLock3=0; //按键自锁标志清零
uiKeyTimeCnt3=0;//按键去抖动延时计数器清零,此行非常巧妙,是我实战中摸索出来的。
}
else if(ucKeyLock3==0)//有按键按下,且是第一次被按下
{
uiKeyTimeCnt3++; //累加定时中断次数
if(uiKeyTimeCnt3&const_key_time3)
{
uiKeyTimeCnt3=0;
ucKeyLock3=1; //自锁按键置位,避免一直触发
ucKeySec=3; //触发3号键
}
}
if(key_sr4==1)//IO是高电平,说明按键没有被按下,这时要及时清零一些标志位
{
ucKeyLock4=0; //按键自锁标志清零
uiKeyTimeCnt4=0;//按键去抖动延时计数器清零,此行非常巧妙,是我实战中摸索出来的。
}
else if(ucKeyLock4==0)//有按键按下,且是第一次被按下
{
uiKeyTimeCnt4++; //累加定时中断次数
if(uiKeyTimeCnt4&const_key_time4)
{
uiKeyTimeCnt4=0;
ucKeyLock4=1; //自锁按键置位,避免一直触发
ucKeySec=4; //触发4号键
}
}
if(key_sr5==1)//IO是高电平,说明按键没有被按下,这时要及时清零一些标志位
{
ucKeyLock5=0; //按键自锁标志清零
uiKeyTimeCnt5=0;//按键去抖动延时计数器清零,此行非常巧妙,是我实战中摸索出来的。
}
else if(ucKeyLock5==0)//有按键按下,且是第一次被按下
{
uiKeyTimeCnt5++; //累加定时中断次数
if(uiKeyTimeCnt5&const_key_time5)
{
uiKeyTimeCnt5=0;
ucKeyLock5=1; //自锁按键置位,避免一直触发
ucKeySec=5; //触发5号键
}
}
void run()
{
switch(ucKeySec)
{
case 1: /*前进*/
P1_0=1;
P1_1=0;
P1_2=1;
P1_3=0;
case 2: /*后退*/
P1_0=0;
P1_1=1;
P1_2=0;
P1_3=1;
case 3: /*左转*/
P1_0=0;
P1_1=0;
P1_2=1;
P1_3=0;
case 4: /*右转*/
P1_0=1;
P1_1=0;
P1_2=0;
P1_3=0;
& && &&&
case 5: /*停止*/
P1_0=0;
P1_1=0;
P1_2=0;
P1_3=0;
void T0_time() interrupt 1
{
TF0=0; //清除中断标志
TR0=0; //关中断
key_scan();
TH0=0xf8; //重装初始值()=f
TL0=0x2f;
TR0=1; //开中断
}
void delay_short(unsigned int uiDelayShort)
for(i=0;i&uiDelaySi++)
{
; //一个分号相当于执行一条空语句
}
}
void delay_long(unsigned int uiDelayLong)
{
for(i=0;i&uiDelayLi++)
{
for(j=0;j&500;j++) //内嵌循环的空指令数量
{
; //一个分号相当于执行一条空语句
}
}
}
void initial_myself() //初始化单片机
{
TMOD=0x01; //设置定时器0为工作方式1
TH0=0xf8; //重装初始值()=f
TL0=0x2f;
void initial_peripheral() //初始化外围
{
EA=1; //开总中断
ET0=1; //允许定时中断
TR0=1; //启动定时中断
}复制代码不知道代码粘贴到这里为什么没有缩进?
这里借用了鸿哥的程序结构,有不懂的可以参考这个帖子。这里用了5个按键进行互动操作,为后面的遥控电路做铺垫,这里的按键操作可以用杜邦线将P2.0至P2.4口跟地线触接模拟。同样的前进、后退、左转、右转、停止操作可以再程序中的void run()子函数中修改。
模拟按键操作,图中绿色的线为地线
让地线分别接触P2.0到P2.4口观察电机的运动情况,如有方向错误,需在void run()函数中进行修改。
自此单片机跟电机的联动测试完成。
助理工程师
21:12:19  
很不错!!!!!!!!!!!!!!!!!!!!!!
23:08:05  
这个是一直想做的
01:19:42  
这个是一直想做的
有时候想到了就去做,其实比任何想法都要好,做的过程当中你会更加清楚认识自己。
等待验证会员
12:25:12  
楼主牛X,顶一个!!!!
12:32:18  
感谢分享,学习了!
11:17:17  
支持,继续努力,多发些好的作品& && && && &&&
15:23:04  
支持,继续努力,多发些好的作品
谢谢谢谢,一定会的!
13:55:08  
本帖最后由 干涸的布拉格 于
14:02 编辑
四,红外测试及完成红外遥控小车
这一节将介绍红外测试已经最终完成红外遥控小车这一环节,本节将基于之前制作好的51单片机系统,外加一个红外接收头,以及红外遥控器。
所用的器件如下:
本节所使用的是1838红外一体化接收头。下图为某公司的1838外形参数及接口
根据上图的接口,用红、黑、白三色杜邦线分别与Vcc、GND、OUT口相连。再将三根杜邦线用胶带或者热缩管固定在一块。
这里有必要讲一下一体化红外接收头、红外对管的区别。
& && &一体化红外接收头:内部电路包括红外监测二极管,放大器,限幅器,带通滤波器,积分电路,比较器等。简单讲就是将调制信号解调。下图能很好说明这一点
上面gif动画前半部分是调制好的信号,关于如何调制可以参看相关资料,如果有时间我将另外开贴说明并实现,后半部分可以理解为一体化红外接收头的工作后效果。
红外对管:仅仅是一组红外发射接收装置,分为红外发射二极管、红外接收二极管或者红外接收三极管。用上面gif动画解释:前半部分跟三极管集电极相连的为红外发射二极管,后半部分中前段的为红外接收二极管。红外对管将在巡线电路中用到。
本节讲的红外测试分为led测试篇跟1602液晶测试篇
将一体化红外接收头接入51单片机系统,VCC、GND、OUT三个接口分别跟51单片机正极、负极、P3.2口相连。将P2口分别与外围的led灯连接。将下面程序烧录进去。
#include &REG52.H&
#define const_interrupt_time 792&&//840us定时值
#define uchar unsigned char
#define uint unsigned int
void initial_myself();& & //初始化单片机
void initial_peripheral();//初始化外围
void delay_short(uint uiDelayShort);//长延时
void delay_long(uint uiDelaylong);//短延时
void Int0();& &&&//外部中断函数
void detectorIR(); //红外检测函数
void run();& && &&&//电机运行函数
sbit IR_sr=P3^2;& &//外部中断口,数据接收口
sbit P1_0=P1^0;& & //电机控制输出口
sbit P1_1=P1^1;& & //电机控制输出口
sbit P1_2=P1^2;& && && &&&//电机控制输出口
sbit P1_3=P1^3;& & //电机控制输出口
uchar ucMotorStep=0;& &//被触发的电机动作编号
& && &&&//从遥控器中接受的编码
void main()
&&{
& & initial_myself();& && && &
& & delay_long(100);& &
& & initial_peripheral();
& & while(1)& &
& & {& && && &
& && && &&&detectorIR();
& && && &&&run();
& & }
void detectorIR() //红外检测函数
{
& && &&&P2= //将接收到的编码输出到P2口,用LED显示出来
}
void run()
{
& && &&&switch(ucMotorStep)
& && &&&{
& && && && && & case 1: /*前进*/
& && && && && && && && && && &&&P1_0=1;
& && && && && && && && && && &&&P1_1=0;
& && && && && && && && && && &&&P1_2=1;
& && && && && && && && && && &&&P1_3=0;
& && && && && && && && && && &&&
& && && && && & case 2: /*后退*/
& && && && && && && && && && &&&P1_0=0;
& && && && && && && && && && &&&P1_1=1;
& && && && && && && && && && &&&P1_2=0;
& && && && && && && && && && &&&P1_3=1;
& && && && && && && && && && &&&
& && && && && & case 3: /*左转*/
& && && && && && && && && && &&&P1_0=0;
& && && && && && && && && && &&&P1_1=0;
& && && && && && && && && && &&&P1_2=1;
& && && && && && && && && && &&&P1_3=0;
& && && && && && && && && && &&&
& && && && && & case 4: /*右转*/
& && && && && && && && && && &&&P1_0=1;
& && && && && && && && && && &&&P1_1=0;
& && && && && && && && && && &&&P1_2=0;
& && && && && && && && && && &&&P1_3=0;
& && && && && && && && && && &&&
& && && && && & case 5: /*停止*/
& && && && && && && && && && &&&P1_0=0;
& && && && && && && && && && &&&P1_1=0;
& && && && && && && && && && &&&P1_2=0;
& && && && && && && && && && &&&P1_3=0;
& && && && && && && && && && &&&
& && &&&}
}
void Int0() interrupt 0
{
& && && &uchar i,j;
& && &&&EX0=0;& &&&// 关闭外部中断0& && && &
& && &&&i=10;
& && &&&while(i--)
& && &&&{
& && && && && & TH0=(65535-const_interrupt_time)/256;& &
& && && && &TL0=(65535-const_interrupt_time)%256;
& && && && && & TR0=1;
& && && && && & while(!TF0);
& && && && && & TF0=0;
& && && && && & TR0=0;
& && && && && & while(IR_sr)
& && && && && & {
& && && && && && && && &EX0=1;
& && && && && && && && &
& && && && && & }
& && &&&}& && && &&&//每840us检测一次P3.2口是否出现高电平,共检测10次,出现高电平则重新进入中断
& && &&&while(!IR_sr);// 等待低电平过去
& && &&&j=5;
& && &&&while(j--)
& && &&&{
& && && && && & TH0=(65535-const_interrupt_time)/256;& &
& && && && &TL0=(65535-const_interrupt_time)%256;
& && && && && & TR0=1;
& && && && && & while(!TF0);
& && && && && & TF0=0;
& && && && && & TR0=0;
& && && && && & while(!IR_sr)
& && && && && & {
& && && && && && && && &EX0=1;
& && && && && && && && &
& && && && && & }
& && &&&}& && && &//每840us检测一次P3.2口是否出现低电平,共检测5次,出现低电平则重新进入中断
& && &&&while(IR_sr);// 等待高电平过去
& && &&&for(i=0;i&4;i++)
& && &&&{
& && && && && & for(j=0;j&8;j++)
& && && && && & {
& && && && && && && && &
& && && && && && && && &while(!IR_sr);// 等待低电平过去
& && && && && && && && &TH0=(65535-const_interrupt_time)/256;& &
& && && && && && &&&TL0=(65535-const_interrupt_time)%256;
& && && && && && && && &TR0=1;
& && && && && && && && &while(!TF0);
& && && && && && && && &TF0=0;
& && && && && && && && &TR0=0;& && && & //延时840us
& && && && && && && && &if(IR_sr)& && &&&//判断是否是高电平
& && && && && && && && &{
& && && && && && && && && && &&&ucdata|=0x80;& && &&&//最高位置“1”
& && && && && && && && && && &&&while(IR_sr);& && &&&// 等待高电平过去& && &&&
& && && && && && && && &}
& && && && && && && && &ucdata&&=1; //如果是低电平则左移一位& && && && && &
& && && && && & }
& && &&&}& && &&&
& && &&&EX0=1;& && && && && & // 开中断
& &
void delay_long(unsigned int uiDelayLong)
{
& &
& &
& & for(i=0;i&uiDelayLi++)
& & {
& && & for(j=0;j&500;j++)&&//内嵌循环的空指令数量
& && && &&&{
& && && && &&&; //一个分号相当于执行一条空语句
& && && &&&}
& & }
void initial_myself()&&//初始化单片机
&&TMOD=0x01;&&//设置定时器0为工作方式1
void initial_peripheral() //初始化外围
{
& &
& &ET0=1;& & //允许定时中断& && && &&&
& &IT0=1;& & //下降沿触发
& &EX0=1;& & //允许外部中断
& &EA=1;& &&&//开总中断
}复制代码
程序烧录进单片机后,用遥控器对着一体化接收头按键,与P2口的led会做出相应变化,如下图所示
这里需要特别注意,单片机输出为高电平时LED是灭的,输出为低电平LED灯才亮。
另外,我们国家所用的红外遥控器一般使用的是NEC制式。这部分内容将在补充知识中讲到,这里先程序烧录进去。下面是我用到的遥控器,当然你也可以用家里的电视、DVD遥控器代替。
这里我定义“2”为前进,“8”为后退,“4”为左转,“6”为右转,“5”为停止。当然你可以自己定义别的按键,在定义别的按键的时候一定要注意5个动作一定要5种不同的码值,也就是说led灯以不同的方式亮灯。上面的led灯我按的是“2”键,显示为“”即0x73。如果按键显示正确的话,接下来就可以加入电机驱动了。只需将 程序中& &void detectorIR() 函数中的 P2= 换成下面代码,一个红外遥控小车就完成了。
void detector_IR()
{
& && &&&if(ucdata==0x73) ucMotorStep=1;
& && &&&else if(ucdata==0x56) ucMotorStep=2;
& && &&&else if(ucdata==0x7b) ucMotorStep=3;
& && &&&else if(ucdata==0x52) ucMotorStep=4;
& && &&&else if(ucdata==0x71) ucMotorStep=7;
& && &&&else ucMotorStep=7;
}复制代码1602液晶测试篇
下图为所需器件图
数量 1CH340单片机下载器 1
2自制51单片机 1 3 1838一体化红外接收头1
4 1602液晶1 5
可调电阻1031
注意照片上面的红色洞洞板没有多大意义,只是一个电源跟地的扩展接口。因为电路中需要多处用到电源跟地,所以找了一个之前做的扩展接口,大家可以再51单片机洞洞板电源跟地附近多焊几个扩展口就好了。参考下面原理图接线
线接好后,烧录下列程序
#include&reg52.h&
#include&intrins.h&
#include&string.h&
#define const_interrupt_time 774 //840us定时值
#define uint&&unsigned int
#define uchar unsigned char
uchar read_1602_status();&&//读1602液晶状态
void write_1602_command(uchar cmd);& && && &&&//写1602液晶指令
void write_1602_data(uchar dat);& && && &//写1602液晶数据
void init_1602();& && && && && && && && && && && && && &&&//1602初始化
void delay_ms(uint delay_time);& && && && && &&&//延时ms
void LCD_Busy_Wait();& && && && && && && && && && && &//1602液晶忙状态检测
void Set_LCD_POS(uchar p);& && && && && && && && & //显示位置定位
void Display_LCD_String(uchar p,uchar *s);& && && &//在p位置显示字符串
void Display_Ir_Code(uchar add,uchar date);& && && &//将接受到的红外信号分别显示
void Display_movement_action();& && && && && && && && && && && &//显示电机动作
void delay_long(uint uiDelaylong);
void initial_myself();& && && && & //初始化单片机
void initial_peripheral();& && &&&//初始化外围
void Int0();& && && && && && && && && && &&&//外部中断函数
void run();& && && && && && && && && && && && && & //电机运行函数
sbit IR_sr=P3^2;& && && && && && & //外部中断口,数据接收口
sbit RS=P2^5;& && && && && && && && && &//1602液晶数据/命令选择端口
sbit RW=P2^6;& && && && && && && && && &//1602液晶读写选择
sbit EN=P2^7;& && && && && && && && && &//1602液晶使能端口
sbit P1_0=P1^0;& && && && && && && && && &//电机控制输出口
sbit P1_1=P1^1;& && && && && && && && && &//电机控制输出口
sbit P1_2=P1^2;& && && && && && && && && &//电机控制输出口
sbit P1_3=P1^3;& && && && && && && && && &//电机控制输出口
uchar ucMotorStep=0;& &//被触发的电机动作编号
//从遥控器中接受的编码
void main()
{
& && &&&
& && &&&initial_myself();& && && &
& & delay_long(100);& &
& & initial_peripheral();& && && && && &
& && &&&Display_LCD_String(0,&Code_Num:0x&);& && && && && &
& && &&&while(1)
& && &&&{
& && && && && & Display_Ir_Code(11,ucdata);
& && && && && & Display_movement_action();
& && && && && & run();& && && && && &
& && &&&}
}
void Display_movement_action()& && && & //显示电机动作
{
& && &&&if(ucdata==0x73)
& && &&&{
& && && && && &&&Display_LCD_String(64,&Forward& && && && &&);
& && && && && &&&ucMotorStep=1;
& && &&&}
& && &&&else if(ucdata==0x56)
& && &&&{
& && && && && &&&Display_LCD_String(64,&Backward& && &&&&);
& && && && && &&&ucMotorStep=2;
& && &&&}
& && &&&else if(ucdata==0x7b)
& && &&&{
& && && && && &&&Display_LCD_String(64,&Turn_Left& && & &);
& && && && && &&&ucMotorStep=3;
& && &&&}& && &&&
& && &&&else if(ucdata==0x52)
& && &&&{
& && && && && &&&Display_LCD_String(64,&Turn_Right& && && &&);
& && && && && &&&ucMotorStep=4;
& && &&&}& && && && && &
& && &&&else if(ucdata==0x71)
& && &&&{
& && && && && &&&Display_LCD_String(64,&Stop& && && &&&&);
& && && && && &&&ucMotorStep=5;
& && &&&}& && && && && &
& && &&&else& && && &
& && &&&{
& && && && && &&&Display_LCD_String(64,&Undesigned_code&);
& && && && && &&&ucMotorStep=5;
& && &&&}
}
void run()
{
& && &&&switch(ucMotorStep)
& && &&&{
& && && && && & case 1: /*前进*/
& && && && && && && && && && &&&P1_0=1;
& && && && && && && && && && &&&P1_1=0;
& && && && && && && && && && &&&P1_2=1;
& && && && && && && && && && &&&P1_3=0;
& && && && && && && && && && &&&
& && && && && & case 2: /*后退*/
& && && && && && && && && && &&&P1_0=0;
& && && && && && && && && && &&&P1_1=1;
& && && && && && && && && && &&&P1_2=0;
& && && && && && && && && && &&&P1_3=1;
& && && && && && && && && && &&&
& && && && && & case 3: /*左转*/
& && && && && && && && && && &&&P1_0=0;
& && && && && && && && && && &&&P1_1=0;
& && && && && && && && && && &&&P1_2=1;
& && && && && && && && && && &&&P1_3=0;
& && && && && && && && && && &&&
& && && && && & case 4: /*右转*/
& && && && && && && && && && &&&P1_0=1;
& && && && && && && && && && &&&P1_1=0;
& && && && && && && && && && &&&P1_2=0;
& && && && && && && && && && &&&P1_3=0;
& && && && && && && && && && &&&
& && && && && & case 5: /*停止*/
& && && && && && && && && && &&&P1_0=0;
& && && && && && && && && && &&&P1_1=0;
& && && && && && && && && && &&&P1_2=0;
& && && && && && && && && && &&&P1_3=0;
& && && && && && && && && && &&&
& && &&&}
}
/*********************分割线 下面是1602液晶驱动程序**********************/
uchar read_1602_status()//读1602液晶状态
{
& && &&&
& && &&&RS=0;
& && &&&RW=1;
& && &&&EN=0;
& && &&&_nop_();
& && &&&EN=1;
& && &&&_nop_();
& && &&&state=P0;
& && &&&_nop_();
& && &&&EN=0;
& && &&&_nop_();& && &&&
& && &&&& && &&&
}
void write_1602_command(uchar cmd)//写1602液晶指令
{
& && &&&LCD_Busy_Wait();
& && &&&RS=0;
& && &&&RW=0;
& && &&&EN=0;
& && &&&P0=
& && &&&_nop_();
& && &&&EN=1;
& && &&&_nop_();
& && &&&EN=0;
& && &&&_nop_();& && && && && &
void write_1602_data(uchar dat)//写1602液晶数据
{
& && &&&LCD_Busy_Wait();
& && &&&RS=1;
& && &&&RW=0;
& && &&&EN=0;
& && &&&P0=
& && &&&_nop_();
& && &&&EN=1;
& && &&&_nop_();
& && &&&EN=0;
& && &&&_nop_();& && && && && &
void init_1602()//1602液晶初始化
{
& && && &
& && && &write_1602_command(0x38);
& && && &write_1602_command(0x08);
& && && &write_1602_command(0x01);& && && &
& && && &write_1602_command(0x06);& && && &
& && && &write_1602_command(0x0c);
& && && &
& && && &
}
void LCD_Busy_Wait()//1602液晶忙状态检测,根据数据手册介绍,每次进行读写操作前都需进行读写检测,确保状态字最高位为0。
{
& && &&&while((read_1602_status()&0x80)==0x80);& && &&&
& && &&&delay_ms(1);
}
void Set_LCD_POS(uchar p)//显示位置定位
{
& && &&&write_1602_command(0x80+p);& && &&&
}
void Display_LCD_String(uchar p,uchar *s)//在p位置显示字符串
{
& && &&&
& && &&&Set_LCD_POS(p);
& && &&&for(i=0;i&strlen(s);i++)
& && &&&{
& && && && && &&&write_1602_data(s[i]);
& && && && && &&&delay_ms(1);
& && &&&}
/*********************分割线 上面是1602液晶驱动程序**********************/
void Display_Ir_Code(uchar add,uchar date)//将接受到的红外信号分别显示
{
& && &&&uchar uclsb,ucmsb,ucdis_lsb,ucdis_
& && &&&uclsb=date&0x0f;//取出红外信号的低四位
& && &&&ucmsb=(date&&4)&0x0f;//取出红外信号的高四位
& && &&&if(uclsb&0x09)& && &&&ucdis_lsb=0x40+uclsb-0x09;//判断数据信号十分大于9,由于液晶是按照ASCII码显示,所以A到F需要加上0x40
& && && && && && && && && && &&&else ucdis_lsb=0x30+//如果小于9,数字1到9需要加上0x30。
& && &&&if(ucmsb&0x09)& && &&&ucdis_msb=0x40+ucmsb-0x09;
& && && && && && && && && && &&&else ucdis_msb=0x30+
& && &&&write_1602_command(0x80+add);
& && &&&write_1602_data(ucdis_msb);
& && &&&write_1602_data(ucdis_lsb);
void delay_ms(uint delay_time)//延时函数,一个delay_time大约1ms。
{
& && &&&
& && &&&while(delay_time--)
& && &&&{
& && && && && & for(i=0;i&114;i++)
& && && && && & {
& && && && && && && && &;
& && && && && & }
& && &&&}
}
void Int0() interrupt 0
{
& && && &uchar i,j;
& && &&&EX0=0;& &&&// 关闭外部中断0& && && &
& && &&&i=10;
& && &&&while(i--)
& && &&&{
& && && && && & TH0=(65535-const_interrupt_time)/256;& &
& && && && &TL0=(65535-const_interrupt_time)%256;
& && && && && & TR0=1;
& && && && && & while(!TF0);
& && && && && & TF0=0;
& && && && && & TR0=0;
& && && && && & while(IR_sr)
& && && && && & {
& && && && && && && && &EX0=1;
& && && && && && && && &
& && && && && & }
& && &&&}& && && &&&//每840us检测一次P3.2口是否出现高电平,共检测10次,出现高电平则重新进入中断
& && &&&while(!IR_sr);// 等待低电平过去
& && &&&j=5;
& && &&&while(j--)
& && &&&{
& && && && && & TH0=(65535-const_interrupt_time)/256;& &
& && && && &TL0=(65535-const_interrupt_time)%256;
& && && && && & TR0=1;
& && && && && & while(!TF0);
& && && && && & TF0=0;
& && && && && & TR0=0;
& && && && && & while(!IR_sr)
& && && && && & {
& && && && && && && && &EX0=1;
& && && && && && && && &
& && && && && & }
& && &&&}& && && &//每840us检测一次P3.2口是否出现低电平,共检测5次,出现低电平则重新进入中断
& && &&&while(IR_sr);// 等待高电平过去
& && &&&for(i=0;i&4;i++)
& && &&&{
& && && && && & for(j=0;j&8;j++)
& && && && && & {
& && && && && && && && &
& && && && && && && && &while(!IR_sr);// 等待低电平过去
& && && && && && && && &TH0=(65535-const_interrupt_time)/256;& &
& && && && && && &&&TL0=(65535-const_interrupt_time)%256;
& && && && && && && && &TR0=1;
& && && && && && && && &while(!TF0);
& && && && && && && && &TF0=0;
& && && && && && && && &TR0=0;& && && & //延时840us
& && && && && && && && &if(IR_sr)& && &&&//判断是否是高电平
& && && && && && && && &{
& && && && && && && && && && &&&ucdata|=0x80;& && &&&//最高位置“1”
& && && && && && && && && && &&&while(IR_sr);& && &&&// 等待高电平过去& && &&&
& && && && && && && && &}
& && && && && && && && &ucdata&&=1; //如果是低电平则左移一位& && && && && &
& && && && && & }
& && &&&}& && &&&
& && &&&EX0=1;& && && && && & // 开中断
& &
void delay_long(unsigned int uiDelayLong)
{
& &
& &
& & for(i=0;i&uiDelayLi++)
& & {
& && & for(j=0;j&500;j++)&&//内嵌循环的空指令数量
& && && &&&{
& && && && &&&; //一个分号相当于执行一条空语句
& && && &&&}
& & }
void initial_myself()&&//初始化单片机
&&TMOD=0x01;&&//设置定时器0为工作方式1
void initial_peripheral() //初始化外围
{
& &
& &ET0=1;& & //允许定时中断& && && &&&
& &IT0=1;& && && &//下降沿触发
& &EX0=1;& && && &//允许外部中断
& &EA=1;& &&&//开总中断
& &init_1602();& && &&&//初始化1602液晶
}复制代码
分别按遥控器的“2”、“8”、“4”、“6”、“5”,1602液晶显示如下
前进,编码:0x73
后退,编码:0x56
左转,编码:0x7B
右转,编码:0x52
停止,编码:0x71
完成测试之后,也按照LED测试篇后面讲的,在main()函数中增加一条 detector_IR()语句。
复制代码void main()
{
& & & &
& & & & initial_myself();& & & && &
& & delay_long(100);& &
& & initial_peripheral();& & & & & & & &
& & & & Display_LCD_String(0,&Code_Num:0x&);& & & & & & & &
& & & & while(1)
& & & & {
& & & & & & & &
& & & & & & & & Display_Ir_Code(11,ucdata);
& & & & & & & & Display_movement_action();
& & & & & & & & detector_IR;
& & & & & & & & run();& & & & & & & &
& & & & }& & & &
再在后面增加void detector_IR() 子函数。再声明函数头。
void detector_IR()
{
if(ucdata==0x73) ucMotorStep=1;
else if(ucdata==0x56) ucMotorStep=2;
else if(ucdata==0x7b) ucMotorStep=3;
else if(ucdata==0x52) ucMotorStep=4;
else if(ucdata==0x71) ucMotorStep=7;
else ucMotorStep=7;
}复制代码自此红外遥控小车就完成了。接下来就是红外巡线部分制作。
15:33:08  
学到很多东西,期待LZ下次的更新。
13:18:08  
补充知识--NEC协议
上节用到的遥控器使用的是NEC红外协议,现在在这里讲解下,有利于代码的解读,协议参考图如下
NEC协议参考图
这里需要特别注意:实际应用当中,实际的波形与上图所示波形,高低位正好相反。
每次发送信息首先是用于调整红外接收增益的9ms高电平脉冲(实际应用中其实是9ms的低电平),接着是4.5ms的低电平(实际应用中其实是4.5ms的高电平)。接下来是地址码跟命令码。地址码跟命令码各发送两次,第二次发送的是它们分别的反码,用于验证数据的准确性。先发送低位码再发送高位码。逻辑“1”实际运用当中是560us低电平再是(2.25ms-560us)=1.69ms的高电平。逻辑“0”也类似。
下面是这次红外小车遥控器按键“5”即停止命令的波形图。由于为了更好的现实波形,示波器选用的是5ms时间间隔档,但由于示波器宽度的限制不能完整的现实一个协议内容,所以将其分为两个部分显示,大家可以综合来看。
这是前部分的波形,不知道为什么没有看到9ms的低电平引导码,示波器用的是5ms/div时间间隔,可以清楚看到4.5ms的高电平区,接下来是地址码,地址码的反码,命令码,命令码的反码,由于示波器的宽度限制,命令码的反码没有显示完全,可以参看下图
我们的程序接收到的数据是命令码的反码,可以从上面这张示波器图读出二进制为“”(从后往前读)即“0x71”。如果大家细心会发现程序中有一点问题,这里我就不去说明了,如果发现了可以自己改进,如果没有也没有啥关系。
Powered by

我要回帖

更多关于 手机红外线发射器制作 的文章

 

随机推荐