当前位置:文档之家› #51单片机自行车测速(含实时时间,温度显示,断电保存等)

#51单片机自行车测速(含实时时间,温度显示,断电保存等)

单片机课程设计报告

自行车测速仪

学 院 信息工程学院

专 业 信息工程

(电子信息工程方向)

年级班别 2010级(4)班

学 号 3110002980

学生姓名 XXX

指导教师 XXX

申请成绩 XXX

2012年 12 月

1、设计要求:

自行车测速仪(传感器必须自己做)(每班最多8人选此题,难度系数:中;此题除非所有硬件自己做,并用于实际自行车上,否则不能得优或良)

基本功能:能实时显示自行车的行驶速度

附加功能:实时时钟,行驶里程累计

2.设计思路:

首先是选择基于51单片机来设计这个产品,这个产品主要的功能是用来测量自行车的车速,既然要测车速,那就要用到传感器,所以选择了红外光电传感器,它的检测头里也装有一个发光器和一个收光器,但前方没有反光板。正常情况下发光器发出的光收光器是找不到的。当检测物通过时挡住了光,并把光部分反射回来,收光器就收到光信号,输出一个开关信号。在没有遮挡物时,传感器输出端输出一个高电平,当有遮挡物时,输出端就会输出低电平,那样就可以利用单片机的计数功能,把传感器输出的信号输入到单片机的外部脉冲输入端,可以通过测试脉冲数来算出车速,具体实现是利用单片机的计数功能实现下降沿计数,然后在两秒内统计出自行车走过的圈数,算出自行车车轮的周长,再乘以圈数,再除以时间两秒,就得到车速,然后在lcd上面显示,还可以算出自行车的路程,也利用单片机的定时中断功能可以设置和显示实时时间,还可以利用单片机上自带的温度传感器ds18b20测出实时温度,在lcd上显示出来。

3.任务分工:XXX(100%)

4.设计步骤:

1.先完成lcd的显示代码,使单片机上的lcd能正常显示数字,字符。

2,利用单片机的定时计数功能,首先在lcd上显示实时时间能每秒加一。 主要特点或功能

1. 可以测试自行车的车速

2. 可以显示和修改实时时间

3. 可以显示实时温度

4. 记录自行车所走过的路程

5. 断电保存路程变量显示 答辩记录

开始时间:

结束时间

考题:

答辩结果:

3.通过对按键的扫描检测,实现对实时时间的设置。例如按下按键,使能设置时间(断开计时中断),再分别设置三个按键分别实现对小时,分钟,秒的设置(按下一次加一)

4.通过单片机的计数功能,即外部脉冲信号输入到引脚P3.5(T1),电平从1到0跳变,则计数器加一。把红外光电传感器的信号输出端接到引脚P3.5,自行车车轮的周长,再乘以圈数,再除以时间两秒,就得到车速,然后在lcd上面显示。

5.车轮的周长乘以圈数(每次累加起来),就可以得到自行车走过的路程,并在lcd上显示出来。

6.利用单片机上的温度传感器ds18b20,把得到的温度数据转化并显示在lcd上。

5,.程序流程(含流程图及详细步骤解释)

流程图详细步骤解释:

1.程序开始运行,初始化。

2.判断key6=0,即键6是否被按下,按下则对路程清零,否则显示累计的路程值。

3. 利用单片机上的温度传感器ds18b20,不断得到实时温度值。

4.把TMOD=01010001,即把T1作为计数器,把T0作为定时器,利用定时功能实现实时时间的显示,即实现每秒加一,利用T1的计数功能,记录由传感器输出的脉冲数,然后可以换算成速度,还可以算出走过的路程。

5.判断key1是否为0,即key1是否被按下,若按下,则令ET0=0(停止定时中断),便于设置时间。 初始化 开始

得到速度值 路程清零 得到温度

液晶显示 key1=0 Key2=0 key3=0 Key4=0 Key5=0 Key6=0

ET=0 h+1 m+1 s+1 ET=1 4 2 3 5 6 7 8 9 1

y n

y n y n n n n y y y

6.判断key2是否被按下,若按下则令小时h加一。

7.判断key3是否被按下,若按下则令分钟m加一。

8.判断key4是否被按下,若按下则令秒s加一。

9.判断key5是否被按下,若按下则令ET0=1,TR0=1允许并启动定时中断。

6.操作步骤及方法:

1.电源开关,把线接好后先下载程序,再按电源开关,实现冷启动。

2.1602液晶显示模块。分别显示速度,路程,时间,温度。

3.这些是独立按键,通过这些按键可以实现设置实时时间。(第一行对应为key1,key2,key3,key4,第二行第三个对应key5,第四个为key6),key1按下,则令ET0=0(停止定时中断),便于设置时间。Key2按下则令小时h加一,key3按下则令分钟m加一,key4按下则令秒s加一,key5按下则令ET0=1,TR0=1允许并启动定时中断.。

4.红外光电传感器模块,有三个引脚,分别是接地,接电源,输出信号端接P3^5,分别用杜邦线连接。

5.温度传感器ds18b20,对传感器的输出数据进行处理,然后在lcd上显示温度值

7.设计过程遇到的问题,原因及解决方法:

日期时间 问题和难点描述 问题原因及解决方法

2012/12/17 9:00 选择用51单片机,但是没51单片机 去问同学借了一块

2012/12/18 10:00 对51单片机还不熟悉 通过去图书馆找书,还有看原理图,结合实例,熟悉51的每个模块

2012/12/19 8:30 按键检测时,按键抖动 查看资料,用延时来实现按键消抖

2012/12/20 10:00 对传感器不太熟悉 上网查看大量资料,并挑选出适合的红外光电传感器

2012/12/22 14:00 对51自带的温度传感器不熟悉 上网查看资料,实现温度结果的获取,并在lcd上显示

2012/12/24 9:00 各个模块结合在一起时,但单片机却不能下载程序 把芯片取下来,换到其他的同一芯片型号的单片机下载

下面附上代码:代码分为五个模块:1.主函数模块,2.时间和路程处理模块,3.1602lcd显示模块,4温度处理模块,5断电保存模块。

51单片机都适用,只需修改一下对应的引脚即可。

1.主函数模块:

#include

#include

#include

#include

#include

#include

extern unsigned long int t1;

void main()

{

uchar a,i;

uchar re[4]={0};

Initlcd();

time_init();

EA=0;

re[0]=read_add_data(0x2003);

delay(5);

re[1]=read_add_data(0x2002);

delay(5);

re[2]=read_add_data(0x2001);

delay(5);

re[3]=read_add_data(0x2000);

delay(5);

EA=1;

t1=0;

for(i=0;i<4;i++)

{

t1=t1<<8;

t1=t1|re[i];

}

while(1)

{

time_set(); //调用时间设置函数

speed_display(); //调用速度显示函数

delay(5);

journey_display(); // 调用路程显示函数

delay(5);

time_display(); // 调用时间显示函数

delay(5);

tem_change();

for(a=20;a>0;a--)

{

get_temperature(); //得到温度值函数

display_temp(); //显示温度函数

}

}

}

2.时间和路程处理模块

uchar s,m,h,i;

uchar count1,count2,count3;

uchar temp1;

unsigned long int sp1,jour1, t1;

uchar sp[4]={0}; //速度

uchar jour[7]={0}; //路程

uchar wr[4]={0};

void time_init()

{

TMOD=0x51;

//01010001,T1做计数器,T0做定时器

TH0=(65536-50000)/256; //定时器T0的高8位设置初值

TL0=(65536-50000)%256; //定时器T0的低8位设置初值

TH1=0x00; //计数器的初值为0

TL1=0x00;

EA=1; //开总中断

ET0=1; //允许定时器0溢出中断

TR0=1; //启动定时器0

TR1=1;

}

void Time0(void ) interrupt 1 using 1 //定时器T0的中断编号为1,使用第1组工作寄存器

{

count1++;

//每产生1次中断,中断累计次数加1

count2++;

count3++;

if(count3==40)

{

delete_add_data(0x2000);

delay(5);

wr[0]=t1&0xff;

wr[1]=(t1>>8)&0xff;

wr[2]=(t1>>16)&0xff;

wr[3]=(t1>>24)&0xff;

for(i=0;i<4;i++)

{

EA=0;

write_add_data(0x2000+i, wr[i]);

delay(5);

EA=1;

}

}

if(key6==0)

//路程清零

{

delay(100);

if(key6==0)

{

t1=0;

TH1=0;

TL1=0;

jour[6]=0;

jour[5]=0;

jour[4]=0;

jour[3]=0;

jour[2]=0;

jour[1]=0;

jour[0]=0;

}

}

if(count2==40) //两

相关主题