基于单片机自行车测速系统设设计报告.docx

上传人:b****5 文档编号:29084942 上传时间:2023-07-20 格式:DOCX 页数:16 大小:177.85KB
下载 相关 举报
基于单片机自行车测速系统设设计报告.docx_第1页
第1页 / 共16页
基于单片机自行车测速系统设设计报告.docx_第2页
第2页 / 共16页
基于单片机自行车测速系统设设计报告.docx_第3页
第3页 / 共16页
基于单片机自行车测速系统设设计报告.docx_第4页
第4页 / 共16页
基于单片机自行车测速系统设设计报告.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

基于单片机自行车测速系统设设计报告.docx

《基于单片机自行车测速系统设设计报告.docx》由会员分享,可在线阅读,更多相关《基于单片机自行车测速系统设设计报告.docx(16页珍藏版)》请在冰豆网上搜索。

基于单片机自行车测速系统设设计报告.docx

基于单片机自行车测速系统设设计报告

单片机原理及系统课程设计

评语:

 

考勤10分

守纪10分

过程30分

设计报告30分

辩论20分

总成绩〔100分〕

 

基于单片机自行车测速系统设计

1设计目的

实现自行车运行过程中对行驶里程、平均速度、运行时间、当前瞬时速度进展测量和显示,通过对速度的测量来控制自行车的运行,当速度超过限定值时发出报警提醒减速,以确保自行车平安的运行。

2设计方案及原理

2.1系统总体设计思路和原理

本系统实现自行车运行过程中对行驶里程、平均速度、运行时间、当前瞬时速度进展测量和显示,系统包括控制器模块、信号检测采集模块、显示模块、电源模块四局部组成。

系统工作时,传感器采集到信号〔用按键代表脉冲信号输入〕传输给单片机,单片机计数器统计脉冲个数,定时器记录相应时间长度,经过运算,将行驶里程、全程平均速度、运行总时间送给液晶显示器显示,当前〔瞬时〕速度送给数码管显示。

通过以下计算公式算出里程、平均速度、瞬时速度。

通过相应的显示机构显示出来。

里程=脉冲总数×车轮周长

平均速度=里程÷运行总时间

瞬时速度=每五秒的行程÷5

2.2自行车测速系统方案设计

系统包括控制器模块、信号检测采集模块、显示模块、电源模块四局部,控制器模块由AT89C51组成,它运用于数据储存和外部设备管理,信号采集模块用的是模拟霍尔传感器,通过外部脉冲来控制圈数,显示模块用1602和数码管,1602显示里程、全程平均速度以及运行时间,数码管LED显示五秒的平均速度即当前瞬时速度,电源模块给整个系统提供电压,使系统可以正常工作。

系统框图如图1所示。

图1自行车测速系统设计原理图

3硬件设计

3.1系统原理电路图

系统中里程、速度等都是由霍尔元器件测量。

通过按钮输出脉冲,脉冲数目代表车轮转动圈数,自行车轮胎的周长为2.15m,输入一个脉冲,轮子转动一圈,里程为一个周长的距离,通过脉冲数可以算出总里程,通过单片机T0定时器和T1计数器记录时间,用5秒的前进距离除以时间5秒,得到5秒的平均速度即当前速度。

而总里程L除以总时间t得到平均速度。

在车轮辐条上的磁钢接近霍尔传感器一次,传感器送一个脉冲信号给单片机的外部中断计数器T1,产生一次中断,圈数加一,圈数乘以2.15即为车前进距离。

处理速度数据时同时刷新平均速度、当前速度、运行里程。

假设速度大于〔25km/h即6.95m/s〕那么P3.7输出高电平,蜂鸣器发出报警,提示速度过大。

单片机定时器0定时时间为50ms,每20次刷新系统时钟及计算累计行驶时间。

系统原理电路图如图2所示。

图2系统原理电路图

3.2霍尔传感器开关模块设计

使用开关代替霍尔传感器,通过连续按压开关,使开关对单片机连续输入脉冲来模拟辐条经过的次数,单位时间按压次数越多,相当于辐条经过传感器的频率越高,从而反映车速越快,电路原理如图3所示。

图3霍尔传感器模拟原理图

4软件设计

4.1程序流程图

图4系统流程图

5系统仿真

5.1仿真结果

按压模拟霍尔传感器的开关,模拟出辐条发生频率,通过脉冲数和时间计算出当前速度,当前模拟速度小于给定限定值6.95m/s即25km/h时,没有发生超速现象,通过单片机处理后给出报警指示低电平,蜂鸣器不响,故而速度没有超过限定值,可以正常行驶。

数码管显示屏显示自行车每五秒的平均速度,即当前的瞬时速度,而液晶显示器分别显示自行车行驶的总里程,全程的平均速度,以及当前运行的总时间,仿真结果如图5所示。

