版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
单片机课程设计报告自行车测速仪学院信息工程学院专业信息工程(电子信息工程方向>年级班别2018级<4)班学号3110002980学生姓名XXX指导教师XXX申请成绩XXXO890avxlRSb5E2RGbCAP主要特点或功能答辩记录1.可以测试自行车的车速2018开始时间:年12月2.可以显示和修改实时时间结束时间1、设计要求:考题:3.可以显示实时温度4.记录自行车所走过的路程答辩结果:人选此题,难度系数:中;此自行车测速仪<传感器必须自己做)(每班最多85.断电保存路程变量显示题除非所有硬件自己做,并用于实际自行车上,否则不能得优或良>O890avxlRSp1EanqFDPw基本功能:能实时显示自行车的行驶速度附加功能:实时时钟,行驶里程累计2.设计思路:首先是选择基于51单片机来设计这个产品,这个产品主要的功能是用来测量自行车的车速,既然要测车速,那就要用到传感器,所以选择了红外光电传感器,它的检测头里也装有一个发光器和一个收光器,但前方没有反光板.正常情况下发光器发出的光收光器是找不到的.当检测物通过时挡住了光,并把光部分反射回来,收光器就收到光信号,输出一个开关信号.在没有遮挡物时,传感器输出端输出一个高电平,当有遮挡物时,输出端就会输出低电平,那样就可以利用单片机的计数功能,把传感器输出的信号输入到单片机的外部脉冲输入端,可以通过测试脉冲数来算出车速,具体实现是利用单片机的计数功能实现下降沿计数,然后在两秒内统计出自行车走过的圈数,算出自行车车轮的周长,再乘以圈数,再除以时间两秒,就得到车速,然后在lcd上面显示,还可以算出自行车的路程,也利用单片机的定时中断功能可以设置和显示实时时间,还可以利用单片机上自带的温度传感器 ds18b20测出实时温度,在 lcd上显示出来.O890avxlRSDXDiTa9E3d3.任务分工:XXX<100%)4.设计步骤:1/201.先完成lcd的显示代码,使单片机上的 lcd能正常显示数字,字符.2,利用单片机的定时计数功能,首先在 lcd上显示实时时间能每秒加一 .3.通过对按键的扫描检测,实现对实时时间的设置 .例如按下按键,使能设置时间<断开计时中断),再分别设置三个按键分别实现对小时,分钟,秒的设置 <按下一次加一) O890avxlRSRTCrpUDGiT.4.通过单片机的计数功能,即外部脉冲信号输入到引脚 P3.5<T1),电平从1到0跳变,则计数器加一.把红外光电传感器的信号输出端接到引脚P3.5,自行车车轮的周长,再乘以圈数,再除以时间两秒,就得到车速,然后在lcd上面显示.O890avxlRS5PCzVD7HxA5.车轮的周长乘以圈数<每次累加起来),就可以得到自行车走过的路程,并在lcd上显示出来.6.利用单片机上的温度传感器 ds18b20,把得到的温度数据转化并显示在 lcd上.5,.程序流程<含流程图及详细步骤解释)2/20开始1初始化2 3 5Key6key=01=04ynyn路得到得到速程温度度值清ET零=0液晶显示
6 7 8 9Key key Key Key2=0 3=0 4=0 5=0n ny nyynyh+ m s+ ET1 +1 1 =1O890avxlRSjLBHrnAILg流程图详细步骤解释:1.程序开始运行,初始化.2.判断key6=0,即键6是否被按下,按下则对路程清零,否则显示累计的路程值.利用单片机上的温度传感器ds18b20,不断得到实时温度值.4.把TMOD=01010001,即把T1作为计数器,把 T0作为定时器,利用定时功能实现实时时间的显示,即实现每秒加一,利用 T1的计数功能,记录由传感器输出的脉冲数,然后可以换算成速度,还可以算出走过的路程.O890avxlRSxHAQX74J0X3/205.判断key1是否为0,即key1是否被按下,若按下,则令 ET0=0<停止定时中断),便于设置时间.O890avxlRSLDAYtRyKfE6.判断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允许并启动定时中断..O890avxlRSZzz6ZB2Ltk4/204.红外光电传感器模块,有三个引脚,分别是接地,接电源,输出信号端接P3^5,分别用杜邦线连接.5.温度传感器ds18b20,对传感器的输出数据进行处理,然后在lcd上显示温度值5/207.设计过程遇到的问题,原因及解决方法:日期时间 问题和难点描述 问题原因及解决方法2018/12/179:00选择用51单片机,但是没51去问同学借了一块单片机2018/12/1810:00对51单片机还不熟悉通过去图书馆找书,还有看原理图,结合实例,熟悉51的每个模块2018/12/198:30按键检测时,按键抖动查看资料,用延时来实现按键消抖2018/12/2010:00对传感器不太熟悉上网查看大量资料,并挑选出适合的红外光电传感器2018/12/2214:00对51自带的温度传感器不熟上网查看资料,实现温度结悉果的获取,并在lcd上显示2018/12/249:00各个模块结合在一起时,但把芯片取下来,换到其他的单片机却不能下载程序同一芯片型号的单片机下载下面附上代码:代码分为五个模块: 1.主函数模块,2.时间和路程处理模块,3.1602lcd显示模块,4温度处理模块,5断电保存模块.O890avxlRSdvzfvkwMI151单片机都适用,只需修改一下对应的引脚即可 .1.主函数模块:6/20#include<reg52.h>#include<Time_Journey.h>#include<Lcd.h>#include<Temp.h>#include<delay.h>#include<stc_eeprom.h>externunsignedlongintt1。voidmain(>{uchara,i。ucharre[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-->7/20{get_temperature(>。 //得到温度值函数display_temp(>。 //显示温度函数}}}2.时间和路程处理模块uchars,m,h,i。ucharcount1,count2,count3。uchartemp1。unsignedlongintsp1,jour1,t1。ucharsp[4]={0}。 //速度ucharjour[7]={0}。 //路程ucharwr[4]={0}。voidtime_init(>{TMOD=0x51。//01010001,T1做计数器,T0做定时器TH0=(65536-50000>/256。 //定时器T0的高8位设置初值TL0=(65536-50000>%256。 //定时器T0的低8位设置初值TH1=0x00。 //计数器的初值为 0TL1=0x00。EA=1。 //开总中断ET0=1。 //允许定时器0溢出中断TR0=1。 //启动定时器0TR1=1。}voidTime0(void>interrupt1using1//定时器T0的中断编号为 1,使用第1组工作寄存器 O890avxlRSrqyn14ZNXI{count1++。//每产生1次中断,中断累计次数加 1count2++。count3++。if(count3==40>{8/20delete_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> //两秒钟测一次转了多少圈9/20{count2=0。temp1=TL1。sp1=3212*temp1。sp[3]=sp1/10000。sp[2]=sp1/1000%10。sp[1]=sp1/100%10。sp[0]=sp1/10%10。t1=t1+temp1。jour1=189*t1。jour[6]=jour1/1000000%10。jour[5]=jour1/100000%10。jour[4]=jour1/10000%10。jour[3]=jour1/1000%10。jour[2]=jour1/100%10。jour[1]=jour1/10%10。jour[0]=jour1%10。TH1=0。TL1=0。//计数器的值清零}if(count1==20>//如果中断次数计满20次,即定时1s{count1=0。//中断累计次数清0s++。 //秒加1}if(s==60> //如果计满60秒{s=0。 //秒清0m++。 //分钟加1}10/20if(m==60> //如果计满60分{m=0。 //分钟清0h++。 //小时加1}if(h==24>//如果计满24小时{h=0。 //小时清0}TH0=(65536-50000>/256。 //定时器T0高8位重新赋初值TL0=(65536-50000>%256。 //定时器T0低8位重新赋初值}voidtime_set(>//设置时间函数{if(key1==0>{delay(100>。 //延时消抖if(key1==0>{TR0=0。ET0=0。//停止计时TL0=0。TH0=0。}}if(key2==0>//key2设置小时{delay(100>。if(key2==0>{if(h==23>{h=0。}else{h=h+1。}}11/20}if(key3==0>//key3设置分钟{delay(100>。if(key3==0>{if(m==59>{h=h+1。m=0。}else{m=m+1。}}}if(key4==0>//key4设置秒{delay(100>。if(key4==0>{if(s==59>{m=m+1。s=0。}else{s=s+1。}}}if(key5==0>//按下key5,启动定时器继续计时{delay(100>。if(key5==0>{ET0=1。TR0=1。}12/20}}voidspeed_display(> //显示速度(km/h>函数{Displayonechar(0,0,sp[3]+0x30>。Displayonechar(1,0,sp[2]+0x30>。Displayonechar(2,0,0x2e>。Displayonechar(3,0,sp[1]+0x30>。Displayonechar(4,0,sp[0]+0x30>。}voidjourney_display(>//显示路程(m>函数{Displayonechar(8,0,jour[6]+0x30>。Displayonechar(9,0,jour[5]+0x30>。Displayonechar(10,0,jour[4]+0x30>。Displayonechar(11,0,jour[3]+0x30>。Displayonechar(12,0,jour[2]+0x30>。Displayonechar(13,0,0x2e>。Displayonechar(14,0,jour[1]+0x30>。Displayonechar(15,0,jour[0]+0x30>。}voidtime_display(>//显示时间函数{Displayonechar(0,1,h/10+0x30>。Displayonechar(1,1,h%10+0x30>。Displayonechar(2,1,0x3a>。Displayonechar(3,1,m/10+0x30>。Displayonechar(4,1,m%10+0x30>。Displayonechar(5,1,0x3a>。Displayonechar(6,1,s/10+0x30>。Displayonechar(7,1,s%10+0x30>。}3.1602lcd显示模块voidWaitforenable(>//检测忙信号子函数{dataport=0xff。lcm_rs=0。lcm_rw=1。_nop_(>。lcm_en=1。_nop_(>。_nop_(>。while(dataport&0x80>。//检测到忙信号就等待13/20lcm_en=0。}voidWritecommandlcm(ucharcmd,ucharattribc>//写命令到lcm子函数O890avxlRSEmxvxOtOco{if(attribc>Waitforenable(>。lcm_rs=0。lcm_rw=0。_nop_(>。dataport=cmd。_nop_(>。lcm_en=1。_nop_(>。_nop_(>。lcm_en=0。}voidWritedatalcm(uchardataw>{Waitforenable(>。lcm_rs=1。lcm_rw=0。_nop_(>。dataport=dataw。_nop_(>。lcm_en=1。_nop_(>。_nop_(>。lcm_en=0。}voidInitlcd(>//函数名为Initlcd的lcm初始化子函数{Writecommandlcm(0x38,1>。//8位数据传送,2行显示,5x7字型,检测忙信号O890avxlRSSixE2yXPq5Writecommandlcm(0x08,1>。//关闭显示,检测忙信号Writecommandlcm(0x01,1>。//清屏,检测忙信号Writecommandlcm(0x06,1>。//显示光标右移设置,检测忙信号Writecommandlcm(0x0c,1>。//显示屏打开,光标不显示,不闪烁,检测忙信号}voidDisplayonechar(ucharx,uchary,ucharddata>//显示指定坐标一个字符的子函数O890avxlRS6ewMyirQFL{y&=1。//限定范围为0~1x&=15。//限定范围为0~15if(y>x|=0x40。//若y为1<显示第二行),地址码+0x40x|=0x80。//指令码为地址码+0x80Writecommandlcm(x,0>。//将指令x写入lcm,忽略忙信号检测<显示光标定位,数字显示位置)O890avxlRSkavU42VRUs14/20Writedatalcm(ddata>。 //写入要显示的字符}4.温度处理模块sbitds=P3^7。//单总线引脚ucharflag。uinttemp。voidTempDelay(ucharus>{while(us-->。}voidds_reset(void>{ds=1。_nop_(>。 //1usds=0。TempDelay(68>。//当总线停留在低电平超过480us,总线上所以器件都将被复位,这里//延时约530us总线停留在低电平超过480μs,总线上的所有器件都将被复位.O890avxlRSy6v3ALoS89_nop_(>。ds=1。//产生复位脉冲后,微处理器释放总线,让总线处于空闲状态TempDelay(10>。//释放总线后,以便从机18b20通过拉低总线来指示其是否在线,存在检测高电平时间:15~60us,所以延时44usO890avxlRSM2ub6vSTnP_nop_(>。_nop_(>。_nop_(>。if(ds==0>flag=1。elseflag=0。TempDelay(20>。//存在检测低电平时间: 60~240us,所以延时约140us_nop_(>。_nop_(>。ds=1。 //再次拉高总线,让总线处于空闲状态/**/}/*----------------------------------------读/写时间隙:DS1820的数据读写是通过时间隙处理位和命令字来确认信息交换 .------------------------------------------*/bitds_read_bit(void>//读一位{bitdat。15/20ds=0。 //单片机<微处理器)将总线拉低_nop_(>。 //读时隙起始于微处理器将总线拉低至少 1usds=1。 //拉低总线后接着释放总线,让从机 18b20能够接管总线,输出有效数据_nop_(>。_nop_(>。 //小延时一下,读取 18b20上的数据,因为从ds18b20上输出的数据O890avxlRS0YujCfmUCw//在读"时间隙"下降沿出现15us内有效dat=ds。 //主机读从机18b20输出的数据,这些数据在读时隙的下降沿出现//15us内有效O890avxlRSeUts8ZQVRdTempDelay(20>。//所有读"时间隙"必须60~120us,这里77usreturn(dat>。//返回有效数据}uchards_read_byte(void>//读一字节{ucharvalue,i,j。value=0。 //一定别忘了给初值for(i=0。i<8。i++>{j=ds_read_bit(>。value=(j<<7>|(value>>1>。//这一步的说明在一个 word文档里面}return(value>。 //返回一个字节的数据}voidds_write_byte(uchardat>//写一个字节{uchari。bitonebit。 //一定不要忘了,onebit是一位for(i=1。i<=8。i++>{onebit=dat&0x01。dat=dat>>1。if(onebit> //写1{ds=0。_nop_(>。_nop_(>。//看时序图,至少延时1us,才产生写"时间隙"ds=1。//写时间隙开始后的15μs内允许数据线拉到高电平TempDelay(20>。//所有写时间隙必须最少持续60us}else //写0{ds=0。TempDelay(20>。//主机要生成一个写 0时间隙,必须把数据线拉到低电16/20平并保持至少60μs,这里64usO890avxlRSsQsAEJkW5Tds=1。_nop_(>。_nop_(>。}}}voidtem_change(> //温度转换{ds_reset(>。delay(3>。 //约2msds_write_byte(0xcc>。 //写跳过读ROM指令ds_write_byte(0x44>。 //写温度转换指令}/*----------------------------------------获得温度:------------------------------------------*/uintget_temperature(> //读取寄存器中存储的温度数据{floatwendu。uchara,b。ds_reset(>。delay(3>。 //约2msds_write_byte(0xcc>。ds_write_byte(0xbe>。a=ds_read_byte(>。//读低八位b=ds_read_byte(>。 //读高八位temp=b。temp<<=8。 //两个字节组合为一个字节temp=temp|a。wendu=temp*0.0625。 //一次读取十六位,之后将低 11位转换为十进制后乘以0.0625便使所测实际温度 aPkqouInQMGMsIasNXkAtemp=wendu*100+0.5。 // 乘以100表示读取小数点后面 2位,+0.5表示四舍五入aPkqouInQMTIrRGchYzgreturntemp。 //temp是整型}voiddisplay_temp(>{Displayonechar(9,1,(temp/1000>%10+0x30>。17/20Displayonechar(10,1,(temp/100>%10+0x30>。Displayonechar(11,1,0x2e>。Displayonechar(12,1,(temp/10>%10+0x30>。Displayonechar(13,1,temp%10+0x30>。Displayonechar(14,1,0xdf>。Displayonechar(15,1,'C'>。}5.断电保存处理模块//寄存器定义,因为<reg52.h>头文件里面没有这个定义sfrisp_data=0xe2。sfrisp_addrh=0xe3。sfrisp_addrl=0xe4。sfrisp_cmd=0xe5。sfrisp_trig=0xe6。sfrisp_contr=0xe7。//这断话要看看//擦除片内EEPROM的一个扇区//擦除只能以扇区为最小单位进行,没法只擦除一个字节//一个扇区是512个字节//本函数参数里面的地址落在哪个扇区,则该扇区内数据都将被擦除//例如:STC89C52RC片内EEPROM第一扇区开始地址为 0x2000,结束地址为0x21ff//如果调用delete_add_data(2001>。 则第一扇区内数据都将被擦除//擦除成功后,该扇区内各字节都将变为 0xffvoiddelete_add_data(unsignedintaddress>擦//除扇区aPkqouInQM7EqZcWLZNX{unsignedchar。iisp_addrl=address。isp_addrh=address>>8。isp_contr=0x01。isp_contr=isp_contr|0x81。//0x80ifSYSCLK<40MHz,0x81ifSYSCLK<20MHz,0x82ifSYSCLK<10MHz,0x83ifSYSCLK<5MHzaPkqouInQMlzq7IGf02Eisp_cmd=0x03。 //擦除扇区命令isp_trig=0x46。isp_trig=0xb9。for(i=0。i<3。i++>。isp_addrl=0xff。isp_addrh=0xff。isp_contr=0x00。isp_cmd=0x00。isp_trig=0x00。}18/20//对STC片内
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年三江侗族自治县医疗事业单位人员招聘笔试备考题库及答案解析
- 2026年金阳县医疗事业单位人员招聘笔试备考题库及答案解析
- 2026年昌乐县医疗事业单位人员招聘考试参考题库及答案解析
- 2026年靖州苗族侗族自治县带编教师招聘笔试备考题库及答案解析
- 2026年临城县医疗事业单位人员招聘考试备考题库及答案解析
- 2026年安图县医疗事业单位人员招聘考试备考题库及答案解析
- 2026年秭归县医疗事业单位人员招聘笔试参考题库及答案解析
- 2026年岷县医疗事业单位人员招聘考试参考题库及答案解析
- 2026年饶河县社区工作者招聘考试参考题库及答案解析
- 2026年辽阳县医疗事业单位人员招聘考试参考题库及答案解析
- 2025年内蒙古自治区专升本化学考试试题及答案
- 乡卫生院儿童营养包制度
- 期货培训课件模板
- 融资租赁在医疗设备的售后回租调研
- 2026年医用气体管道系统安装工程分包合同
- 工业自动化设备维护管理案例
- 2025年军队文职计算机专业科目真题精讲与冲刺训练
- 雨课堂学堂在线学堂云《创新创业基础( 南京信工)》单元测试考核答案
- 精神分裂症合并肺结核综合管理要点
- 老年人照顾者支持体系构建
- 市政边坡锚杆施工方案
评论
0/150
提交评论