自行车测速仪设计报告_第1页
自行车测速仪设计报告_第2页
自行车测速仪设计报告_第3页
自行车测速仪设计报告_第4页
自行车测速仪设计报告_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

word文档可自由复制编辑嵌入式系统设计自行车车速报警系统摘要本课题实验主要是利用STC89C52RC、12864液晶、24C02E^2PROM、霍尔传感器和加速度倾角传感器来实现自行车测速功能。通过霍尔传感器来采集信号,经过单片机处理后,由12864液晶显示其总里程,分里程,速度,加速度;信号经过加速度倾角传感器读出坡度值,并在12864液晶中显示出来;然后由数学公式计算出消耗的卡路里值。12864显示页面一共有三面。按键具有调控展现的页面,清除分里程数据,保存总里程数据的功能,利用24C02实现断电不消失的功能。发光二极管模块,利用MOS管的特性可以实现在暗处自动点亮。关键词:自行车测速仪;霍尔传感器A3144;加速度倾角传感器MMA7455;12864LCD目录1设计要求................................2设计方案................................2.1芯片的选择...............................2.2霍尔传感器与单片机的通信..............2.312864液晶屏与单片机..................2.4单片机与24C02........................2.5单片机与MMA7455......................2.6单片机下载程序........................3总体方案................................3.1工作原理.............................3.2总体设计.............................4系统硬件设计............................4.1STC89C52RC单片机最小系统.............4.2各部分电路电路图.....................4.3整体电路.............................5系统软件设计............................5.1主程序流程...........................参考文献....................................附录........................................1设计要求1.1发光二极管模块在暗处自动点亮功能。1.2利用霍尔传感器采集信号,由单片机处理后控制外围设备工作。1.3利用单片机控制12864液晶屏显示。1.4将指定的数据放入24C02中,达到断电不丢失的效果。1.5用KeiluVision3编写C程序,利用单片机最小系统烧写程序到单片机。1.6利用传感器模块计算倾角(坡度),由12864液晶显示。2设计方案2.1芯片的选择自行车测速仪按系统功能实现要求,决定控制系统采用STC89C52RC单片机,采集信号的霍尔传感器采用A3144,保存信息的E^2PROM24C02,计算倾角的加速度倾角传感器MMA7455,用于显示的12864液晶。2.2霍尔传感器与单片机之间的通信将霍尔传感器的信号输出端和单片机的某一个I/O口相连(本板子中使用P2^3),通过检测P2^3电平的下降沿和上升沿来编写程序,以达到计数的功能。2.312864液晶屏与单片机将12864液晶屏按照其操作指南正确连接在电路中,编写程序,由单片机控制12864液晶显示各种数据。2.4单片机与24C02程序编写中,要求保存功能的按键按下时,总里程的数据写入到24C02芯片中,达到断电不丢失的功能。将24C02按照操作手册正确连接到电路中,由单片机控制,当检查到按键按下时,执行程序:经总里程数据写入24C02中,保存起来。2.5单片机与MMA7455此模块是用集成工艺制作好的商品。按照操作手册正确连接到电路中,根据芯片资料和示例程序可以使其输出角度值,然后在12864中显示出来。2.6单片机下载程序利用单片机最小系统和串口(配合MAX232转电平芯片),借助STC下载器完成程序的烧写。3总体方案3.1工作原理本实验主要是利用STC89C52RC、12864液晶、24C02E^2PROM、霍尔传感器和加速度倾角传感器来实现自行车测速功能。通过霍尔传感器来采集信号,经过单片机处理后,由12864液晶显示其总里程,分里程,速度,加速度;信号经过加速度倾角传感器读出坡度值,并在12864液晶中显示出来;然后由数学公式计算出消耗的卡路里值。12864显示页面一共有三面。按键具有调控展现的页面,清除分里程数据,保存总里程数据的功能,利用24C02实现断电不消失的功能。发光二极管模块,利用MOS管的特性可以实现在暗处自动点亮。3.2设计总体框图STC89C52RCSTC89C52RCA314424C02MMA7455745512864液晶SHAPE4系统硬件设计4.1STC89C52RC单片机最小系统4.1.1最小系统包括晶体振荡电路、复位开关和电源部分。4.2各部分电路4.2.1主要控制部分(STC89C52RC)4.2.212864液晶部分4.2.324C02部分电路4.2.4串口及MAX232部分4.2.5倾角传感器MMA74554.2.6霍尔传感器部分4.2.7发光二极管独立显示模块4.3整体电路5系统软件设计主程序流程图开始开始初始化检查霍尔传感器信号单片机处理信号发出指令操作液晶屏显示参考文献[1]沈红卫《基于单片机结构的智能系统设计与实现》电子工业出版社[2]黄惠媛《单片机原理与接口技术》海洋出版社[3]周平伍云辉《单片机应用技术》电子科技大学出版社[4]吴金戌沈金阳郭庭吉《8051单片机实践与应用》清华大学出版社[5]黄正谨等《电子设计竞赛赛题解析》东南大学出版社附录程序:/*************河北大学电信学院***********//*******************李炜*****************//***********自行车测速仪程序**************/#include<reg52.h>#include<intrins.h>#defineucharunsignedchar#defineuintunsignedint/**********液晶屏相关部分*****************/#definelcd_portP0 //液晶屏指令、数据通信接口sbitrs=P2^7;//液晶屏寄存器选择接口(rs=0时选择指令寄存器,rs=1时选择数据寄存器) sbitrw=P2^6; //液晶屏读写选择接口(rw=0时选择写入,rw=1时选择读出) sbiten=P2^5; //液晶屏使能接口(en=0时通信接口中断,en=1时通信接口接通)sbitret=P2^4;//液晶屏主复位引脚/*********子函数部分*****************/voiddelayms_lcd(uintms); //延时子函数,时间为1msvoiddelay_n10_us(uintn); //10微秒延时函数(n*10us)voidlcd_wr_command(ucharcom); //向液晶屏输入命令子函数voidlcd_wr_data(uchardat); //向液晶屏输入数据单字节子函数voidlcd_int(); //LCD初始化voidpicture_show0();//12864画面0voidpicture_show1(); //12864画面1voidpicture_show2(); //12864画面2voidpicture_select(); //12864画面选择voidkey_select();//按键相关判断voidinterrupt_set();//中断函数参数设定voidstart_24C02(); //24C02起始信号voidwrite_one_char(ucharx); //写入一个字节voidwait_ack(); //等待应答ucharread_one_char(); //读出一个字节voidstop_24C02(); //24C02终止信号voidread_total_distance();//读出24C02中数据并且赋值给total_distancevoidwrite_total_distance();//写入24C02中total_distance数据voidwrite_total_distance1();//写入24C02中total_distance数据voidforbid_data();//限制所有变量的取值/*********24C02相关部分****************/sbitSCL=P1^5; //串口时钟引脚sbitSDA=P1^4; //串口数据引脚/**********相关数组部分***********/ucharcodedata1[]="欢迎使用";ucharcodedata2[]="自行车测速仪";ucharcodedata3[]="制作人";ucharcodedata4[]="李炜";ucharcodedata5[]="赵向辉";ucharcodedata6[]="总里程";ucharcodedata7[]="分里程";ucharcodedata8[]="速度";ucharcodedata9[]="加速度";ucharcodedata10[]="坡度";ucharcodedata11[]="卡路里";ucharcodedata12[]="请注意安全";ucharcodedata_show[]="0123456789" ;/***********相关变量部分************/uintnew_total_distance=0,old_total_distance=0;//四位数据uintnew_part_distance=0,old_part_distance=0;//三位数据uintold_speed=0,new_speed=0;//两位数据uintold_acceleration=0,new_acceleration=0;//两位数据uintold_ascent=0,new_ascent=0;//三位数据uintcalorie=0;//三位数据ucharold_j=0,new_j=0,part_flag=0,write_flag=0,show_flag=0,control_flag=0;staticuinttime=0;/*******按键相关**************/sbitkey1=P1^0; //页面上翻sbitkey2=P1^1; //手动保存sbitkey3=P1^2; //页面下翻sbitkey4=P1^3; //清除分里程数据/*********霍尔传感器相关部分**********/sbitA3145_OUT=P2^3;/***********************************/voidmain(){ read_total_distance(); lcd_int(); //LCD初始化 picture_show0(); delayms_lcd(2000); lcd_int(); picture_show1(); delayms_lcd(2000); lcd_int(); picture_show2(); delayms_lcd(2000); interrupt_set(); A3145_OUT=1; while(1) { key_select(); picture_select(); if(control_flag==0) new_total_distance=new_part_distance; if(show_flag==1) { if(old_j==1) picture_show1(); if(old_j==2) picture_show2(); } if(part_flag==1) { while(A3145_OUT==0); ET0=0; TR0=0; new_speed=250/time; new_acceleration=(new_speed-old_speed)*50/time; time=0; ET0=1; TR0=1; new_part_distance+=5; calorie=(calorie+5); part_flag=0; show_flag=1; } forbid_data(); }}/************限制所有变量的取值************/voidforbid_data(){ if((old_total_distance+new_total_distance)>9999) { new_total_distance=old_total_distance=0; } if(new_part_distance>999) { new_part_distance=0; write_total_distance(); read_total_distance(); } if(new_speed>99) new_speed=0; if(new_acceleration>99) new_acceleration=0; if(calorie>999) calorie=0;}/***********LCD显示画面0********************/voidpicture_show0(){ uchari; i=0; lcd_wr_command(0x82); //设置液晶屏的显示位置 while(data1[i]!=0) { lcd_wr_data(data1[i]); i++; } i=0; lcd_wr_command(0x91); while(data2[i]!=0) { lcd_wr_data(data2[i]); i++; } i=0; lcd_wr_command(0x8A); while(data3[i]!=0) { lcd_wr_data(data3[i]); i++; } i=0; lcd_wr_command(0x99); while(data4[i]!=0) { lcd_wr_data(data4[i]); i++; } i=0; lcd_wr_command(0x9C); while(data5[i]!=0) { lcd_wr_data(data5[i]); i++; }}/**************LCD画面1********************/voidpicture_show1(){ uchari,flag=0; uinttemp; i=0; lcd_wr_command(0x81); //设置液晶屏的显示位置 while(data6[i]!=0) { lcd_wr_data(data6[i]); i++; } lcd_wr_command(0x84); temp=(new_total_distance+old_total_distance); if(temp/1000==0) lcd_wr_data(''); else { lcd_wr_data(data_show[temp/1000]); //显示数据(字符) flag=1; } temp%=1000; if((temp/100)!=0||flag==1) { lcd_wr_data(data_show[temp/100]); //显示数据(字符) flag=1; } else lcd_wr_data(''); temp%=100; if((temp/10)!=0||flag==1) { lcd_wr_data(data_show[temp/10]); //显示数据(字符) flag=1; } else lcd_wr_data(''); temp%=10; lcd_wr_data(data_show[temp]); //显示数据(字符) lcd_wr_command(0x86); lcd_wr_data('m'); i=0; flag=0; lcd_wr_command(0x91); while(data7[i]!=0) { lcd_wr_data(data7[i]); i++; } lcd_wr_command(0x94); temp=new_part_distance; if(temp/100==0) lcd_wr_data(''); else { lcd_wr_data(data_show[temp/100]); //显示数据(字符) flag=1; } temp%=100; if((temp/10)!=0||flag==1) { lcd_wr_data(data_show[temp/10]); //显示数据(字符) flag=1; } else lcd_wr_data(''); temp%=10; lcd_wr_data(data_show[temp]); //显示数据(字符) lcd_wr_command(0x96); lcd_wr_data('m'); i=0; flag=0; lcd_wr_command(0x89); while(data8[i]!=0) { lcd_wr_data(data8[i]); i++; } lcd_wr_command(0x8B); temp=new_speed; if(temp/10==0) lcd_wr_data(''); else lcd_wr_data(data_show[temp/10]); //显示数据(字符) temp%=10; lcd_wr_data(data_show[temp]); //显示数据(字符) lcd_wr_command(0x8C); lcd_wr_data('m'); lcd_wr_data('/'); lcd_wr_data('s'); i=0; old_speed=new_speed; lcd_wr_command(0x99); while(data12[i]!=0) { lcd_wr_data(data12[i]); i++; }}/**************LCD画面2********************/voidpicture_show2(){ uchari,flag=0; uinttemp; i=0; lcd_wr_command(0x81); while(data9[i]!=0) { lcd_wr_data(data9[i]); i++; } lcd_wr_command(0x84); temp=new_acceleration; if(temp/10==0) lcd_wr_data(''); else lcd_wr_data(data_show[temp/10]); //显示数据(字符) temp%=10; lcd_wr_data(data_show[temp]); //显示数据(字符) lcd_wr_command(0x85); lcd_wr_data('m'); lcd_wr_data('/'); lcd_wr_data('s'); lcd_wr_data('2'); i=0; flag=0; lcd_wr_command(0x91); while(data10[i]!=0) { lcd_wr_data(data10[i]); i++; } lcd_wr_command(0x93); temp=new_ascent; if(temp/100==0) lcd_wr_data(''); else { lcd_wr_data(data_show[temp/100]); //显示数据(字符) flag=1; } temp%=100; if((temp/10)!=0||flag==1) { lcd_wr_data(data_show[temp/10]); //显示数据(字符) flag=1; } else lcd_wr_data(''); temp%=10; lcd_wr_data(data_show[temp]); //显示数据(字符) lcd_wr_command(0x95); lcd_wr_data(0x09); i=0; flag=0; lcd_wr_command(0x89); while(data11[i]!=0) { lcd_wr_data(data11[i]); i++ ; } lcd_wr_command(0x8C); temp=calorie; if(temp/100==0) lcd_wr_data(''); else { lcd_wr_data(data_show[temp/100]); flag=1; } temp%=100; if((temp/10)!=0||flag==1) { lcd_wr_data(data_show[temp/10]); //显示数据(字符) flag=1; } else lcd_wr_data(''); temp%=10; lcd_wr_data(data_show[temp]); //显示数据(字符) lcd_wr_command(0x8E); lcd_wr_data('k'); i=0; flag=0; lcd_wr_command(0x99); while(data12[i]!=0) { lcd_wr_data(data12[i]); i++ ; }}/***************LCD初始化************************/voidlcd_int(){ ret=0; //液晶屏复位 delayms_lcd(2); ret=1; delayms_lcd(2); lcd_wr_command(0x30); //启动液晶屏基本指令集并开启绘图显示功能 lcd_wr_command(0x0c); //开显示,关光标,不闪烁 lcd_wr_command(0x06);//字符进入模式为:字符不动,光标右移,地址加一 lcd_wr_command(0x01);//清屏 delayms_lcd(2);//等待清屏完成}/**********向液晶屏写入命令子函数******************/voidlcd_wr_command(ucharcom){ en=0;//关闭通信,为设置参数做准备 rs=0;//选择指令寄存器 rw=0;//写入液晶 en=1;//为开始通信做准备 lcd_port=com; delay_n10_us(8);//大于72us的延时(根据手册) en=0;//数据送如液晶屏并关闭通信(en的下降沿液晶屏接收数据)}/********向液晶屏输入数据子函数************/voidlcd_wr_data(uchardat){ en=0;//关闭通信,为设置参数做准备 rs=1;//选择数据寄存器 rw=0;//写入液晶 en=1;//为开始通信做准备 lcd_port=dat; delay_n10_us(8);//大于72us的延时(根据手册) en=0;//数据送如液晶屏并关闭通信(en的下降沿液晶屏接收数据)}/***********毫秒延时函数,延时1ms***********/voiddelayms_lcd(uintms){ uchari; while(ms--) { for(i=0;i<121;i++); }}/***********10微秒延时函数(n*10us)***********/voiddelay_n10_us(uintn){ while(n--) { _nop_(); _nop_(); }}/*************LCD显示画面选择********************/voidpicture_select(){ if(old_j==new_j) ; else { switch(new_j) { case1: lcd_int(); picture_show1(); old_j=new_j; break; case2: lcd_int(); picture_show2(); old_j=new_j; break; } }} /*************按键相关判断********************/voidkey_select(){ if(key1==0) { delayms_lcd(7); if(key1==0) { new_j=2; while(key1==0); } } if(key2==0) { delayms_lcd(7); if(key2==0) { old_total_distance+=new_total_distance; new_total_distance=0; write_total_distance(); control_flag=1; while(key2==0); } } if(key3==0) { delayms_lcd(7); if(key3==0) { new_j=1; while(key3==0); } } if(key4==0) { delayms_lcd(7); if(key4==0) { old_total_distance+=new_total_distance; new_part_distance=0; while(key4==0); } }}/*************中断函数参数设定**************/voidinterrupt_set(){ TMOD=0x11; //00010001T1、T0工作在定时方式1 TH1=(65536-10000)/256; //T1定时时间为10毫秒(10000微秒) TL1=(65536-10000)%256; TH0=(65536-20000)/256; TL0=(65536-20000)%256; ET1=1; //启动T1中断允许位 ET0=1; EA=1; //启动总中断允许位 TR1=1; //启动T1 TR0=1;}/*************T1中断函数**************/voidtimer1()interrupt3using1{ ET1=0; //关闭T1中断允许位 TH1=(65536-10000)/256; //重设T1定时时间为10毫秒(10000微秒) TL1=(65536-10000)%256; if(A3145_OUT==0) { part_flag=1; } ET1=1; //开启T1中断允许位}/*************T0中断函数**************/voidtimer2()interrupt1using2{ TH0=(65536-20000)/256; TL0=(65536-20000)%256; time++;}/*************写入24C02中数据************/voidwrite_total_distance(){ start_24C02(); write_one_char(0xa0); wait_ack(); write_one_char(0x01); wait_ack(); write_one_char(old_total_distance/256); wait_ack(); stop_24C02(); delayms_lcd(100); start_24C02(); write_one_char(0xa0); wait_ack(); write_one_char(0x02); wait_ack(); wr

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论