图5未超速系统仿真结果图

按压模拟霍尔传感器的开关,模拟出辐条发生频率,通过程序计算出当前速度,当模拟速度大于给定限定值6.95m/s即25km/h时,说明自行车发生了超速现象,通过单片机处理后给出报警指示高电平,故而报警蜂鸣器响,说明速度超出了限定值,提醒车主应减速行驶,同时数码管显示屏显示自行车每五秒的平均速度即当前的瞬时速度,而液晶显示器同时分别显示出自行车行驶的总里程,全程的平均速度,以及当前运行的总时间,仿真结果如图6所示。

图6超速系统仿真结果

6总结

这次课程设计的题目是设计一个以AT89C51单片机为核心的自行车速度里程表。

本设计主要分为硬件局部和软件局部。

在硬件电路的设计局部,主要考虑硬件电路的简单性,故使用开关代替霍尔传感器,通过连续按压开关,使开关对单片机连续输入脉冲来模拟辐条经过的次数,从而计算运行里程。

在软件局部采用用C语言编写,采用模块化设计思想,程序可读性强。

在这次课程设计中,我也遇到了许多问题。

在设计过程中,我发现自己平时对单片机知识的学习还不够深入,不能把所学的理论知识与实践相结合起来,因此在以后的学习中,我要争取做到理论与实践相结合,做到学以致用。

同时,我也学到了许多东西,我了解到要做好一个课程设计,就必须做到:

在设计程序之前,对所用单片机的部构造有一个系统的了解,知道该单片机有哪些资源;要有一个清晰的思路和一个完整的的软件流程图;要养成注释程序的好习惯,一个程序的完美与否不仅仅是实现功能,而应该让人一看就能明白你的思路。

这次课程设计让我懂得了学习的重要性,了解到理论知识与实践相结合的重要意义。

7参考文献

[1]阎焕忠,王长涛,马斌.单片机控制里程转速表的设计[M].建筑工程学院学报〔自然科学版〕,2002,4:

145-148.

[2]友德,志英,涂时亮.单片机微机原理,应用与实验[M].:

复旦大学,2003:

122-136.

[3]王思明,鑫,苟军年,单片机原理及应用系统设计[M].科学,2021:

6-8.

 

8附录

#include

#include//包含_nop_();函数定义的头文件

voidtimer0_int();

sbitbaojing=P3^7;

sbitE=P3^2;//1602使能引脚(位寻址,下同)

sbitRW=P3^1;//1602读写引脚

sbitRS=P3^0;//1602数据/命令选择引脚

unsignedcharhour,minute,second;

unsignedcharn,count;

unsignedlonglengthbuf,lengthvalue;

unsignedcharcode

Table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//0~9的共阴极七段管代码

unsignedcharcode

Table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};//0~9的共阴极七段管代码,带小数点

voidDelay0(intTimes);

voidDisplay(unsinedint);

voiddelay()//延时5US

{

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

}

bitBusy(void)//读状态函数,判断液晶模块的忙碌状态

{

bitbusy_flag=0;

RS=0;

RW=1;

E=1;

delay();

busy_flag=(bit)(P0&0x80);

E=0;

returnbusy_flag;

}

voidwcmd(unsignedchardel)//将模式设置指令或显示地址写入液晶模块

{

while(Busy());

RS=0;

RW=0;

E=0;

delay();

P0=del;

delay();

E=1;

delay();

E=0;

}

voidwdata(unsignedchardel)//将数据〔字符ASCII码〕写入液晶模块

{

while(Busy());

RS=1;

RW=0;

E=0;

delay();

P0=del;

delay();

E=1;

delay();

E=0;

}

voidL1602_init(void)//初始化液晶模块

{

wcmd(0x38);//功能设置,8位字长,2行,5*7点阵

wcmd(0x0c);//显示设置,显示屏右移

wcmd(0x06);//显示设置,光标右移,字符不移

wcmd(0x01);//清屏命令

}

voidL1602_string(unsignedcharhang,unsignedcharlie,unsignedcharp)//将数据写入液晶模块

{

unsignedchara;

if(hang==1)a=0x80;//显示在第一行

if(hang==2)a=0xc0;//显示在第一行

a=a+lie-1;

wcmd(a);

wdata(p);

}

voidtimer0_int()interrupt1using3//中断,用于构成时钟

{

n++;

if(n==100)

{

n=0;

count++;

second++;

if(second>=60)

{

second=0;

minute++;

if(minute>=60)

{

minute=0;

hour++;

if(hour>=24)hour=0;

}

}

}

if(count==5)

{

count=0;

lengthvalue=(TL1+TH1*256)*215-lengthbuf;

lengthbuf=(TL1+TH1*256)*215;

}

TH0=0xd8;

TL0=0xf0;

}

