单片机设计实验报告红外测速报警仪文档格式.docx
- 文档编号:18769279
- 上传时间:2023-01-01
- 格式:DOCX
- 页数:19
- 大小:1.33MB
单片机设计实验报告红外测速报警仪文档格式.docx
《单片机设计实验报告红外测速报警仪文档格式.docx》由会员分享,可在线阅读,更多相关《单片机设计实验报告红外测速报警仪文档格式.docx(19页珍藏版)》请在冰豆网上搜索。
若物体速度大于输入的“速度上限”,则启动蜂鸣系统并亮红灯,向操作者发出警报。
2.系统设计
2.1总体设计
2.1.1原理模块框图
2.1.2模块工作原理说明
单片机开始工作时,首先是键盘输入系统输入“速度上限”,然后单片机判断两套红外发射接收对管是否正常工作。
进入正常工作状态后,PIC单片机上的绿灯亮起,代表可以被测物体可以经过红外对管,进行测速工作。
根据公式:
求得物体的速度v后,在液晶屏上显示被测速度的大小。
最后系统进行判断,若被测物体速度大于输入的“速度上限”,则启动蜂鸣系统并亮红灯,向操作者发出警报。
2.2各模块设计及参数计算
2.2.1键盘输入系统
4×
4标准输入键盘实物图:
4标准输入键盘模块框图:
RB14RB13RF12RF13
4标准键盘共有8个输出接口,分别对应着4列与4行。
连接时,每个接口通过5.1KΩ的电阻接到+5V的电源上,同时与单片机设定的相关管脚相连。
2.2.2液晶显示系统
RT1602C点阵式液晶显示器实物图:
RT1602C点阵式液晶显示器电路图:
RT1602C点阵式液晶显示器各接口功能:
第1脚:
VSS为地电源。
第2脚:
VDD接5V正电源。
第3脚:
V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。
第4脚:
RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。
第5脚:
RW为读写信号线,高电平时进行读操作,低电平时进行写操作。
当RS和RW共同为低电平时可以写入指令或者显示地址,当RS为低电平RW为高电平时可以读忙信号,当RS为高电平RW为低电平时可以写入数据。
第6脚:
E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。
第7~14脚:
D0~D7为8位双向数据线。
第15~16脚:
空脚
1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,这些字符有:
阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”。
在本实验中,管脚1、3、5均接地,管脚2接+5V电源,管脚15和16置空,其余管脚直接与PIC单片机相关的I/O管脚相连,实现单片机对液晶屏显示字符的控制。
2.2.3红外线发射/接收系统
红外线发射/接收系统实物图:
红外线发射/接收系统电路图:
接收管的I/O端直接与单片机的管脚相连接。
当红外线接收管接收不到发射管发出的信号时,I/O端输出高电平(3.5~4V),当接收到红外信号时,则输出低电平(0V)。
单片机通过检测红外接收端输出的高低电平,决定计时的开始与结束。
2.2.4蜂鸣器报警系统
蜂鸣器报警系统实物图:
蜂鸣器报警系统电路图:
蜂鸣器的整机接到正电源(通过对VCC+5V的分压,使得电源为+4V左右),蜂鸣器的负极接到三极管的发射极E,三极管的基极B经过限流电阻R1后由单片机的RD5管脚控制。
当RD5输出高电平时三极管T1截止,蜂鸣器不发声;
当RD5输出低电平时,三极管导通,蜂鸣器的电流形成回路,发出声音。
2.3软件系统设计
2.3.1系统软件流程图
N
Y
2.3.2各模块子程序流程图及设计说明
(1)键盘子程序intkeyValue()
intkeyValue()//键盘输入
{
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);
PORTSetBits(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)
{
unsignedinti=0;
for(i=0;
i<
50000;
i++);
if(PORTBbits.RB8==0)
col=4;
elseif(PORTBbits.RB9==0)
col=3;
elseif(PORTBbits.RB11==0)
col=2;
elseif(PORTBbits.RB12==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);
PORTSetBits(IOPORT_F,BIT_13|BIT_12);
unsignedinti=0;
if(PORTFbits.RF13==0)
row=4;
elseif(PORTFbits.RF12==0)
row=3;
elseif(PORTBbits.RB13==0)
row=2;
elseif(PORTBbits.RB14==0)
row=1;
row=0;
if(row!
}
//计算按键
number=(col-1)*4+row;
number=0;
//无按键输入则输出0
returnnumber;
}
/********************************延时程序*************************************/
voiddelay(uintx)
uinta,b;
for(a=x;
a>
0;
a--)
for(b=1000;
b>
b--);
(2)液晶屏显示程序
/**********************延时程序**********************/
/**********************初始化程序**********************/
voidset_port(uchardata)
{
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;
DB7=DB/128%2;
/**********************液晶屏写数据**********************/
voidwrite_data(uchardata)
RS=1;
//高电平写数据。
set_port(data);
//将数据写入PORTE中。
delay(20);
//调用延时函数。
EN=1;
//使能。
EN=0;
//关闭。
/**********************液晶屏写命令**********************/
voidwrite_com(ucharcom)
RS=0;
//低电平代表命令。
set_port(com);
//将命令放入PORTE中。
/**********************总线初始化**********************/
voidInit(void)
TRISG=0X00;
TRISE=0X00;
//PORTE=0;
//设置D口为输出口,输出数据为0。
write_com(0x38);
//设置8为总线、双行显示、5×
7点阵。
write_com(0x0c);
//开显示,显示光标,光标闪烁。
write_com(0x06);
//光标右移。
//write_com(0x80);
//第1行显示位置。
write_com(0x01);
//清屏。
(3)报警程序
/*****************蜂鸣器发出警报并亮红***********************/
voidloudspeaker()
{PORTClearBits(IOPORT_D,BIT_5);
PORTSetBits(IOPORT_D,BIT_0);
3.系统调试
3.1硬件调试
(1)4×
4矩阵键盘的调试
刚开始直接将键盘的引脚与单片机的管脚连接,但无法正确读取输入信息,液晶屏上出现乱码等不符合要求的字符。
后来把每个管脚通过一个1.5KΩ的上拉电阻与+5V的电源相接,结果就能正常实现其功能了。
(2)红外线发射/接收系统的调试
在这个模块中,红外对管的电路在网上资料中有不少,大体上有两种方案:
一是红外发射管需要外部电路提供晶振,二是红外发射管只需接直流电源。
经过反复查阅计算以及实际检验,最终确定使用第二种方案。
电路的设计不是很困难。
只是在用示波器检测红外接收电路的输出电位时,错误地使用交流信号的检测通道,实际上输出的是两种电位,一低一高,分别对应着接收到与没接收到红外信号两种情况,用示波器的直流通道检测十分明显。
在接收电路的电阻阻值选取上,原本使用800KΩ,输出的高电位为+5V,但与单片机连接时发现,单片机检测的高电压在3.2V左右即可,过高的电位恐怕会损坏管脚,故将阻值改为500KΩ,使得接收电路的高电位在4V。
(3)蜂鸣器的调试
蜂鸣器的调试遇到与红外线接收电路类似的问题,由于单片机发出的高电位是3.2V,并非+5V,所以若蜂鸣器的正极接在+5V电源上时,当RD5输出高电位时,由于5V与3.2V仍然存在一定的电位差,故原本不发声的蜂鸣器依然会发出微小的声音。
改进的方法便是通过分压,使蜂鸣器正极接在4V左右的电压上。
3.2软件调试
(1)记录输入数字的大小
程序中键盘输入的子函数intkeyValue()在编写时设定返回的值number意思为键盘中的第number个字符。
数字1~9在键盘上分别为第1~9个字符,返回值与按键上的值是一致的。
但数字0是键盘上第10个字符,两者并不相等。
在意识到这个问题前,当按下数字0,显示的数字就和预想的不一致。
经过仔细排查,终于发现这个小漏洞,在主函数中将返回值10强制转换为0,实现了键盘正常的功能。
代码如下:
while
(1)
n=keyValue();
if(n>
10)
if(n==10)//将返回值10强制转换为0
n=0;
sum=sum*10+n;
//记录输入数字的大小
if((PORTFbits.RF13&
&
PORTFbits.RF12&
PORTBbits.RB13&
PORTBbits.RB14)==1)
{delay(20);
PORTBbits.RB14)==1)
break;
3.3软件硬件联调
(1)键盘的防抖动功能
在软硬件联调时,键盘输入遇到以下情况:
按一下按钮就会重复显示好几个数字。
针对这种小Bug,我们在主函数中调用键盘子函数的while循环里增加了防抖动功能,代码如下:
while
(1)//按键防抖动
这段代码的功能便是,当单片机检测到操作人仍然按在键盘按钮上时,不跳出循环,知道按钮松开,才继续检测下一个按钮输入的信号。
这就使得每按一次按钮,只能在液晶屏上显示一个数字,保证输入的准确性。
(2)液晶屏的调试
在调试液晶屏时,专门写了一个简单程序,目的是让屏幕显示两行字符,检测液晶屏能否正常工作。
一开始显示的是乱码,我们首先用欧姆表,检查液晶屏的管脚和单片机管脚是否导通,确认无误后,便测试显示屏用到的单片机所有的管脚是否能正常输出高低电位,发现RS对应的管脚是无法正常工作的,于是我们便将RS更换到单片机的另一个管脚。
最后,在于其他小组的同学交流中发现,单片机不接地也会引起问题,于是我们给第31号管脚接地,终于能使液晶屏实现最基本的显示功能。
4.系统指标测试
4.1测试仪器
示波器、外用表、稳压直流电源
4.2技术指标测试
红外接收系统输出高电平为3.5至4V,低电平为0V。
蜂鸣器控制端高电位为3.2V,低电位为0V。
5.结论
本系统基本实现了预期的功能和技术指标。
系统的主要实现功能有:
1自行设定速度上限;
2通过测量物体遮挡两套红外接收仪器的时间间隔,计算出物体运行速度;
3液晶屏显示输入数字与测量结果;
4超速时,红灯亮,蜂鸣器响起。
在计算被测物体的速度时,由于没能对程序运行时间有精确的计算,故最后测出的“速度”没能以标准单位m/s作为单位,而是一个与速度的大小成正比的数字。
经过反复测算,我们给“速度”的计算公式添加了一个合适的参数,使得速度的变化比较明显。
这是本实验可以继续改进的地方。
6.致谢、心得、体会
接近四个星期的实验,让我学到了很多关于单片机硬件及其编程的知识,实在是受益匪浅。
首先,对新知识的自我学习和理解能力有了提高。
刚开始,对单片机几乎没有什么概念。
开头几节课,老师介绍了单片机的一些基本工作原理,让我感觉到了微型计算机的魅力。
接下来,我们自习的阅读了资料,对它有了进一步的了解。
同时,开始对书上的程序进行修改、调试。
当头脑中对单片机形成了基本的概念时,我们开始寻找自己的课题,然后投入到软硬件具体的编写测试中。
整个实验过程中,大部分用到的知识都是我们小组内的成员自行学习、互相交流,一步步认识到的,这对我们的自学能力是一个极大的考验。
当然,困难与障碍的消除也离不开指导老师和周围同学的帮助。
其次,我对硬件也有了更好的理解。
本次实验中,硬件部分的连接与调试基本都是由本人完成,相比之下我的认识可能更深一些。
本次实验有几块外部的硬件模块,如红外发射/接收电路、蜂鸣器电路、键盘电路等,虽然事后看来,这些电路都并不复杂,但在调试的过程中具体遇到的问题不小,例如对红外对管的工作原理没弄懂,导致一开始发射电路有多套方案,经过反复测试才定下最终方案。
又如,单片机的高低电平使得我对二进制有了更好的理解。
以前觉得很神奇的操作,现在也有了一丝基本的理解。
再复杂的功能,也是通过编程时计算机输出高低电位,实现控制外部电路的功能。
另外,我的程序编写能力有了很大的提升。
因为实现测速报警的设计,我们必须写出符合硬件要求的代码。
液晶、键盘和其他外围的电路,都要求我们有着良好正确的编程习惯。
在这个过程中,我深切地体会到了流程图的重要性。
当我把我想要实现的函数在流程图上体现出来后,一切就都变得明白和清晰。
同时,良好的编译习惯与适当的注释,能提高程序的可读性,方便以后的检查验收等。
最后,这次实验也让我认识到了分工合作的重要性。
有人也许有很强的能力,可是如果他不懂得和他人合作,我相信他就不能真正的体现出自己的能力出来。
这次实验,我和我的搭档们,分工明确,在实验过程中,对自己遇到的困难,和搭档一起讨论,使得双方的水平都得到了很大的提升。
同时,这次实验也更好的锻炼了自己和他人的沟通能力。
实验中让我印象最深刻的就是细质和耐心的重要性。
譬如有时候实验结果出不来,以为是编程有逻辑错误,但经过一步步排查,才发现是单片机的某个管脚本身有问题。
失败的打击与枯燥的调试很让人心烦意燥,但我们组员相互鼓励,冷静思考,细心分析,一一度过了难关,其过程很值得让人回味。
总之,这个小学期,我学到了很多,不仅仅只是知识上,同时能力上,精神方面都有了很大的提升。
正如第一节课上说老师的,这次小学期对在我们大学生涯中有着重要的地位,因为对大多数同学而言,这可能是唯一一次完整地,在软件和硬件上都进行研究和学习的大型的实验项目。
虽然这个小学期经常都呆实验室里,有时甚至双休日也不能休息,有点辛苦,可是其中的乐趣却远远大于苦。
当然,我们这个实验做得还不够好,仍有很大的改进空间,测量结果的精确度也可以进一步提高。
最终能够基本取得成功,也离不开指导老师的教诲,尤其是硬件上遇到困难或不懂的地方,经常要去请教麻烦葛老师,在这里表示衷心的感谢。
7.参考文献
[1]李荣正等编著《PIC单片机实验教程》北京航天航空大学出版社2006-2-1
ISBN:
9787810777438
[2]李荣正等编著《PIC单片机原理及应用(第3版)》北京航天航空大学出版社2006-10-1ISBN:
9787810779272
[3]孙安青 编著《PIC单片机实用C语言程序设计与典型实例》中国电力出版社2008-6-1ISBN:
9787508369051
[4](意)贾西欧著,张鼎等译《32位单片机C语言编程:
基于PIC32》人民邮电出版社2009-12-1ISBN:
9787115216120
8.附录
附录1
红外测速报警系统全图:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 设计 实验 报告 红外 测速 报警