2022年测速仪方案设计书报告 .pdf

上传人:H****o 文档编号:24947811 上传时间:2022-07-08 格式:PDF 页数:29 大小:524.55KB
返回 下载 相关 举报
2022年测速仪方案设计书报告 .pdf_第1页
第1页 / 共29页
2022年测速仪方案设计书报告 .pdf_第2页
第2页 / 共29页
点击查看更多>>
资源描述

《2022年测速仪方案设计书报告 .pdf》由会员分享,可在线阅读,更多相关《2022年测速仪方案设计书报告 .pdf(29页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、汽车测速仪摘要本课题实验主要是利用STC89C52RC、12864 液晶、 24C02E2PROM、霍尔传感器和加速度倾角传感器来实现自行车测速功能。通过霍尔传感器来采集信号,经过单片机处理后,由12864液晶显示其总里程,分里程,速度,加速度;信号经过加速度倾角传感器读出坡度值,并在12864 液晶中显示出来;然后由数学公式计算出消耗的卡路里值。12864 显示页面一共有三面。按键具有调控展现的页面,清除分里程数据,保存总里程数据的功能,利用24C02实现断电不消失的功能。发光二极管模块,利用MOS 管的特性可以实现在暗处自动点亮。关键词 测速仪;霍尔传感器A3144 ;加速度倾角传感器MM

2、A7455 ;12864LCD精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 1 页,共 29 页目录设计要求设计方案.1芯片的选择.2 霍尔传感器与单片机的通信.3 12864液晶屏与单片机.4单片机与24C02 .5单片机与MMA7455 .6单片机下载程序总体方案精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 2 页,共 29 页.工作原理.总体设计系统硬件设计. STC89C52RC 单片机最小系统.各部分电路电路图.整体电路系统软件设计.主程序流程参考文献附录精选学习资料 - - - - -

3、- - - - 名师归纳总结 - - - - - - -第 3 页,共 29 页 设计要求1.1 发光二极管模块在暗处自动点亮功能。1.2 利用霍尔传感器采集信号,由单片机处理后控制外围设备工作。1.3 利用单片机控制 12864液晶屏显示。1.4 将指定的数据放入24C02中,达到断电不丢失的效果。1.5 用 Keil uVision3 编写 C程序,利用单片机最小系统烧写程序到单片机。1.6 利用传感器模块计算倾角(坡度),由12864液晶显示。精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 4 页,共 29 页 设计方案2.1 芯片的选择汽车

4、测速仪按系统功能实现要求, 决定控制系统采用STC89C52RC 单片机 , 采集信号的霍尔传感器采用A3144 ,保存信息的E2PROM 24C02,计算倾角的加速度倾角传感器MMA7455 ,用于显示的 12864液晶。2.2 霍尔传感器与单片机之间的通信将霍尔传感器的信号输出端和单片机的某一个I/O 口相连(本板子中使用P23),通过检测 P23电平的下降沿和上升沿来编写程序,以达到计数的功能。2.3 12864液晶屏与单片机将 12864 液晶屏按照其操作指南正确连接在电路中,编写程序,由单片机控制12864液晶显示各种数据。2.4 单片机与 24C02 程序编写中,要求保存功能的按键

5、按下时,总里程的数据写入到24C02芯片中,达到断电不丢失的功能。将24C02按照操作手册正确连接到电路中,由单片机控制,当检查到按键按下时,执行程序:经总里程数据写入24C02中,保存起来。2.5 单片机与 MMA7455 此模块是用集成工艺制作好的商品。按照操作手册正确连接到电路中,根据芯片资料和示例程序可以使其输出角度值,然后在12864中显示出来。2.6单片机下载程序利用单片机最小系统和串口(配合MAX232转电平芯片),借助STC下载器完成程序的改写。精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 5 页,共 29 页3 总体方案3.1

6、工作原理本实验主要是利用STC89C52RC、12864 液晶、 24C02E2PROM、霍尔传感器和加速度倾角传感器来实现汽车测速功能。通过霍尔传感器来采集信号,经过单片机处理后,由12864液晶显示其总里程,分里程,速度,加速度;信号经过加速度倾角传感器读出坡度值,并在12864液晶中显示出来;然后由数学公式计算出消耗的卡路里值。12864 显示页面一共有三面。按键具有调控展现的页面,清除分里程数据,保存总里程数据的功能,利用24C02实现断电不消失的功能。发光二极管模块,利用MOS 管的特性可以实现在暗处自动点亮3.2设计总体框图STC89C52RC A3144 24C02 MMA745

7、5 12864液晶精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 6 页,共 29 页4 系统硬件设计4.1 STC89C52RC单片机最小系统4.1.1最小系统包括晶体振荡电路、复位开关和电源部分。精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 7 页,共 29 页4.2各部分电路4.2.1 主要控制部分( STC89C52RC)4.2.2 12864液晶部分精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 8 页,共 29 页4.2.3 24C02部分电路

8、4.2.4 串口及 MAX232 部分精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 9 页,共 29 页4.2.5 倾角传感器 MMA7455 4.2.6 霍尔传感器部分4.2.7 发光二极管独立显示模块精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 10 页,共 29 页4.3整体电路精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 11 页,共 29 页5 系统软件设计主程序流程图精选学习资料 - - - - - - - - - 名师归纳总结 - - -

9、 - - - -第 12 页,共 29 页参考文献1 沈红卫基于单片机结构的智能系统设计与实现电子工业出版社2 黄惠媛单片机原理与接口技术海洋出版社3 周平伍云辉单片机应用技术电子科技大学出版社开始初始化检查霍尔传感器信号单片机处理信号发出指令操作液晶屏显示精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 13 页,共 29 页4 吴金戌 沈金阳 郭庭吉8051 单片机实践与应用清华大学出版社5 黄正谨等电子设计竞赛赛题解读东南大学出版社附 录程序:/*江西理工大学应用科学学院*/ /*周望君*/ 精选学习资料 - - - - - - - - - 名

10、师归纳总结 - - - - - - -第 14 页,共 29 页/*自行车测速仪程序 */ #include #include #define uchar unsigned char #define uint unsigned int /*液晶屏相关部分 */ #define lcd_port P0 /液晶屏指令、数据通信接口sbit rs=P27。 / 液晶屏寄存器选择接口( rs=0时选择指令寄存器, rs=1时选择数据寄存器)sbit rw=P26。/液晶屏读写选择接口(rw=0 时选择写入, rw=1 时选择读出)sbit en=P25。/液晶屏使能接口( en=0时通信接口中断, e

11、n=1时通信接口接通)sbit ret=P24。 /液晶屏主复位引脚/*子函数部分 */ void delayms_lcd(uint ms)。/延时子函数 ,时间为 1ms void delay_n10_us(uint n)。/10 微秒延时函数 (n*10us) void lcd_wr_command(uchar com)。/向液晶屏输入命令子函数void lcd_wr_data(uchar dat) 。/向液晶屏输入数据单字节子函数void lcd_int() 。/LCD 初始化void picture_show0()。 /12864画面 0 void picture_show1()。/1