inttimer()//以秒为单位计算运行总时间

{

unsignedchara=100;

unsignedcharb;

b=second+minute*60+hour*60*60;

returnb;

}

voidDelay0(intTime)//延时子程序

{

inti;

unsignedcharj;

for(i=0;i

{

for(j=0;j<150;j++)

{

}

}

}

voidDisplay(unsignedintx)//在LED七段管中显示最高速度

{

unsignedcharslc;

unsignedchara,b,c,d;

slc=0xef;//LED七段管选通

a=x/1000;

b=(x-a*1000)/100;

c=(x-a*1000-b*100)/10;

d=x%10;

{

P2=slc;//分别将最大速度的各个位扫描显示

slc=slc<<1;

P1=Table[a];

Delay0(10);

P2=slc;

slc=slc<<1;

P1=Table1[b];

Delay0(10);

P2=slc;

slc=slc<<1;

P1=Table[c];

Delay0(10);

P2=slc;

slc=slc<<1;

P1=Table[d];

Delay0(10);

}

return;

}

voidmain()

{

unsignedchari=0;

unsignedintv=0;//运行速度

unsignedintvnow;//当前速度

unsignedinta,b,c,d;//分别显示速度的十位,个位,十分位,百分位

unsignedlongquanshu;//定义车轮转动圈数

unsignedlonglength,length1,length2,length3,length4,length5,length6;

//定义运行长度以及长度的各个进位

unsignedintsecond1,second2,minute1,minute2,hour1,hour2;

L1602_init();

TMOD=0x51;//定时器T0,计数器T1,允许外部中断,T1工作方式1,T0工作方式1

TH1=0x00;//计数器T1高位装初值

TL1=0x00;//计数器T1低位装初值

ET1=1;//计数器0开中断

TR1=1;//计数器0开场工作

TH0=0XD8;//T0设置时间常数

TL0=0XF0;

ET0=1;

EA=1;

TR0=1;

IT1=1;//外部中断1请求触发方式

EX1=1;

P1=0X00;//P1、P2口装初值,用于LED七段管显示用

P2=0xff;

while

(1)

{

quanshu=TL1+TH1*256;//计算车轮旋转圈数

length=quanshu*215;//骑行距离

//计算里程各个进位

length1=length/100000;

length2=(length-length1*100000)/10000;

length3=(length-length1*100000-length2*10000)/1000;

length4=(length-length1*100000-length2*10000-length3*1000)/100;

length5=(length-length1*100000-length2*10000-length3*1000-length4*100)/10;

length6=length%10;

if(timer()>0)

v=length/timer();//计算速度

vnow=lengthvalue/5;//计算当前速度〔5秒〕

if(vnow>=695)baojing=1;

elsebaojing=0;//速度超过6.95m/s(即25km/h),那么报警

Display(vnow);//在LED七段管上显示当前速度〔5秒〕速度

Delay0(20);

a=(v/1000);//计算速度的各个进位

b=(v-a*1000)/100;

c=(v-a*1000-b*100)/10;

d=v%10;

second1=second/10;//计算分秒时的十位与个位

second2=second%10;

minute1=minute/10;

minute2=minute%10;

hour1=hour/10;

hour2=hour%10;

L1602_string(1,1,'s');//在LCD相应位置显示变量或者常量

L1602_string(1,2,'p');

L1602_string(1,3,'e');

L1602_string(1,4,'e');

L1602_string(1,5,'d');

L1602_string(1,6,'');

L1602_string(1,7,'L');

L1602_string(1,8,'=');

L1602_string(1,9,length1+48);

L1602_string(1,10,length2+48);

L1602_string(1,11,length3+48);

L1602_string(1,12,length4+48);

L1602_string(1,13,'.');

L1602_string(1,14,length5+48);

L1602_string(1,15,length6+48);

L1602_string(1,16,'m');

L1602_string(2,1,a+48);

L1602_string(2,2,b+48);

L1602_string(2,3,'.');

L1602_string(2,4,c+48);

L1602_string(2,5,d+48);

L1602_string(2,6,'m');

L1602_string(2,7,'/');

L1602_string(2,8,'s');

L1602_string(2,9,hour1+48);

L1602_string(2,10,hour2+48);

L1602_string(2,11,':

');

L1602_string(2,12,minute1+48);

L1602_string(2,13,minute2+48);

L1602_string(2,14,':

');

L1602_string(2,15,second1+48);

L1602_string(2,16,second2+48);

while(i<2)//LCD显示延迟

{delay();

i++;}

i=0;

}

}

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 职业教育 > 职业技术培训

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1