1、 2011年小学期单片机设计实验报告题目:红外测速报警系统摘要在工程实践中,经常会遇到各种需要测量移动速度的场合,高精度和非接触测量往往给测量提出了高的要求。红外光电传感器的工作原理较为方便易行,且精度较高,在此基础上采用单片机进行计数测量,并用输出设备显示测量结果,为远程检测与监控提供了合理的选择。本次我们制作的是基于pic32单片机的能够自行设置最高限速并进行红外测速报警的测速系统。本方案采用单片机PIC32MX795F512L为控制核心,实现测速报警系统的基本功能。系统的硬件部分主要包括单片机板块、数据采集、人机交互界面三大部分。数据采集由内部计时系统和红外线发射/接收系统实现,人机交互
2、界面主要为44标准输入键盘和RT1602C点阵式液晶显示器,另外再加上与单片机相连受其控制的蜂鸣器,实现报警功能。整个系统中,微控制器采用了Microchip公司的PIC32MX795F512L,软件设计中涉及PORTE、PORTD和PORTG等相关管脚用作普通数字I/O脚。本实验用单片机PORTE和PORTG相关管脚控制液晶显示器的读写;用PORTB和PORTF相关管脚接收键盘的输入高低电位,进而获取输入信息;用PORTD某些管脚来控制蜂鸣器的启动/关闭,以及接受红外对管的电平信号。 关键词:PIC单片机 红外信号 输入/输出 C语言AbstractIn engineering practi
3、ce, we often encounter a variety of situations where we need to measure moving speed, and accuracy and non-contact measurement to measurement often require high demand. Infrared optical sensor is convenient and easy to use, and high accuracy, and using single-chip to count on the basis of Infrared o
4、ptical sensor and displaying the measurement results with the output device provides a reasonable choice for remote detection and monitoring. This time our production is based on PIC32 microcontroller, which can set the maximum speed limit and measure the speed with the infrared alarm system. The pr
5、ogram take PIC32MX795F512L as controlling core to achieve the basic functions of alarm system and speed measure system.Keyworks:PIC microcontroller Infrared signal Input/Output C目录关键词:2PIC单片机 红外信号 输入/输出 C语言2Abstract21方案论证与比较42系统设计421 总体设计4211 原理模块框图4212 模块工作原理说明522 各模块设计及参数计算62. 2. 1 键盘输入系统62. 2. 2
6、液晶显示系统82. 2. 3 红外线发射/接收系统92. 2. 4 蜂鸣器报警系统1023 软件系统设计112. 3. 1 系统软件流程图 (摘自组员王渊浩)112. 3. 2各模块子程序流程图及设计说明133系统调试1931硬件调试1932软件调试1933软件硬件联调204系统指标测试2141测试仪器2142技术指标测试215结论216致谢、心得、体会227参考文献238附录23附录1231方案论证与比较本方案名称是红外线测速报警系统,全部组成部分为单片机系统、红外线发射/接收系统、键盘输入系统、液晶显示系统以及蜂鸣警告系统。通过键盘输入系统向测速报警系统输入“速度上限”,当两套红外对管对齐
7、,进入工作状态后,红外系统不断发射/接收红外线信号。被测物体经过红外对管时,两套红外接收系统会受到阻断,测得被测物体经过单位距离S的时间t。进而根据公式: v=S/t求得物体的速度v。若物体速度大于输入的“速度上限”,则启动蜂鸣系统并亮红灯,向操作者发出警报。2系统设计21 总体设计211 原理模块框图液晶显示屏44矩阵键盘正常工作指示绿灯和报警红灯红外线接收系统报警蜂鸣器复位、电源、时钟212 模块工作原理说明单片机开始工作时,首先是键盘输入系统输入“速度上限”,然后单片机判断两套红外发射接收对管是否正常工作。进入正常工作状态后,PIC单片机上的绿灯亮起,代表可以被测物体可以经过红外对管,进
8、行测速工作。根据公式: v=S/t求得物体的速度v后,在液晶屏上显示被测速度的大小。最后系统进行判断,若被测物体速度大于输入的“速度上限”,则启动蜂鸣系统并亮红灯,向操作者发出警报。22 各模块设计及参数计算2. 2. 1 键盘输入系统44标准输入键盘实物图:44标准输入键盘模块框图: RB14 RB13 RF12 RF13RB11RB8RB12RB9 1 2 3 4 5 9 6 7 8 0DABEFC44标准键盘共有8个输出接口,分别对应着4列与4行。连接时,每个接口通过5.1K的电阻接到+5V的电源上,同时与单片机设定的相关管脚相连。2. 2. 2 液晶显示系统RT1602C点阵式液晶显示
9、器实物图:RT1602C点阵式液晶显示器电路图:电源PIC32 89 90 93 94 95 96 97 98 99 1001 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16地RT1602C点阵式液晶显示器各接口功能:第 1 脚:VSS 为地电源。第 2 脚:VDD 接5V 正电源。第 3 脚:V0 为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K 的电位器调整对比度。第 4 脚:RS 为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。第 5 脚:RW 为读写信号线,高电平时进行读操
10、作,低电平时进行写操作。当RS和RW 共同为低电平时可以写入指令或者显示地址,当RS 为低电平RW 为高电平时可以读忙信号,当RS 为高电平RW 为低电平时可以写入数据。第 6 脚:E 端为使能端,当E 端由高电平跳变成低电平时,液晶模块执行命令。第 714 脚:D0D7 为8 位双向数据线。第 1516 脚:空脚1602 液晶模块内部的字符发生存储器(CGROM)已经存储了160 个不同的点阵字符图形,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H 中的点阵
11、字符图形显示出来,我们就能看到字母“A”。在本实验中,管脚1、3、5均接地,管脚2接+5V电源,管脚15和16置空,其余管脚直接与PIC单片机相关的I/O管脚相连,实现单片机对液晶屏显示字符的控制。2. 2. 3 红外线发射/接收系统红外线发射/接收系统实物图:红外线发射/接收系统电路图:接收管的I/O端直接与单片机的管脚相连接。当红外线接收管接收不到发射管发出的信号时,I/O端输出高电平(3.54V),当接收到红外信号时,则输出低电平(0V)。单片机通过检测红外接收端输出的高低电平,决定计时的开始与结束。2. 2. 4 蜂鸣器报警系统蜂鸣器报警系统实物图:蜂鸣器报警系统电路图:蜂鸣器的整机接
12、到正电源(通过对VCC+5V的分压,使得电源为+4V左右),蜂鸣器的负极接到三极管的发射极E,三极管的基极B经过限流电阻R1后由单片机的RD5管脚控制。当RD5输出高电平时三极管T1截止,蜂鸣器不发声;当RD5输出低电平时,三极管导通,蜂鸣器的电流形成回路,发出声音。23 软件系统设计2. 3. 1 系统软件流程图开始系统配置,设置输入/输出端口用键盘输入速度上限在液晶屏上显示输入的速度上限判断两个红外线接受管是否正常接收到红外信号 N 绿灯亮,准备计时 Y Y物体经过红外对管,开始计时计时结束,计算物体速度,并在液晶屏显示判断是否超速 N Y红灯亮,蜂鸣器发出报警 结束 2. 3. 2各模块
13、子程序流程图及设计说明(1)键盘子程序int keyValue()开始端口设置初始化, 列端口为输出,行端口为输入向列端口高四位循环送入低电平行端口低四位是否有低电平?翻译成相应键值是否int keyValue() /键盘输入 row=0,col=0; /先判断行号 PORTSetPinsDigitalOut(IOPORT_F, BIT_13 | BIT_12); PORTSetPinsDigitalOut(IOPORT_B, BIT_13 | BIT_14); PORTSetPinsDigitalIn(IOPORT_B, BIT_8 | BIT_9 | BIT_11 | BIT_12); P
14、ORTSetBits(IOPORT_B, BIT_8|BIT_9|BIT_11|BIT_12); PORTClearBits(IOPORT_B, BIT_13|BIT_14); PORTClearBits(IOPORT_F, BIT_13|BIT_12); while(1) unsigned int i = 0; for(i=0;i50000;i+); if(PORTBbits.RB8 = 0) col=4; else if(PORTBbits.RB9 = 0) col=3; else if(PORTBbits.RB11 = 0) col=2; else if(PORTBbits.RB12 =
15、 0) col=1; else col=0; if(col!=0) break; /再判断列号 PORTSetPinsDigitalIn(IOPORT_F, BIT_13 | BIT_12); PORTSetPinsDigitalIn(IOPORT_B, BIT_13 | BIT_14); PORTSetPinsDigitalOut(IOPORT_B, BIT_8 | BIT_9 | BIT_11 | BIT_12); PORTClearBits(IOPORT_B, BIT_8|BIT_9|BIT_11|BIT_12); PORTSetBits(IOPORT_B, BIT_13|BIT_14)
16、; PORTSetBits(IOPORT_F, BIT_13|BIT_12); while(1) unsigned int i = 0; for(i=0;i0;a-)for(b=1000;b0;b-);(2)液晶屏显示程序/*延时程序*/void delay(uint x) uint a,b;for(a=x;a0;a-)for(b=1000;b0;b-);/*初始化程序*/void set_port(uchar data)DB=data;DB0=DB%2;DB1=DB/2%2;DB2=DB/4%2;DB3=DB/8%2;DB4=DB/16%2;DB5=DB/32%2;DB6=DB/64%2;D
17、B7=DB/128%2;/*液晶屏写数据*/void write_data(uchar data) RS=1; /高电平写数据。 set_port(data); /将数据写入PORTE中。 delay(20); /调用延时函数。 EN=1; /使能。 delay(20); /调用延时函数。 EN=0; /关闭。 delay(20); /*液晶屏写命令*/void write_com(uchar com) RS=0; /低电平代表命令。 set_port(com); /将命令放入PORTE中。 delay(20); /调用延时函数。 EN=1; /使能。 delay(20); /调用延时函数。
18、EN=0; /关闭。 delay(20); /*总线初始化*/void Init(void) delay(20); TRISG=0X00;TRISE=0X00;/PORTE=0; /设置D口为输出口,输出数据为0。 write_com(0x38); /设置8为总线、双行显示、57点阵。 delay(20); write_com(0x0c); /开显示,显示光标,光标闪烁。 delay(20); write_com(0x06); /光标右移。 delay(20); /write_com(0x80); /第1行显示位置。 delay(20); write_com(0x01); /清屏。 delay
19、(20);(3)报警程序开始RD5置零,蜂鸣器发出声音RD0置高电位,红灯亮结束/*蜂鸣器发出警报并亮红*/void loudspeaker() PORTClearBits(IOPORT_D, BIT_5);PORTSetBits(IOPORT_D, BIT_0);3系统调试31硬件调试(1)44矩阵键盘的调试刚开始直接将键盘的引脚与单片机的管脚连接,但无法正确读取输入信息,液晶屏上出现乱码等不符合要求的字符。后来把每个管脚通过一个1.5K的上拉电阻与+5V的电源相接,结果就能正常实现其功能了。(2)红外线发射/接收系统的调试 在这个模块中,红外对管的电路在网上资料中有不少,大体上有两种方案:
20、一是红外发射管需要外部电路提供晶振,二是红外发射管只需接直流电源。经过反复查阅计算以及实际检验,最终确定使用第二种方案。电路的设计不是很困难。只是在用示波器检测红外接收电路的输出电位时,错误地使用交流信号的检测通道,实际上输出的是两种电位,一低一高,分别对应着接收到与没接收到红外信号两种情况,用示波器的直流通道检测十分明显。 在接收电路的电阻阻值选取上,原本使用800K,输出的高电位为+5V,但与单片机连接时发现,单片机检测的高电压在3.2V左右即可,过高的电位恐怕会损坏管脚,故将阻值改为500K,使得接收电路的高电位在4V。(3)蜂鸣器的调试蜂鸣器的调试遇到与红外线接收电路类似的问题,由于单
21、片机发出的高电位是3.2V,并非+5V,所以若蜂鸣器的正极接在+5V电源上时,当RD5输出高电位时,由于5V与3.2V仍然存在一定的电位差,故原本不发声的蜂鸣器依然会发出微小的声音。改进的方法便是通过分压,使蜂鸣器正极接在4V左右的电压上。32软件调试(1)记录输入数字的大小 程序中键盘输入的子函数int keyValue()在编写时设定返回的值number意思为键盘中的第number个字符。数字19在键盘上分别为第19个字符,返回值与按键上的值是一致的。但数字0是键盘上第10个字符,两者并不相等。在意识到这个问题前,当按下数字0,显示的数字就和预想的不一致。经过仔细排查,终于发现这个小漏洞,
22、在主函数中将返回值10强制转换为0,实现了键盘正常的功能。代码如下:while(1) n=keyValue();if(n10)break; if (n=10) /将返回值10强制转换为0 n=0; sum=sum*10+n; /记录输入数字的大小while(1) if(PORTFbits.RF13 &PORTFbits.RF12&PORTBbits.RB13&PORTBbits.RB14)=1)delay(20); if(PORTFbits.RF13 &PORTFbits.RF12&PORTBbits.RB13&PORTBbits.RB14)=1) break;33软件硬件联调(1)键盘的防抖
23、动功能 在软硬件联调时, 键盘输入遇到以下情况:按一下按钮就会重复显示好几个数字。针对这种小Bug,我们在主函数中调用键盘子函数的while循环里增加了防抖动功能,代码如下:while(1) /按键防抖动 if(PORTFbits.RF13 &PORTFbits.RF12&PORTBbits.RB13&PORTBbits.RB14)=1)delay(20); if(PORTFbits.RF13 &PORTFbits.RF12&PORTBbits.RB13&PORTBbits.RB14)=1) break; 这段代码的功能便是,当单片机检测到操作人仍然按在键盘按钮上时,不跳出循环,知道按钮松开,
24、才继续检测下一个按钮输入的信号。这就使得每按一次按钮,只能在液晶屏上显示一个数字,保证输入的准确性。(2)液晶屏的调试在调试液晶屏时,专门写了一个简单程序,目的是让屏幕显示两行字符,检测液晶屏能否正常工作。一开始显示的是乱码,我们首先用欧姆表,检查液晶屏的管脚和单片机管脚是否导通,确认无误后,便测试显示屏用到的单片机所有的管脚是否能正常输出高低电位,发现RS对应的管脚是无法正常工作的,于是我们便将RS更换到单片机的另一个管脚。最后,在于其他小组的同学交流中发现,单片机不接地也会引起问题,于是我们给第31号管脚接地,终于能使液晶屏实现最基本的显示功能。4系统指标测试41测试仪器示波器、外用表、稳
25、压直流电源42技术指标测试红外接收系统输出高电平为3.5至4 V,低电平为0V。蜂鸣器控制端高电位为3.2V,低电位为0V。5结论本系统基本实现了预期的功能和技术指标。系统的主要实现功能有: 自行设定速度上限; 通过测量物体遮挡两套红外接收仪器的时间间隔,计算出物体运行速度; 液晶屏显示输入数字与测量结果; 超速时,红灯亮,蜂鸣器响起。在计算被测物体的速度时,由于没能对程序运行时间有精确的计算,故最后测出的“速度”没能以标准单位m/s作为单位,而是一个与速度的大小成正比的数字。经过反复测算,我们给“速度”的计算公式添加了一个合适的参数,使得速度的变化比较明显。这是本实验可以继续改进的地方。6致
26、谢、心得、体会接近四个星期的实验,让我学到了很多关于单片机硬件及其编程的知识,实在是受益匪浅。首先,对新知识的自我学习和理解能力有了提高。刚开始,对单片机几乎没有什么概念。开头几节课,老师介绍了单片机的一些基本工作原理,让我感觉到了微型计算机的魅力。接下来,我们自习的阅读了资料,对它有了进一步的了解。同时,开始对书上的程序进行修改、调试。当头脑中对单片机形成了基本的概念时,我们开始寻找自己的课题,然后投入到软硬件具体的编写测试中。整个实验过程中,大部分用到的知识都是我们小组内的成员自行学习、互相交流,一步步认识到的,这对我们的自学能力是一个极大的考验。当然,困难与障碍的消除也离不开指导老师和周
27、围同学的帮助。其次,我对硬件也有了更好的理解。本次实验中,硬件部分的连接与调试基本都是由本人完成,相比之下我的认识可能更深一些。本次实验有几块外部的硬件模块,如红外发射/接收电路、蜂鸣器电路、键盘电路等,虽然事后看来,这些电路都并不复杂,但在调试的过程中具体遇到的问题不小,例如对红外对管的工作原理没弄懂,导致一开始发射电路有多套方案,经过反复测试才定下最终方案。又如,单片机的高低电平使得我对二进制有了更好的理解。以前觉得很神奇的操作,现在也有了一丝基本的理解。再复杂的功能,也是通过编程时计算机输出高低电位,实现控制外部电路的功能。另外,我的程序编写能力有了很大的提升。因为实现测速报警的设计,我
28、们必须写出符合硬件要求的代码。液晶、键盘和其他外围的电路,都要求我们有着良好正确的编程习惯。在这个过程中,我深切地体会到了流程图的重要性。当我把我想要实现的函数在流程图上体现出来后,一切就都变得明白和清晰。同时,良好的编译习惯与适当的注释,能提高程序的可读性,方便以后的检查验收等。最后,这次实验也让我认识到了分工合作的重要性。有人也许有很强的能力,可是如果他不懂得和他人合作,我相信他就不能真正的体现出自己的能力出来。这次实验,我和我的搭档们,分工明确,在实验过程中,对自己遇到的困难,和搭档一起讨论,使得双方的水平都得到了很大的提升。同时,这次实验也更好的锻炼了自己和他人的沟通能力。实验中让我印
29、象最深刻的就是细质和耐心的重要性。譬如有时候实验结果出不来,以为是编程有逻辑错误,但经过一步步排查,才发现是单片机的某个管脚本身有问题。失败的打击与枯燥的调试很让人心烦意燥,但我们组员相互鼓励,冷静思考,细心分析,一一度过了难关,其过程很值得让人回味。总之,这个小学期,我学到了很多,不仅仅只是知识上,同时能力上,精神方面都有了很大的提升。正如第一节课上说老师的,这次小学期对在我们大学生涯中有着重要的地位,因为对大多数同学而言,这可能是唯一一次完整地,在软件和硬件上都进行研究和学习的大型的实验项目。虽然这个小学期经常都呆实验室里,有时甚至双休日也不能休息,有点辛苦,可是其中的乐趣却远远大于苦。当
30、然,我们这个实验做得还不够好,仍有很大的改进空间,测量结果的精确度也可以进一步提高。最终能够基本取得成功,也离不开指导老师的教诲,尤其是硬件上遇到困难或不懂的地方,经常要去请教麻烦葛老师,在这里表示衷心的感谢。7参考文献1 李荣正 等编著PIC单片机实验教程北京航天航空大学出版社 2006-2-1I S B N:97878107774382 李荣正 等编著 PIC单片机原理及应用(第3版) 北京航天航空大学出版社 2006-10-1 I S B N:97878107792723 孙安青编著 PIC单片机实用C语言程序设计与典型实例 中国电力出版社 2008-6-1 I S B N:97875083690514 (意)贾西欧 著,张鼎 等译 32位单片机C语言编程:基于PIC32 人民邮电出版社 2009-12-1 I S B N:97871152161208附录附录1红外测速报警系统全图:24