12、2864画面 1 void picture_show2()。/12864画面 2 void picture_select()。/12864画面选择void key_select()。 /按键相关判断void interrupt_set()。 /中断函数参数设定void start_24C02()。/24C02起始信号void write_one_char(uchar x)。/写入一个字节void wait_ack()。/等待应答uchar read_one_char() 。 /读出一个字节void stop_24C02()。 /24C02终止信号void read_total_distance

13、() 。 /读出 24C02中数据并且赋值给total_distance void write_total_distance()。 /写入 24C02中 total_distance数据void write_total_distance1()。 /写入 24C02中 total_distance数据void forbid_data()。 /限制所有变量的取值/*24C02相关部分 */ sbit SCL=P15。/串口时钟引脚sbit SDA=P14。/串口数据引脚/*相关数组部分 */ uchar code data1=欢迎使用 。uchar code data2=自行车测速仪 。uchar

14、 code data3=制作人 。uchar code data4=周望君 。uchar code data5=赵向辉 。精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 15 页,共 29 页uchar code data6=总里程 。uchar code data7=分里程 。uchar code data8=速度。uchar code data9=加速度 。uchar code data10= 坡度。uchar code data11= 卡路里 。uchar code data12= 请注意安全 。uchar code data_show=01

15、23456789 。/*相关变量部分 */ uint new_total_distance=0,old_total_distance=0 。 /四位数据uint new_part_distance=0,old_part_distance=0 。 /三位数据uint old_speed=0,new_speed=0 。 /两位数据uint old_acceleration=0,new_acceleration=0 。 /两位数据uint old_ascent=0,new_ascent=0 。 /三位数据uint calorie=0。 /三位数据uchar old_j=0,new_j=0,part_

