检测技术课程设计智能自行车综合测量报警系统.docx
《检测技术课程设计智能自行车综合测量报警系统.docx》由会员分享,可在线阅读,更多相关《检测技术课程设计智能自行车综合测量报警系统.docx(60页珍藏版)》请在冰点文库上搜索。
![检测技术课程设计智能自行车综合测量报警系统.docx](https://file1.bingdoc.com/fileroot1/2023-5/29/b954b041-66b7-4cca-abc1-8f5732f7e8c1/b954b041-66b7-4cca-abc1-8f5732f7e8c11.gif)
检测技术课程设计智能自行车综合测量报警系统
1设计的背景及意义
在中国,自行车数量和骑自行车人数居世界首位,是公认的头号自行车大国。
在经济飞速发展、科技高度发达的今天,人民生活的物质文化水平日益提高,而自行车却一直是和人们日常生活关系最为密切的交通工具之一。
近年来,科学发展观的观念日渐深入人心,汽车消费的弊端亦日益显现,如汽车产生的大量废气,带来的频繁拥堵,停车位的日趋紧张,既给车主们带来新的不便,大大提高社会成本,又对环境污染带来相当大的影响。
而自行车在所有交通工具中以其低能耗、无污染的特点重新受到人们的青睐。
近期由卫生部、科学技术部和国家统计局联合发布的《中国居民营养健康现状》显示,城市居民的慢性非传染性疾病患病率上升迅速,原因归结于日常饮食结构不合理和身体锻炼缺乏。
随着人民生活物质文化水平的提高,人们越来越多的关注身体健康现状。
自行车在短程活动范围内,对于身体锻炼的作用日益受到重视,在欧美国家,都市白领、中产阶级骑自行车上班已成时尚,在国内,这一趋势亦逐渐明朗。
然而,在大学校园中,二手自行车随处可见,二手车的安全系数也日渐被关注;在社会治安方面,自行车偷盗屡见不鲜,自行车防盗功能越来越受重视。
随着自行车的使用的日益增加,随之而来的这些问题亟待解决,这都对自行车的设计和功能提出了更高的要求。
基于这一现状,我们课题组设计制作了基于增强型51单片机的“智能”自行车综合测量报警系统。
截止到目前为止,所制作系统共可完成6项功能,包括速度测量、超速报警、防盗报警、用户锁定及解锁、用户切换、时间显示等(具体功能介绍见第三部分)。
所设计制作的“智能”自行车综合测量报警系统以外挂表箱的形式接入到自行车中,对自行车自身的性能没有特殊要求,不仅功能全面,成本也先对较低(本实验产品成本为30元),适于投放入市场进行推广。
该系统的应用,能够有效地进行防盗报警,减少自行车偷盗的发生;其超速报警系统能够及时有效地提醒车主车速,减少交通事故的发生;此外,自行车的智能化将对倡导自行车的使用作出积极影响,巩固树立国民的环保意识,为国民体质的增强作出贡献。
2系统模块介绍
1、干簧管
简介:
干簧管作为一种磁敏的特殊开关,也称干簧继电器。
它通常由两个或三个软磁性材料做成的簧片触点,被封装在充有惰性气体(如氮、氦等)或真空的玻璃管里,玻璃管内平行封装的簧片端部重叠,并留有一定间隙或相互接触以构成开关的常开或常闭接点。
工作原理:
当永久磁铁靠近干簧管时,或者由绕在干簧管上面的线圈通电后形成磁场使簧片磁化时,簧片的接点就会感应出极性相反的磁极。
由于磁极极性相反而相互吸引,当吸引的磁力超过簧片的抗力时,分开的接点便会吸合;当磁力减小到一定值时,在簧片抗力的作用下接点又恢复到初始状态。
这样便完成了一个开关的作用。
用途:
测速、报警等
优点:
干簧管比一般机械开关结构简单、体积小、速度高、工作寿命长;而与电子开关相比,它又有抗负载冲击能力强等特点,工作可靠性很高。
2、24c08
简介:
24c08是一个8K位串行CMOSE2PROM,内部含有1024个8位字节,CATALYST公司的先进CMOS技术实质上减少了器件的功耗.CAT24WC08有一个16字节页写缓冲器.该器件通过I2C总线接口进行操作有一个专门的写保护功能.
3、DS1302
简介:
DS1302是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V~5.5V。
工作原理:
DS1302引脚图
采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。
DS1302内部有一个31×8的用于临时性存放数据的RAM寄存器。
DS1302是DS1202的升级产品,与DS1202兼容,但增加了主电源/后备电源双电源引脚,同时提供了对后备电源进行涓细电流充电的能力。
引脚功能:
DS1302的引脚排列,其中Vcc1为后备电源,VCC2为主电源。
在主电源关闭的情况下,也能保持时钟的连续运行。
DS1302由Vcc1或Vcc2两者中的较大者供电。
当Vcc2大于Vcc1+0.2V时,Vcc2给DS1302供电。
当Vcc2小于Vcc1时,DS1302由Vcc1供电。
X1和X2是振荡源,外接32.768kHz晶振。
RST是复位/片选线,通过把RST输入驱动置高电平来启动所有的数据传送。
RST输入有两种功能:
首先,RST接通控制逻辑,允许地址/命令序列送入移位寄存器;其次,RST提供终止单字节或多字节数据的传送手段。
当RST为高电平时,所有的数据传送被初始化,允许对DS1302进行操作。
如果在传送过程中RST置为低电平,则会终止此次数据传送,I/O引脚变为高阻态。
上电运行时,在Vcc>2.0V之前,RST必须保持低电平。
只有在SCLK为低电平时,才能将RST置为高电平。
I/O为串行数据输入输出端(双向),后面有详细说明。
SCLK为时钟输入端。
优点:
DS1302可以用于数据记录,特别是对某些具有特殊意义的数据点的记录,能实现数据与出现该数据的时间同时记录。
这种记录对长时间的连续测控系统结果的分析及对异常数据出现的原因的查找具有重要意义。
传统的数据记录方式是隔时采样或定时采样,没有具体的时间记录,因此,只能记录数据而无法准确记录其出现的时间;若采用单片机计时,一方面需要采用计数器,占用硬件资源,另一方面需要设置中断、查询等,同样耗费单片机的资源,而且,某些测控系统可能不允许。
但是,如果在系统中采用时钟芯片(如左图)DS1302,则能很好地解决这个问题。
4、8位共阳极数码管
本次应用:
为使显示更加准确清晰,本系统还采用了8位共阳极数码管
用途:
由于它的价格便宜使用简单在电器特别是家电领域应用极为广泛,空调、热水器、冰箱等等。
绝大多数热水器用的都是数码管,其他家电也用液晶屏与荧光屏。
5、蜂鸣器(如下图)
三、功能一览
该智能自行车综合系统实现了集测量防盗报警等一系列的功能如下:
1,数据测量:
该系统可以实现平均速度、瞬时速度的输出,以及行驶总里程的输出
2,超速报警:
系统设置有超速报警功能,为用户安全提供可靠性保障,该超速报警的速度值可人工调节大小。
3,防盗报警:
为安全行考虑,系统设有防盗功能,在系统锁定之后,若移动自行车并且未能输入正确的解锁密码,则启动报警功能。
4,用户锁定及解锁:
该智能系统设有用户使用权,可以对该系统进行锁定,并通过按键实现解锁功能。
5,用户切换:
为人性化考虑,系统可支持多用户操作,每个用户可设置其密码,并可以通过按键实现用户切换,密码可自行设置。
6,时间显示:
系统配有时间显示模块,可以显示自行车的行驶时间,还可以输出当前的时间。
超速报警
数据测量
四、程序代码
#include
#include
typedefunsignedcharuchar;
typedefunsignedintuint;
#defineAN_CJ_DL100//长按键时间
#defineKEY00/*无按键代码*/
#defineKEY10x01/*按键1编码*/
#defineKEY20x02/*按键2编码*/
#defineKEY30x03/*按键3编码*/
#defineKEY40x04/*按键4编码*/
#defineKEY50x05/*按键5编码*/
#defineKEY60x06/*按键6编码*/
#defineKEY70x07/*按键7编码*/
#defineKEY80x08/*按键8编码*/
#defineKEY1L0x11/*长按键1编码*/
#defineKEY2L0x12/*长按键2编码*/
#defineKEY3L0x13/*长按键3编码*/
#defineKEY4L0x14/*长按键4编码*/
#defineKEY5L0x15/*长按键5编码*/
#defineKEY6L0x16/*长按键6编码*/
#defineKEY7L0x17/*长按键7编码*/
#defineKEY8L0x18/*长按键8编码*/
#defineKEY_NOKEY0/*无按键*/
#defineKEY_CYCLETIME10/*按键采样周期毫秒*/
#defineKEY_PRESS_TIME1500/*长按时间,毫秒*/
#defineKEY_SHORTPRESS_TIME40//短按时间毫秒
#definekey_spd1KEY1
#definekey_evespdKEY2
#definekey_t_sumKEY3
#definekey_s_sumKEY4
#definekey_1302KEY5
#definekey_plusKEY6
#definekey_minusKEY7
#definekey_lockKEY1L
#definekey_unlockKEY2L
#defineOP_READ0xa1//器件地址以及读取操作,0xa1即为10100001B
#defineOP_WRITE0xa0//器件地址以及写入操作,0xa1即为10100000B
#definelight_step10
volatileunsignedcharB_keymark;/*有按键标志*/
volatileunsignedcharkeypress;/*当前按键*/
volatileunsignedcharkeypress_old;/*当前按键*/
volatileunsignedintkeycontinue;/*长按键计数*/
volatileunsignedchargetkey,key_buff;
volatileunsignedcharkeyreact;
volatileunsignedlongintspd_alarm=1000;//报警速度10m/s
sbitSDA=P1^6;//将串行数据总线SDA位定义在为P3.5引脚
sbitSCL=P1^5;//将串行时钟总线SDA位定义在为P3.4引脚
sbitSCLK=P1^0;//位定义1302芯片的接口,时钟输出端口定义在P1.0引脚
sbitDATA=P1^1;//位定义1302芯片的接口,数据输出端定义在P1.1引脚
sbitRST=P1^2;//位定义1302芯片的接口,复位端口定义在P1.2引脚
sbitsound=P1^7;//将sound位定义为P1^7引脚
sbitlight=P1^3;//数码管亮度
ucharcodeBCD_7[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff};//定义共阳极字型码0123456789-空
uintdis_ptr[6]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};//0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe
uchard[6];
ucharsecond,minute,hour,second1,minute1,hour1,day1,month1,year1;//骑行时间1302时间
uintquan;//圈数
uintt1,t2;//单圈时间
uintm,n1,n,p;//计时辅助n1表示经过单圈时间单位10msn是总时间不断累加
volatileuintspd1,spd1_history;//单圈速度
uints_sum,t_sum,t_sum_1s;//本次总路程
uintspd_average;
volatileuintc=200;//轮子周长cm
uintdisdata;//要显示的数据
uintstate=1,run_flag;//当前显示状态运行标志
charstate_5_flag=-1,state_4_flag=-1;//状态5的分状态标志状态4的分状态标志
volatileunsignedintt_dot1ms=0;//用于控制警报声
volatileunsignedcharalarm_flag=0;
uchari,j;
ucharunlock_wei=0,unlock_comm_wei=0;
charuser=0;//用户编号
volatileucharlight_time=100;//数码管亮度
idataucharunlock_comm[2][4]={KEY1,KEY2,KEY3,KEY4,KEY1,KEY2,KEY3,KEY4};//正确的解锁码
idataucharunlock_comm_get[2][4];//接收到的解锁码
/*****************************************************
函数功能:
延时若干微秒
入口参数:
n
***************************************************/
voiddelaynus(unsignedintn)
{
unsignedinti;
for(i=0;i}
/*****************************************************
函数功能:
延时1ms
(3j+2)*i=(3×33+2)×10=1010(微秒),可以认为是1毫秒
***************************************************/
voiddelay1ms()
{
unsignedchari,j;
for(i=0;i<10;i++)
for(j=0;j<33;j++)
;
}
/*****************************************************
***************************************************/
voiddelaynms(unsignedcharn)
{
unsignedchari;
for(i=0;idelay1ms();
}
/*******************************************************************************
/*****************************************************
函数功能:
向1302写一个字节数据
入口参数:
x
***************************************************/
voidWrite1302(unsignedchardat)
{
unsignedchari;
SCLK=0;//拉低SCLK,为脉冲上升沿写入数据做好准备
delaynus
(2);//稍微等待,使硬件做好准备
for(i=0;i<8;i++)//连续写8个二进制位数据
{
DATA=dat&0x01;//取出dat的第0位数据写入1302低位在前,高位在后
delaynus
(2);//稍微等待,使硬件做好准备
SCLK=1;//上升沿写入数据
delaynus
(2);//稍微等待,使硬件做好准备
SCLK=0;//重新拉低SCLK,形成脉冲
dat>>=1;//将dat的各数据位右移1位,准备写入下一个数据位
}
}
/*****************************************************
函数功能:
根据命令字,向1302写一个字节数据
入口参数:
Cmd,储存命令字;dat,储存待写的数据
***************************************************/
voidWriteSet1302(unsignedcharCmd,unsignedchardat)
{
RST=0;//禁止数据传递
SCLK=0;//确保写数居前SCLK被拉低
RST=1;//启动数据传输
delaynus
(2);//稍微等待,使硬件做好准备
Write1302(Cmd);//写入命令字
Write1302(dat);//写数据
SCLK=1;//将时钟电平置于高电平状态
RST=0;//禁止数据传递
}
/*****************************************************
函数功能:
从1302读一个字节数据
入口参数:
x
***************************************************/
unsignedcharRead1302(void)
{
unsignedchari,dat;
delaynus
(2);//稍微等待,使硬件做好准备
for(i=0;i<8;i++)//连续读8个二进制位数据
{dat>>=1;
if(DATA==1)//如果读出的数据是1
dat|=0x80;//将1取出,写在dat的最高位
SCLK=1;//将SCLK置于高电平,为下降沿读出
delaynus
(2);//稍微等待
SCLK=0;//拉低SCLK,形成脉冲下降沿
delaynus
(2);//稍微等待
}
returndat;//将读出的数据返回
}
/*****************************************************
函数功能:
根据命令字,从1302读取一个字节数据
入口参数:
Cmd
***************************************************/
unsignedcharReadSet1302(unsignedcharCmd)
{
unsignedchardat;
RST=0;//拉低RST
SCLK=0;//确保写数居前SCLK被拉低
RST=1;//启动数据传输
Write1302(Cmd);//写入命令字
dat=Read1302();//读出数据
SCLK=1;//将时钟电平置于已知状态
RST=0;//禁止数据传递
returndat;//将读出的数据返回
}
/*****************************************************
函数功能:
1302进行初始化设置
***************************************************/
voidInit_DS1302(void)
{
unsignedcharflag;
flag=ReadSet1302(0x81);
if(flag&0x80)
{//判断时钟芯片是否关闭
WriteSet1302(0x8E,0x00);//根据写状态寄存器命令字,写入不保护指令
WriteSet1302(0x80,((55/10)<<4|(55%10)));//根据写秒寄存器命令字,写入秒的初始值
WriteSet1302(0x82,((33/10)<<4|(33%10)));//根据写分寄存器命令字,写入分的初始值
WriteSet1302(0x84,((17/10)<<4|(17%10)));//根据写小时寄存器命令字,写入小时的初始值
WriteSet1302(0x86,((6/10)<<4|(6%10)));//根据写日寄存器命令字,写入日的初始值
WriteSet1302(0x88,((4/10)<<4|(4%10)));//根据写月寄存器命令字,写入月的初始值
WriteSet1302(0x8c,((11/10)<<4|(11%10)));//根据写年寄存器命令字,写入年的初始值
WriteSet1302(0x90,0xa5);//打开充电功能选择2K电阻充电方式
WriteSet1302(0x8E,0x80);//根据写状态寄存器命令字,写入保护指令
}
}
/*******************************************************************************
以下是对AT24C02的读写操作程序
********************************************************************************/
/***************************************************
函数功能:
开始数据传送
***************************************************/
voidstart()
//开始位
{
SDA=1;//SDA初始化为高电平“1”
SCL=1;//开始数据传送时,要求SCL为高电平“1”
_nop_();//等待一个机器周期
_nop_();//等待一个机器周期
SDA=0;//SDA的下降沿被认为是开始信号
_nop_();//等待一个机器周期
_nop_();//等待一个机器周期
_nop_();//等待一个机器周期
_nop_();//等待一个机器周期
SCL=0;//SCL为低电平时,SDA上数据才允许变化(即允许以后的数据传递)
}
/***************************************************
函数功能:
结束数据传送
***************************************************/
voidstop()
//停止位
{
SDA=0;//SDA初始化为低电平“0”
_nop_();//等待一个机器周期
_nop_();//等待一个机器周期
SCL=1;//结束数据传送时,要求SCL为高电平“1”
_nop_();//等待一个机器周期
_nop_();//等待一个机器周期
_nop_();//等待一个机器周期
_nop_();//等待一个机器周期
SDA=1;//SDA的上升沿被认为是结束信号