自行车测速仪设计报告Word文档格式.docx
《自行车测速仪设计报告Word文档格式.docx》由会员分享,可在线阅读,更多相关《自行车测速仪设计报告Word文档格式.docx(37页珍藏版)》请在冰豆网上搜索。
Bicylespeedometer;
Hallsensors;
Angleaccelerationsensor;
目 录
1 设计要求 ................................
2 设计方案 ................................
2.1 芯片的选择 ...............................
2.2 霍尔传感器与单片机的通信 ..............
2.3 12864液晶屏与单片机 ..................
2.4 单片机与24C02 ........................
2.5 单片机与MMA7455 ......................
2.6 单片机下载程序 ........................
3 总体方案 ................................
3.1 工作原理 .............................
3.2 总体设计 .............................
4 系统硬件设计 ............................
4.1 STC89C52RC单片机最小系统 .............
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、霍尔传感器和加速度倾角传感器来实现自行车测速功能。
3.2 设计总体框图
4系统硬件设计
4.1STC89C52RC单片机最小系统
4.1.1 最小系统包括晶体振荡电路、复位开关和电源部分。
4.2各部分电路
4.2.1主要控制部分(STC89C52RC)
4.2.212864液晶部分
4.2.324C02部分电路
4.2.4串口及MAX232部分
4.2.5倾角传感器MMA7455
4.2.6霍尔传感器部分
4.2.7发光二极管独立显示模块
4.3整体电路
5系统软件设计
主程序流程图
参考文献
[1]沈红卫《基于单片机结构的智能系统设计与实现》电子工业出版社
[2]黄惠媛《单片机原理与接口技术》海洋出版社
[3]周平伍云辉《单片机应用技术》电子科技大学出版社
[4]吴金戌沈金阳郭庭吉《8051单片机实践与应用》清华大学出版社
[5]黄正谨等《电子设计竞赛赛题解析》东南大学出版社
附录
程序:
/*************河北大学电信学院***********/
/*******************李炜*****************/
/***********自行车测速仪程序**************/
#include<
reg52.h>
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);
//延时子函数,时间为1ms
voiddelay_n10_us(uintn);
//10微秒延时函数(n*10us)
voidlcd_wr_command(ucharcom);
//向液晶屏输入命令子函数
voidlcd_wr_data(uchardat);
//向液晶屏输入数据单字节子函数
voidlcd_int();
//LCD初始化
voidpicture_show0();
//12864画面0
voidpicture_show1();
//12864画面1
voidpicture_show2();
//12864画面2
voidpicture_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_distance
voidwrite_total_distance();
//写入24C02中total_distance数据
voidwrite_total_distance1();
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();
picture_show0();
delayms_lcd(2000);
picture_show1();
picture_show2();
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>
new_acceleration=0;
if(calorie>
calorie=0;
/***********LCD显示画面0********************/
voidpicture_show0()
{
uchari;
i=0;
lcd_wr_command(0x82);
//设置液晶屏的显示位置
while(data1[i]!
=0)
lcd_wr_data(data1[i]);
i++;
lcd_wr_command(0x91);
while(data2[i]!
lcd_wr_data(data2[i]);
lcd_wr_command(0x8A);
while(data3[i]!
lcd_wr_data(data3[i]);
lcd_wr_command(0x99);
while(data4[i]!
lcd_wr_data(data4[i]);
lcd_wr_command(0x9C);
while(data5[i]!
lcd_wr_data(data5[i]);
/**************LCD画面1********************/
voidpicture_show1()
uchari,flag=0;
uinttemp;
i=0;
lcd_wr_command(0x81);
while(data6[i]!
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]);
else
temp%=100;
if((temp/10)!
lcd_wr_data(data_show[temp/10]);
temp%=10;
lcd_wr_data(data_show[temp]);
lcd_wr_command(0x86);
lcd_wr_data('
m'
flag=0;
lcd_wr_command(0x91);
while(data7[i]!
lcd_wr_data(data7[i]);
lcd_wr_command(0x94);
temp=new_part_distance;
if(temp/100==0)
lcd_wr_command(0x96);
lcd_wr_command(0x89);
while(data8[i]!
lcd_wr_data(data8[i]);
lcd_wr_command(0x8B);
temp=new_speed;
if(temp/10==0)
temp%=10;
lcd_wr_command(0x8C);
/'
s'
old_speed=new_speed;
lcd_wr_command(0x99);
while(data12[i]!
lcd_wr_data(data12[i]);
/**************LCD画面2********************/
voidpicture_show2()
i=0;
lcd_wr_command(0x81);
while(data9[i]!
lcd_wr_data(data9[i]);
temp=new_acceleration;
lcd_wr_data(data_show[temp/10]);
lcd_wr_da