16、flag=0,write_flag=0,show_flag=0,control_flag=0。static uint time=0。/*按键相关 */ sbit key1=P10。 /页面上翻sbit key2=P11。 /手动保存sbit key3=P12。 /页面下翻sbit key4=P13。 /清除分里程数据/*霍尔传感器相关部分 */ sbit A3145_OUT=P23。/*/ void main() read_total_distance() 。lcd_int()。 /LCD 初始化picture_show0()。delayms_lcd(2000)。lcd_int()。pictu

17、re_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) 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 16 页,共 29 页new_total_distance=new_part_distance 。if(show_flag=1) if(old_j=1) picture_show1()。i

18、f(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()。 /*限制所有变量的取值 */ void forbid_data() if(old_total_distance

19、+new_total_distance)9999) new_total_distance=old_total_distance=0 。 if(new_part_distance999) new_part_distance=0 。write_total_distance()。read_total_distance() 。 if(new_speed99) new_speed=0 。if(new_acceleration99) new_acceleration=0 。if(calorie999) 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 17 页,

20、共 29 页calorie=0。 /*LCD显示画面 0*/ void picture_show0() uchar i。i=0。lcd_wr_command(0 x82)。/设置液晶屏的显示位置while(data1i!=0) lcd_wr_data(data1i)。i+。 i=0。lcd_wr_command(0 x91)。while(data2i!=0) lcd_wr_data(data2i)。i+。 i=0。lcd_wr_command(0 x8A)。while(data3i!=0) lcd_wr_data(data3i)。i+。 i=0。lcd_wr_command(0 x99)。wh

21、ile(data4i!=0) lcd_wr_data(data4i)。i+。 i=0。lcd_wr_command(0 x9C)。while(data5i!=0) lcd_wr_data(data5i)。i+。 /*LCD画面 1*/ void picture_show1() 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 18 页,共 29 页 uchar i,flag=0。uint temp。i=0。lcd_wr_command(0 x81)。/设置液晶屏的显示位置while(data6i!=0) lcd_wr_data(data6i)。i+。

22、 lcd_wr_command(0 x84)。temp=(new_total_distance+old_total_distance) 。if(temp/1000=0) lcd_wr_data( )。else lcd_wr_data(data_showtemp/1000)。/显示数据(字符)flag=1。 temp%=1000。if(temp/100)!=0|flag=1) lcd_wr_data(data_showtemp/100)。/显示数据(字符)flag=1。 else lcd_wr_data( )。temp%=100。if(temp/10)!=0|flag=1) lcd_wr_dat

23、a(data_showtemp/10)。 /显示数据(字符)flag=1。 else lcd_wr_data( )。temp%=10。lcd_wr_data(data_showtemp)。/显示数据(字符)lcd_wr_command(0 x86)。lcd_wr_data(m)。i=0。flag=0。lcd_wr_command(0 x91)。while(data7i!=0) 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 19 页,共 29 页lcd_wr_data(data7i)。i+。 lcd_wr_command(0 x94)。temp=n

24、ew_part_distance 。if(temp/100=0) lcd_wr_data( )。else lcd_wr_data(data_showtemp/100)。/显示数据(字符)flag=1。 temp%=100。if(temp/10)!=0|flag=1) lcd_wr_data(data_showtemp/10)。 /显示数据(字符)flag=1。 else lcd_wr_data( )。temp%=10。lcd_wr_data(data_showtemp)。/显示数据(字符)lcd_wr_command(0 x96)。lcd_wr_data(m)。i=0。flag=0。lcd_w

