#基于单片机的电动车里程表设计Word下载.docx
- 文档编号:18248003
- 上传时间:2022-12-14
- 格式:DOCX
- 页数:11
- 大小:72.15KB
#基于单片机的电动车里程表设计Word下载.docx
《#基于单片机的电动车里程表设计Word下载.docx》由会员分享,可在线阅读,更多相关《#基于单片机的电动车里程表设计Word下载.docx(11页珍藏版)》请在冰豆网上搜索。
一、设计任务及要求
以AT89C51单片机为核心,采用霍尔传感器,实现对自行车行驶里程、速度的测量,并能选择显示自行车行驶里程值和当前速度。
可以实现对自行车车轮大小的设置等。
自行车超过一定限速时可以进行声光报警提示。
关键词:
AT89C51单片机;
光电传感器;
液晶显示器;
存储器
二、电路原理
T0用于对轮子圈数的计数输入,轮子每转一个间隔(即假设的每个间隔0.1米),霍尔传感器输出一个低电平脉冲。
T0就计数一次,如果计够1000次(即0.1Km)就送液晶显示屏;
T1设置为独立的计数器,当T1定时1秒到来时进入中段程序,中断程序中关闭计数器T0,读出它记脉冲的个数n,用n乘以0.1即此时车的速度(以为是每一秒读一次),将此时的速度送至液晶并显示出当前的速度值,电路如图1所示。
P0口用于液晶的描输出。
P2.0口和P2.1口用于控制液晶的写命令和写数据操作,P2.2和P2.3口分别用于显示当前车行驶速度是否超过设定值(当绿灯亮时表示车速正常,当绿灯灭,红灯一闪一闪时表示车速超过设定值),P3.4(即T0)口用于接收由基尔霍夫传感器经信号处理电路处理后的脉冲个数。
根据它每秒所计脉冲个数计算车当前速度和车行驶的里程。
三、硬件系统设计
以AT89C51单片机为核心,A44E霍尔传感器测转数,实现对自行车里程、速度的测量统计,并将自行车的里程数及速度用液晶显示屏实时显示。
利用霍尔元件将自行车每转一圈的脉冲数传入单片机系统,然后单片机系统将信号经过处理进行编程。
1、芯片的选择
AT89C51是一个低电压,高性能CMOS8位单片机,片内含4kbytes的可反复擦写的Flash只读程序存储器和256bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器和Flash存储单元,功能强大的AT89C51单片机可为您提供许多较复杂系统控制使用场合。
AT89C51有40个引脚,32个外部双向输入/输出(I/O)端口,同时内含2个外中断口,2个16位可编程定时计数器,1个全双工串行通信口,2个读写口线,AT89C51可以按照常规方法进行编程,但不可以在线编程(S系列的才支持在线编程)。
其将通用的微处理器和Flash存储器结合在一起,特别是可反复擦写的Flash存储器可有效地降低开发成本。
AT89C51有PDIP、PQFP/TQFP及PLCC等三种封装形式,以适应不同产品的需求。
功能特性
AT89C51提供以下标准功能:
8字节FLASH闪速存储器,256字竹内部RAM,32个I/O口线,2个16位定时/计数器,一个6向量两级中断结构,一个全双工串行通信口,片内振荡器及时钟电路。
同时,AT89c51可降至OHz的静态逻辑操作,并支持两种软件可选的节电上作模式。
空闲方式停止CPU的工作,但允许RAM,定时/计数器。
串行通信口及中断系统继续工作。
掉电方式保存RAM中的内容,但振荡器停止工作并禁止其它所有部件工作直到下一个硬件复位。
2、结构框图
结构框图
指示灯部分功能:
显示车速是否正常或超过设定值。
里程、速度测量电路部分功能:
速度及里程传感器采用霍尔传元件,实现对自行车里程及速度的计算。
显示部分功能:
速度、里程用液晶显示屏动态扫描显示,由P0口送出段码和位选信号。
四、软件系统设计
1、初始化程序:
在本系统初始化程序中,主要完成以下工作:
初始化液晶(即写1604的驱动程序);
将T0设置为计数器;
将T1设置为定时器。
开T0,T1。
2、主程序:
主程序根据1秒钟T0所计的脉冲个数计算出车当前的速度和里程。
3、里程计数程序(T0计数程序):
T0计数器用于对输入的圈脉冲进行计数,为十六进制计数器。
60H为低位,62H为高位。
每秒钟读取它所计脉冲的个数,当它所计脉冲个数累计到1000次时,让液晶显示一次里程。
4、T1定时服务程序:
T1定时为1秒进一次中断程序,中断程序中执行关计数器T0,读T0每秒中所计脉冲的个数,根据个数算出速度,并累加里程
5、显示子程序:
当显示里程时,先要对里程累计的数据进行判断,当计够1000次时总里程加1(km)。
当要显示速率时,每秒显示一次,即每秒读一次T0所计的脉冲个数,根据此个数乘以车轮每2个小孔的最小间距0.1米,即得车当前的速度
五、控制系统源程序:
#include<
reg52.h>
#defineucharunsignedchar
#defineuintunsignedint
ucharcodecs[]="
SPEED:
00.0m/s"
;
ucharcodelc[]="
TOTAL:
00000.0Km"
ucharcodets[]="
PleasantJourney"
sbitRS=P2^0;
sbitE=P2^1;
sbitD=P1^0;
sbitLD=P2^2;
sbitHD=P2^3;
ucharnum,count,timecount,T0count,miao,fen,shi;
uinttotal,num1,num2,Gtotal,Ztotal,Dtotal=0,speed;
voiddelay(uintz)
{
uintx,y;
for(x=z;
x>
0;
x--)
for(y=110;
y>
y--);
}
voidwrite_com(uchar_com)
RS=0;
P0=_com;
delay
(1);
E=1;
delay
(2);
E=0;
voidwrite_data(uchar_data)
RS=1;
P0=_data;
voidinit_LCD()//16*4液晶
{
write_com(0x38);
//设置显示模式
write_com(0x0c);
//开显示,不显示光标,不闪烁
write_com(0x06);
//光标自动加1,整屏不移动
write_com(0x01);
//清屏
write_com(0x80);
//设置数据指针
for(num=0;
num<
16;
num++)
{
write_data(cs[num]);
}
write_com(0x80+0x40);
write_data(lc[num]);
write_com(0x80+0x10);
write_data(ts[num]);
}
voiddisplay_speed(ucharadd,uchardat)//显示速度函数
write_com(0x80+add);
write_data(0x30+dat);
voidwrite_speed(uintdate)//写速度函数
ucharbai,shi,ge;
bai=date/100;
shi=(date%100)/10;
ge=date%10;
display_speed(0x08,bai);
display_speed(0x09,shi);
display_speed(0x0b,ge);
voiddisplay_Gtotal(ucharadd1,ucharadd2,ucharadd3,uchar_data1)//显示里程(高3位)函数
ucharGbai,Gshi,Gge;
Gbai=_data1/100;
Gshi=(_data1%100)/10;
Gge=_data1%10;
write_com(0x80+0x40+add1);
write_data(0x30+Gbai);
write_com(0x80+0x40+add2);
write_data(0x30+Gshi);
write_com(0x80+0x40+add3);
write_data(0x30+Gge);
voiddisplay_Dtotal(ucharadd1,ucharadd2,ucharadd3,uchar_data2)//显示里程(低3位)函数
ucharDbai,Dshi,Dge;
Dbai=_data2/100;
Dshi=(_data2%100)/10;
Dge=_data2%10;
write_data(0x30+Dbai);
write_data(0x30+Dshi);
write_data(0x30+Dge);
voidjudge_total(uintdate1)//判断里程函数
if(date1>
=1000)//1000格即100米
{
Ztotal++;
if(Ztotal==999)
{
Ztotal=0;
Gtotal++;
if(Gtotal==999)
{
Gtotal=0;
}
display_Gtotal(0x07,0x08,0x09,Gtotal);
}
display_Dtotal(0x0a,0x0b,0x0d,Ztotal);
}
voidinit_timer()
TMOD=0x15;
//(00010101)设置T1为16位定时器,T0为16位计数器
TH0=0;
TL0=0;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
EA=1;
ET0=1;
ET1=1;
TR0=1;
TR1=1;
voidmain()
init_LCD();
init_timer();
while
(1)
voidcount0()interrupt1
T0count++;
voidtimer1()interrupt3
timecount++;
num2=T0count*65536+TH0*256+TL0;
if(timecount==20)
TR0=0;
num1=T0count*65536+TH0*256+TL0;
speed=num1;
//假设车轮周长为1米,均匀开11个孔,则每个孔0.1米
if(speed>
130)
HD=0;
delay(30);
HD=1;
else
LD=0;
}
Dtotal=Dtotal+speed;
write_speed(speed);
if(Dtotal>
=1000)
judge_total(Dtotal);
Dtotal=0;
timecount=0;
TH0=0;
TL0=0;
TR0=1;
TR1=1;
}
五、仿真结果
参考文献
1.单片机使用原理
2.数字电路
3.摸拟电路
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 单片机 电动车 里程表 设计