单片机课程设计报告
自行车测速仪
学 院 信息工程学院
专 业 信息工程
(电子信息工程方向)
年级班别 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) //两