25、r_command(0 x89)。while(data8i!=0) lcd_wr_data(data8i)。i+。 lcd_wr_command(0 x8B)。temp=new_speed 。if(temp/10=0) lcd_wr_data( )。else lcd_wr_data(data_showtemp/10)。 /显示数据(字符)temp%=10。lcd_wr_data(data_showtemp)。/显示数据(字符)lcd_wr_command(0 x8C)。lcd_wr_data(m)。lcd_wr_data(/)。lcd_wr_data(s)。精选学习资料 - - - - - -

26、 - - - 名师归纳总结 - - - - - - -第 20 页,共 29 页i=0。old_speed=new_speed 。lcd_wr_command(0 x99)。while(data12i!=0) lcd_wr_data(data12i)。i+。 /*LCD画面 2*/ void picture_show2() uchar i,flag=0。uint temp。i=0。lcd_wr_command(0 x81)。while(data9i!=0) lcd_wr_data(data9i)。i+。 lcd_wr_command(0 x84)。temp=new_acceleration 。

27、if(temp/10=0) lcd_wr_data( )。else lcd_wr_data(data_showtemp/10)。 /显示数据(字符)temp%=10。lcd_wr_data(data_showtemp)。/显示数据(字符)lcd_wr_command(0 x85)。lcd_wr_data(m)。lcd_wr_data(/)。lcd_wr_data(s)。lcd_wr_data(2)。i=0。flag=0。lcd_wr_command(0 x91)。while(data10i!=0) lcd_wr_data(data10i)。i+。 lcd_wr_command(0 x93)。t

28、emp=new_ascent 。精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 21 页,共 29 页if(temp/100=0) lcd_wr_data( )。else lcd_wr_data(data_showtemp/100)。/显示数据(字符)flag=1。 temp%=100。if(temp/10)!=0|flag=1) lcd_wr_data(data_showtemp/10)。 /显示数据(字符)flag=1。 else lcd_wr_data( )。temp%=10。lcd_wr_data(data_showtemp)。/显示数据(

29、字符)lcd_wr_command(0 x95)。lcd_wr_data(0 x09)。i=0。flag=0。lcd_wr_command(0 x89)。while(data11i!=0) lcd_wr_data(data11i)。i+ 。 lcd_wr_command(0 x8C)。temp=calorie。if(temp/100=0) lcd_wr_data( )。else lcd_wr_data(data_showtemp/100)。flag=1。 temp%=100。if(temp/10)!=0|flag=1) lcd_wr_data(data_showtemp/10)。 /显示数据(

30、字符)flag=1。 else lcd_wr_data( )。精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 22 页,共 29 页temp%=10。lcd_wr_data(data_showtemp)。/显示数据(字符)lcd_wr_command(0 x8E)。lcd_wr_data(k)。i=0。flag=0。lcd_wr_command(0 x99)。while(data12i!=0) lcd_wr_data(data12i)。i+ 。 /*LCD初始化 */ void lcd_int() ret=0。/液晶屏复位delayms_lcd(2

31、)。ret=1。delayms_lcd(2)。lcd_wr_command(0 x30)。/启动液晶屏基本指令集并开启绘图显示功能lcd_wr_command(0 x0c)。/开显示 ,关光标 ,不闪烁lcd_wr_command(0 x06)。 /字符进入模式为 :字符不动 ,光标右移 ,地址加一lcd_wr_command(0 x01)。 /清屏delayms_lcd(2)。 /等待清屏完成 /*向液晶屏写入命令子函数 */ void lcd_wr_command(uchar com) en=0。/关闭通信,为设置参数做准备rs=0。/选择指令寄存器rw=0。/写入液晶en=1。/为开始通

32、信做准备lcd_port=com。delay_n10_us(8) 。/大于 72us的延时 (根据手册 ) en=0。/数据送如液晶屏并关闭通信(en的下降沿液晶屏接收数据 ) /*向液晶屏输入数据子函数*/ void lcd_wr_data(uchar dat) en=0。/关闭通信,为设置参数做准备rs=1。/选择数据寄存器rw=0。/写入液晶en=1。/为开始通信做准备精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 23 页,共 29 页lcd_port=dat。delay_n10_us(8) 。/大于 72us的延时 (根据手册 ) en=

33、0。/数据送如液晶屏并关闭通信(en的下降沿液晶屏接收数据 ) /*毫秒延时函数 ,延时 1ms*/ void delayms_lcd(uint ms) uchar i。while(ms-) for(i=0。i121。i+)。 /*10微秒延时函数 (n*10us)*/ void delay_n10_us(uint n) while(n-) _nop_()。_nop_()。 /*LCD显示画面选择 */ void picture_select() if(old_j=new_j) 。else switch(new_j) case 1 : lcd_int()。picture_show1()。old

34、_j=new_j。break。 case 2 : lcd_int()。picture_show2()。old_j=new_j。break。 /*按键相关判断 */ void key_select() 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 24 页,共 29 页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_t

35、otal_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)。 /*中断函数参数设定 */ void interrupt_set() 精选学习资料 - - - - - - - -

36、 - 名师归纳总结 - - - - - - -第 25 页,共 29 页TMOD=0 x11。/0001 0001 T1、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中断函数 */ void timer1() interrupt 3 using 1 ET1=0。/关闭

37、T1 中断允许位TH1=(65536-10000)/256。/重设 T1 定时时间为 10毫秒( 10000微秒)TL1=(65536-10000)%256。if(A3145_OUT=0) part_flag=1。 ET1=1。/开启 T1 中断允许位 /*T0中断函数 */ void timer2() interrupt 1 using 2 TH0=(65536-20000)/256。TL0=(65536-20000)%256。time+。 /*写入 24C02中数据 */ void write_total_distance() start_24C02()。write_one_char(0

38、xa0) 。wait_ack()。write_one_char(0 x01)。wait_ack()。write_one_char(old_total_distance/256) 。wait_ack()。stop_24C02()。delayms_lcd(100)。start_24C02()。write_one_char(0 xa0) 。精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 26 页,共 29 页wait_ack()。write_one_char(0 x02)。wait_ack()。write_one_char(old_total_dista

39、nce%256) 。wait_ack()。stop_24C02()。delayms_lcd(100)。 /*读出 24C02中 total_distance数据*/ void read_total_distance() start_24C02()。write_one_char(0 xa0) 。wait_ack()。write_one_char(0 x01)。wait_ack()。start_24C02()。write_one_char(0 xa1) 。wait_ack()。old_total_distance=read_one_char()*256 。stop_24C02()。delayms_

40、lcd(100)。start_24C02()。write_one_char(0 xa0) 。wait_ack()。write_one_char(0 x02)。wait_ack()。start_24C02()。write_one_char(0 xa1) 。wait_ack()。old_total_distance+=read_one_char() 。stop_24C02()。delayms_lcd(100)。 /*24C02启动程序 */ void start_24C02() SCL=0。_nop_()。SDA=1。_nop_()。SCL=1。_nop_()。精选学习资料 - - - - - -

41、 - - - 名师归纳总结 - - - - - - -第 27 页,共 29 页SDA=0。_nop_()。SCL=0。 /*24C02写入一个字节 */ void write_one_char(uchar x)/写入一个字节 uchar i。for(i=0。i8。i+) x=1。SCL=0。_nop_()。SDA=CY 。_nop_()。SCL=1。_nop_()。 SCL=0。_nop_()。 /*24C02等待应答 */ void wait_ack() SCL=0。_nop_()。SDA=1。/释放数据线_nop_()。SCL=1。_nop_()。while(SDA=1) 。SCL=0。

42、_nop_()。 /*24C02读出一个字节 */ uchar read_one_char()/ 读出一个字节 uchar i,temp=0。SCL=0。_nop_()。SDA=1。/释放数据线_nop_()。for(i=0。i8。i+) 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 28 页,共 29 页SCL=1。_nop_()。temp=1。temp=temp|SDA。SCL=0。_nop_()。 return(temp)。 /*24C02终止程序 */ void stop_24C02() SCL=0。_nop_()。SDA=0。_nop_()。SCL=1。_nop_()。SDA=1。_nop_()。SCL=0。/当总线多个器件时必须SCL=1; 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 29 页,共 29 页

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 技术资料 > 技术总结

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