您的当前位置:首页正文

基于单片机的自行车测速系统设计与实现论文

2022-03-17 来源:钮旅网


毕业设计(论文)说明书

题 目:自行车测速系统设计与实现

院 (系): 信息与通信学院 专 业: 电子信息工程 学生姓名: 学 号: 指导教师:

职 称: 副教授

√ 工程设计 工程技术研究 软件开发 题目类型: 理论研究 实验研究

2014年5月20日

桂林电子科技大学毕业设计(论文)报告用纸 第1 页

摘 要

随着社会的进步发展和环保意识的增强,能够锻炼身体,且能环保出行的自行车成了大众的宠儿。随自行车的快速发展,人们对自行车的功能要求也越来越高。自行车测速仪通过测量并显示出行时的日期、时间、温度、速度和里程数,能够较好的满足人们对自行车的基本需求。

本设计通过分析自行车测速仪的原理,基于STC89C52单片机和C语言,设计和实现了一种自行车测速系统。该系统主要包括单片机数据处理、电机测速、温度测量、时钟计时、显示数据、按键控制七大功能模块。在系统实现中,硬件部分以STC89C52单片机为处理核心,用红外对管传感器将车轮的转数转换为电脉冲,进行处理后送入单片机,通过测量电机转的圈数,经过数据处理得到速度和路程数。软件部分采用C语言进行编程,实现系统的控制与显示。本系统的实现达到了预期的设计目标。

关键词:自行车测速;STC89C52单片机;红外对管传感器;C语言

1

桂林电子科技大学毕业设计(论文)报告用纸 第2 页

Abstract

With the development of social progress and environmental protection consciousness, can physical exercise, and green travl bicycle ,became the darling of the public. With the rapid development of bicycle, the bicycle features people are increasingly high requirements. Bicycle speedometer can display the travel date, time, temperature, speed and mileage by measuring ,to better me people's basic needs for bicycle.

This design through the analysis of principles of bicycle speedometer, based on STC89C52 singlechip and C language, design and implementation of a bicycle speed system. The system includes a SCM data processing, motor speed, temperature measurement, timing, data shows,key control that seven major function module. In the system realization, The hardware part with STC89C52 SCM as core processor. Using the infrared tube sensor will wheel speed is converted into electrical pulses, processed into the microcontroller.By measuring the motor cycles,after data processing, we can know the speed and distance. The software using C language programming ,to realize the system control and display. The realization of this system reaches the expected design goal.

Key words: Bicycle Tachometer ;STC89C52 single chip microcomputer; Infrared tube sensor; C language

2

桂林电子科技大学毕业设计(论文)报告用纸 第1 页

目录

引言 ........................................................................................................... 2 1 设计要求 .............................................................................................. 2

1.1 毕业设计题目 ...................................................................................................................... 2

1.2 设计的主要功能 .................................................................................................................. 2

2 工作原理和系统结构 .......................................................................... 3 3 硬件设计 .............................................................................................. 4

3.1 系统总电路图 ...................................................................................................................... 4

3.2 单片机控制处理模块 .......................................................................................................... 4 3.3红外对管测速模块 ............................................................................................................... 8 3.4 DS1302时钟芯片模块 ....................................................................................................... 10 3.5 DS1302温度采集模块 ....................................................................................................... 12 3.6 LCD显示模块 ..................................................................................................................... 14 3.7 电机驱动模块 .................................................................................................................... 15 3.8 按键功能、供电和串口下载模块 .................................................................................... 15

4 软件设计 .......................................................................................... 18

4.1 Keil uVision 4软件介绍 ............................................................................................... 18 4.2 程序设计思想与开发环境 ................................................................................................ 18 4.3 主程序设计 ........................................................................................................................ 19 4.4 各个模块程序设计 .......................................................................................................... 19 4.4.1 红外对管测速模块程序设计 ........................................................................................ 19 4.4.2 DS18B20温度测量模块程序设计 ................................................................................. 21 4.4.3 DS1302时钟芯片模块程序设计 ................................................................................... 24 4.4.4 LCD12864显示模块程序设计 ....................................................................................... 27

5 系统测试.............................................................................................. 28

5.1 硬件调试 ............................................................................................................................ 28 5.2 软件调试 ............................................................................................................................ 29 5.3 对实际电路进行测试 ........................................................................................................ 29

6 总结 ..................................................................................................... 31 致 谢..................................................................................................... 32 参考文献:.............................................................................................. 33 附 录 ..................................................................................................... 34

1

桂林电子科技大学毕业设计(论文)报告用纸 第2 页

引言

自行车是传统产业,具有100多年的历史,由于环保以及交通的问题,自行车再度成为世界各国特别是发达国家居民喜爱的交通、健身工具。在美国、欧洲、日韩等发达国家,自行车深受人们的喜爱,是一种比较普遍的运动、休闲和娱乐性产品。每年全世界自行车需求量巨大,日本CYCLEPRESS的数据统计显示,全世界自行车需求规模保持在1.06亿台的水平,自行车年交易额约为50亿美元。数据显示,世界自行车行业的重心正从传统的代步型交通工具向运动型、山地型、休闲型转变,随着自行车功能类型的转变和行业的需求日益增大,自行车的辅助功能配件市场也越来越火热[1]。

虽然自行车出行环保健康,但是也存在着许多安全隐患。在骑自行车的过程中想要知道时间要看手表或者手机,骑车过程东张西望很容易发生交通事故,停车下来查看又不不能便利出行。虽然自行车的车速没有机动车快,但是在一些特殊路况中也要安全减速。在以往的自行车对于行驶的路程没有一个准确的数值,达不到一些以锻炼身体的目的的出行者的要求。

大众的需求和环境的变化促使了自行车辅助配件的诞生,自行车测速仪则很好的解决这些难题,本设计的自行车测测速仪不仅能简单明了的现实当前的时间日期,还能显示出当前的车速,为我们的安全出行带来了保障。当车停下来还可以知道自己骑行的里程数,为自己锻炼身体提供了便利。测速仪还能实时显示当前环境的温度,为我们的健康出行提供了有利参考。自行车测速仪不仅为出行带来便利,也为安全出行提供了保障。

1 设计要求

1.1 毕业设计题目

自行车测速系统设计与实现 1.2 设计的主要功能

本设计以STC89C52单片机为核心,用红外对管传感器和DS18B20温度传感器测量数据,使用DS1302作为时钟芯片,由LCD12864显示其数据,制作而成的一个自行车测速系统。其主要的实现功能如下:

(1)实现自行车的测速功能,当自行车在行驶时,能显示自行车行驶的速度; (2)测量当前的温度,自行车行驶过程中能实时显示当前环境的温度值;

2

桂林电子科技大学毕业设计(论文)报告用纸 第3 页

(3)显示当前时间,自行车行驶过程中能显示当前的日期和时间; (4)当自行车车停止行驶时,显示自行车总行驶的里程数。

2 工作原理和系统结构

根据设计的要求自行车测速系统设计与实现[2]主要分为七大模块:单片机控制处理模块、红外对管传感器检测模块、DS1302时钟芯片模块、DS18B20温度采集模块、电机驱动模块、LCD12864显示模块、按键控制模块。系统结构如图2-1所示。

图2-1系统结构框图

(1)单片机控制处理模块

采用STC89C52单片机芯片作为本模块的控制处理核心[3],主要负责对其他部分进行数据处理和控制;

(2)红外对管传感器检测模块

红外对管传感器将车轮的转数转换为电脉冲,然后将所测得数据送入单片机,通过测量电机转的圈数,经过数据处理得到当前速度和里程数;

(3)DS1302时钟芯片模块

DS1302可以对年、月、周、日、时、分、秒进行记时,具有闰年补时等多种功能,能让系统实时显示日期和时间;

(4)电机驱动模块

3

桂林电子科技大学毕业设计(论文)报告用纸 第4 页

模仿自行车的车轮,用于红外对管传感器采集车轮转速; (5)DS18B20温度采集模块

采用数字DS18B20的温度传感器负责测量当前室内空气的温度,并输送到单片机由其进行数据处理;

(6)LCD12864显示模块

LCD12864液晶屏显示单片机处理所得当前速度、时间、日期、温度、里程数的数据。

3 硬件设计

3.1 系统总电路图

系统总电路由STC89C52单片机[4]构成的单片机控制处理模块、红外对管传感器构成的测量电机转速模块、电机构成的模仿车轮转动模块、DS18B20构成的温度测量模块、DS1302构成的时间日期计数模块、串口下载模块和四个按键组成功能按键控制模块组成,系统总电路图如图3-1所示。

图3-1系统总电路图

3.2 单片机控制处理模块

本设计控制和数据处理模块由STC89C52芯片构成,STC89C52单片机通用性强,

4

桂林电子科技大学毕业设计(论文)报告用纸 第5 页

可利用多种软件编程,不仅算术运算能力强,而且具有低功耗、高性能、I/0端口丰富、占用体积小、成本低廉等优点。只要外部电源给电源部分提供+5电压供电,控制和数据处理模块就可以正常工作。当单片机外接RE232DB9串口字母接口可连接电脑,可实现程序的下载支持在线调程序。通过外接端口连接电路可实现对红外对管检测脉冲的计数,从而计算出电机转速和里程数,还具有时间日期显示、温度显示、控制数据检测与清零等众多功能。单片机控制处理模块电路图如3-2所示。

图3-2单片机控制处理模块电路图

STC89C52是STC公司推出的一款低功耗、高性能的CMOS8位微控制器,内核采用的是经典的MCS-51,而且做了许多优良的改进,在51单片机的基础上增添了许多实用功能。其主要的功能和性能参数[5]如下:

(1)在51单片机内核基础增强,可以任意选择机器周期为6时钟或12时钟,所使用的指令代码适用于传统的51单片机;

(2)拥有8位CPU和在系统可编程Flash,8K字节Flash: (3)内置4KB EEPROM,MAX810复位电路; (4)32个通用I/O接口;

(5)共有T0/T1/T2 3个16位定时器 (6)4路外部中断; (7)工作电压:3.3V~5.5V

(8)工作频率:0~40MHZ,实际可达48MHZ:

5

桂林电子科技大学毕业设计(论文)报告用纸 第6 页

(9)工作温度:-40°C~+85°C (10)内部存储空间为:512B; (11)通用异步串行口;

(12)有ISP(在系统可编程)、IAP(在应用可编程),无需专用编程器和仿真器; (13)具有多种外形封装,PDIP-40、PLCC-44、PQFP等。

下面介绍STC89C52的其中一种封装PDIP-40(如图3-3所示)和其引脚功能:

图3-3 STC89C52引脚图

STC89C52引脚功能说明: 1.VCC :电源电压 2.VSS :接地

3.P0口:即P0.0~P0.7,39~32引脚,P0口是一组8位漏极开路的双向I/O口。当此作输出端口,8个引脚能驱动8个TTL负载,若让其作为高阻抗输入,可在PO端口写入‘1’。当访问数据存储器和外部程序时,P0端口可提供8为地址/数据的地址复用总线,PO端口内部上拉电阻有效。在编程时,P0端口接收指令字节;而在校验程序时,PO端口输出指令字节且要求外接上拉电阻。

4.P1口:即P1.0~P1.7,1~8引脚,P1口是一个带内部上拉电阻的8位双向I/O口。P1的输出缓冲器通过吸收或者输出电流方式可驱动4个TTL输入。当其作输入

6

桂林电子科技大学毕业设计(论文)报告用纸 第7 页

口时,可对端口写入‘1’并通过内部的上拉电阻把端口拉到高电位。当P1口作输入口时,被外部拉低的引脚因为内部有电阻会输出一个电流。

另外,与传统的51单片机不同之处,P1.0与P1.1还可以分别作为定时器/计数器2的外部技术输入(P1.0/T2)和定时器/计数器2的触发输入(P1.1/T2EX),编程和程序校验时,P1接收低8位地址。具体如下表3-4所示。

表3-4引脚功能特性 引脚号 P1.0 P1.1 功能特性 T2(定时器/计数器2外部计数输入),时钟输出 T2EX(定时器/计数器2捕获/重装触发和方向控制) 5.P2口:即P2.0~P2.7,21~28引脚,P2口是一组8位双向I/O端口且带内部上拉电阻的。P2的输出缓冲器通过吸收或输出电流方式可驱动4个TTL输入。当其作为输入口时,只需对端口写入‘1’并将内部的上拉电阻把端口拉到高电平。P1口作输入口时,被外部拉低的引脚因为内部有电阻会输出一个电流。

在访问外部程序存储器/16位地址的外部数据存储器时,P2送出高8位地址。在访问8位地址的外部数据存储器时,P2口引脚上的内容不会改变。

在对Flash 编程和程序校验时,P2也接收高位地址和一些控制信号。 6.P3口:即P3.0~P3.7,10~17引脚,P3是一组内部带上拉电阻的8位双向I/O端口。P3的输出缓冲器通过吸收或输出电流方式可驱动4个TTL输入。当其作为输入口时,只需对端口写入‘1’并将内部的上拉电阻把端口拉到高电位。P3口作输入口时,被外部拉低的引脚因为内部有电阻会输出一个电流。

在对Flash 编程或程序校时,P3好可以接收控制信号。

P3口不仅可以作为一般I/O口外,还具许多复用功能,如下表3-5所示。

表3-5 P3口复用功能 引脚号 P3.0 P3.1 P3.2 P3.3 P3.4 P3.5 P3.6 P3.7 用来完成单片机单片机的复位初始化操作。

复用功能 RXD (串行输入口) TXD (串行输出口) (外部中断0) (外部中断1) T0(定时器0的外部输入) T1(定时器1的外部输入) (外部数据存储器写选通) (外部数据存储器读选通) 7.RST:即9引脚,复位输入。当输入连续两个机器周期以上高电平时为有效,

7

桂林电子科技大学毕业设计(论文)报告用纸 第8 页

8.ALE:即30引脚,地址锁存控制信号,在访问外部程序存储器时,锁存低8位地址的输出脉冲。在Flash编程时,此引脚也用作编程输入脉冲。

9.PSEN:即29引脚,外部程序存储器选通信号。当从外部程序存储器执行外部代码时,在每个机器周期被激活两次,而访问外部数据存储器时,将不被激活。

10.VPP:即31引脚,访问外部程序存储器控制信号。为使能从0000H到FFFFH的外部程序存储器读取指令,必须接GND。注意加密方式1时,将内部锁定位RESET。接VCC时,执行内部程序指令。在Flash编程期间,也接收12V电压。

11.XTAL1:即19引脚,振荡器反相放大器和内部时钟发生电路的输入端。 12.XTAL2:即18引脚,振荡器反相放大器的输入端。

STC89C52单片机基本能满足本设计硬软件上的要求,故选用其为本设计的单片机控制处理模块的核心。 3.3 红外对管测速模块

测速模块主要由红外对管,LM358比较器和电阻组成。其电路图如3-6所示。

图3-6红外对管测速电路

红外对管包括红外线发射管、光敏接收管、红外线接收管、红外接头。当它们配合起来使用时则称为红外对管[6]。本设计使用的红外对管为红外线发射管和红外线接收管。

红外发射管:又称红外线发射二级管,是一种可以将电能直接转换成红外光(不可见光)并辐射出去的二级管发光器件,其结构、原理与普通发光二级管相近,不同在于使用的半导体材料,它的半导体材料为砷化镓(GaAs)、砷铝化镓(GaAIAs)等材料,封装一般采用透明、浅蓝色或黑色的树脂。

红外接收管:一种可以将光信号转化成电信号的半导体器件,它主要的核心

8

桂林电子科技大学毕业设计(论文)报告用纸 第9 页

部件是一个特殊材料的PN结,PN结面积比一般的二级管要大,电极面积更小,这样可以更大更多的面积接收入射光线,PN结的结深一般小于1微米。

当红外发射管工作时,发出的红外线照射在红外接收管时,携带能量的红外线光子进入PN结,把能量传给共价键的束缚电子,部分共价电子因此挣脱共价键,由此产生光载流子。它们在反向电压的作用下发生漂移运动,这样使反向电流增大,当光的强度越大,产生的反向电流也越大,这种特效叫做光电导。若在外电路接上负载,负载就会获得电信号,光强度越大电信号越强。

LM358:内部包含有两独立的、高增益、内部频率补偿的运算放大器,可用于单电源和双电源两种工作模式,在推荐的工作条件下,电源电流与电源电压无关。可用于传感放大器、直流增益模块和其他单电源供电的使用运算放大器的场合。在本设计中,LM358用作一个比较器,在有高低电平输入时,输出高电平。LM358性能特征如下:

(1)内部频率补偿;

(2)直流电压增益高(约为100dB); (3)低输入偏流; (4)双电源(±1.5V); (5)电源电压(3V~30V); (6)低功耗,可用电池供电; (7)输出电压摆幅大(0~VCC-1.5V); (8)单位增益频带宽(约1MHZ); (9)低输入失调电压和失调电流

(10)差模输入电压范围宽,等于电源电压范围。

在本设计中,用红外对管对电机车轮进行测速,在两个红外对管间装上自制的车轮,车轮有四个扇形空缺。如图3-7所示。

图3-7 红外对管工作方式与车轮形状

当发射管和接收管有车轮遮挡时,红外对管不导通,无电信号输出,LM358比较器输出一个低电平;当发射管和接收管没有车轮遮挡时,红外对管导通,通过

9

桂林电子科技大学毕业设计(论文)报告用纸 第10 页

LM358比较器,输出一个高电平。测速模块输出端外接STC89C52的P.17口,通过单片机定时器功能,计算出单位时间内接收到的脉冲个数,可算出其速度和里程数。

本设计中设定车轮周长为1米,定时器0.5秒计算一次 ,轮子转动一周产生4个脉冲,一个脉冲为0.25米。则可算出每秒速度V与路程S:

V(每秒速度)=脉冲个数*轮子周长/4*2 S = V*单位时间 3.4 DS1302时钟芯片模块

本设计使用的实钟芯片为DS1302,芯片的CLK、I/O、RST分别直接到STC89C52的P2.3、P2.4、P2.5接口,通过程序控制可让系统进行实时计时。时钟芯片模块电路图如图3-8所示。

图3-8 DS1302时钟芯片模块电路图

DS1302是DALLAS公司推出的一款涓流充电时钟芯片,内部的实时时钟和日历电路提供年、月、周、日、时、分、秒的信息,闰年的天数可自动调整。通过简单的串行接口就可与单片机通信。具体的参数和功能[7]如下:

(1)工作电压:2V~5.5V;

(2)时钟/RAM的读写数据通信方式:1~~31个字节的字符组; (3)采用双电源供电(备用电源和主电源); (4)只需3线接口便可实现通信; (5)31字节静态RAM;

(6)工作温度:-40°C~+85°C;

10

桂林电子科技大学毕业设计(论文)报告用纸 第11 页

(7)兼容TTL(VCC=5V);

DS1302的管脚配置图如3-9所示。

图3-9 DS1302管脚配置图

各个管脚功能如下: (1)VCC1:主电源接+5V;

(2)VCC2:备用电源,当VCC1>VCC2时,由主电源VCC1为DS1302供电,当VCC2>VCC1+O.2V时,则改为VCC2为DS1302供电;

(3)GND:接地;

(4)SCLK:串行时钟的输出,输入和输出数据的控制端口; (5)I/O:3线接口时的双向数据线;

(6)RST:复位引脚,输入驱动置高电平启动所有数据传输,两个功能:(1)可接控制逻辑,允许地址/命令序列进入移位寄存器;(2)为单字节或单字节传输提供终止方式;

(7)X1/X1:振荡源,外接32.768KHZ晶振。 1.DS1302的控制字节

每一数据传输都是通过一个控制字节开始的,控制字节的高7位必须为逻辑‘1’;6位为1表示存取RAM数据,为0时表示存取日历时钟数据,位5~1表示操作单元的地址;位0为1时表示读操作,为0时表示写操作;控制字节的输出都是从最低位开始的。控制字节如下图3-10所示。

图3-10 DS1302控制字节

2.DS1302的数据输入与输出

数据输入从最低位开始,当控制指令字节输入后的下一个SCLK时钟上升沿时,数据就写入了时钟芯片中。读取数据也是从最低位到最高位,在8位控制指令字节后面的下一个下升沿读出DS1302的数据。

3.DS1302的寄存器

11

桂林电子科技大学毕业设计(论文)报告用纸 第12 页

共有12个寄存器,其中与时钟、日历有关的有7个,数据都为以BCD码的形式存放。除此之外还有充电、控制、年份、时钟突发、与RAM相关等寄存器。 3.5 DS1302温度采集模块

在本设计中选择DS18B20温度传感器测量周围环境的温度,DS18B20的输出端口接STC89C53的P2.2接口,通过编写程序读度传感器所测量周围环境的温度,实现系统的测温功能。DS1302温度采集模块电路图如3-11所示。

图3-11 测温模块电路图

本设计中,系统大多在户外工作,接触的环境较复杂,对硬件的要求较高。DS18B20温度传感器是美国DALLAS公司生产的一款数字智能型温度传感器,不仅设计线路简单,而且不需要其他元器件就可实现测温。还具有价格低廉、硬件体积小、抗干扰力强和精确读度高等众多优点,完全符合本设计的硬软件上的要求。DS18B20和引脚如图3-12所示。

[8]

图3-12 DS1302和引脚

DS18B20主要参数指标[9]如下:

(1)单线接口,仅需一线就可与微处理器实现相互通信; (2)可测量温度范围:-50°C~~+125°C,固有误差1°C (3)多个DS18B20并联可实现多点测温;

12

桂林电子科技大学毕业设计(论文)报告用纸 第13 页

(4)工作电压:3.0V~5.5V; (5)具有唯一序列号;

(6)温度可选择9~12位数字量读出; (7)待机时零功耗;

(8)正负接反时,不会烧毁,但不能正常工作; DS18B20引脚功能如下: (1)GND:接地;

(2)DQ:输入/输出数据引脚,总线接口引脚,当使用寄生电源时,可为器件提供电源;

(3)VCC:电源,当工作在寄生电源时接地。

DS18B20可采用寄生电源和外部供电两种供电模式,本设计DS18B20采用的外部供电。DS18B20内部包含两个存储器,一个是8字节的高速暂存RANM,另外一个是非易失性可电擦除的EERAM。

DS18B20是1-Wire总线数字温度传感器,通信接口只有一个,当与主机对接的时候,主机可提供Read ROM ,Match ROM ,Search ROM , Skip ROM ,Alarm Search 5种ROM操作命令,可控制其中的操作命令指示DS18B20完成测温工作。表3-13是DS18B20的 ROM命令,表3-14 是DS18B20功能命令。

命令 表3-13 DS18B20的ROM命令 描述 协议 此命令发出后1-Wire总线上的活动 所有DS18B20向主机传送ROM码 DS18B20向主机传送一个ROM码 SEARCH ROM(搜索) READ ROM (读) MATCH ROM ( 符合) SKIP ROM (跳过) ALARM SEARCH (警告) 识别总线上挂着的全部DS18B20的ROM码 仅有一个DS 18B20挂着总线时,此命令用来读取ROM码 主机用ROM指定其中一个DS18B20,只有匹配才会相应 用于指定总线上的所有器件 与SEARCH ROM命令相似,只有温度超出警报线的DS18B20才会响应 F0h 33h 55h 主机向总线传送一个ROM码 CCh ECh 无 超出警报线的DS18B20向主机传送ROM码 13

桂林电子科技大学毕业设计(论文)报告用纸 第14 页

命令 表3-14 DS18B20功能命令 描述 协议 Convent T (温度变换) 开始温度转换 44h Read Scratchpad 读取暂存器全部(读暂存器) 的数据 Wire Scratchpad 向暂存器的2、3、(写暂存器) 4字节写入数据(TH、TL和精度) Copy Scratchpad 将TH、TL和配置(复制暂存器) 寄存器的数据复 制到EEROM Recall E2 将TH、TL和配置(重调 E2PRAM) 寄存器的数据从EEROM调用到暂存器中 Read Powe Supply 向主机表示其供(供电方式) 电状态

BEh 4Eh 48h 此命令发出后1-Wire总线上的活动 DS18B20向主机传送转换状态(不适用于寄生电源) DS18B20向主机传送9字节的数据 主机向DS18B20传送3字节的数据 无 B8h DS18B20向主机传送调用状态 B4h DS18B20向主机传送供电状态 另外,由于DS18B20单线通信功能是分时完成的,他有严格的时序概念。系统对DS18B20的各种操作必须按协议进行。操作协议为:初始化DS18B20(发复位脉冲)→发ROM功能命令→发存储器操作命令→处理数据。 3.6 LCD显示模块

本设计的显示模块选择的是LCD12864作为系统的显示屏[10],LCD12864有两种接口方式,一种是4为/8位并行,另一种是2线/3线或者多线串行。LCD12864的显示分辨率为128x64,内置8192个16*16点汉字和128个16*8点ASCLL字符,可显示8x4行16*16点阵的汉字。通过编写程序可显示本系统中速度、里程数、时间、日期、温度全部参数。LCD12864不仅接口方式灵活,操作指令方便简单,而且低电压、低功耗、价格低廉。完全满足本系统的需求。下图3-15为LCD12864显示模块的电路图。

14

桂林电子科技大学毕业设计(论文)报告用纸 第15 页

图3-15 LCD12864显示模块电路图

3.7 电机驱动模块

在本设计中,由电机驱动自制的车轮模仿自行车的车轮滚动。该模块中电机采用两节5号干电池(3V)作为供电电压。图3-16为电机驱动模块电路图。

图3-16电机驱动模块电路图

3.8 按键功能、供电和串口下载模块

本设计主要有两个功能按键:其一,当系统启动运行时,清零前面运行的数据,其二,当电机停止转动时,显示其总运行的里程数。按键功能模块电路图如3-17所示。

15

桂林电子科技大学毕业设计(论文)报告用纸 第16 页

图3-17按键功能模块电路

供电模块主要由发光二级管、电阻和拨动开关组成,该模块接入+5V电压时,可根据发光二极管的亮灭判断系统是否接通电源,并通过拨动开关控制系统电路是否接通。供电模块电路图如图3-18所示。

图3-18供电模块电路图

串口下载模块主要由MAX232芯片、DB9串口母头和电容组成,通过串口母头可与PC机对接下载程序,并支持对其硬软件在线调试。串口下载模块电路图如3-19所示。

16

桂林电子科技大学毕业设计(论文)报告用纸 第17 页

图3-19 串口下载模块电路图

MAX232芯片是MAXIM公司专为RS-232 标准串口设计的单电源电平转换芯片,因为一般的电脑串口电平在±10V,而单片机系统信号电压是TTL电平±5V,所以需要MAX232芯片对电脑串口电平进行转换。该器件主要由2个驱动器、2个接收器和一个电压发生器组成。MAX232芯片可完成TTL和EIA双向电平的转换。MAX232的引脚图如3-20所示。

图3-20 MAX232引脚图

各个引脚功能如下:

第一部分是电荷泵电路,由1、2、3、4、5、6脚和4个电容构成。功能是产生±12v两个电源,提供给RS-232串口电平的需要。

第二部分是数据转换通道,由7、8、9、10、11、12、13、14脚构成两个数据通道。其中13脚(R1IN)、12脚(R1OUT)、11脚(T1IN)、14脚(T1OUT)为第一数据通道。 8脚(R2IN)、9脚(R2OUT)、 10脚(T2IN)、7脚(T2OUT)为第二数据通道。 TTL/CMOS数据从T1IN、 T2IN输入转换成RS-232数据从T1OUT、 T2OUT送到电脑DB9插头;DB9插头的RS-232数据从R1IN、R2IN输入转换成TTL/CMOS数据后从R1OUT、R2OUT输出。

17

桂林电子科技大学毕业设计(论文)报告用纸 第18 页

第三部分是供电。15脚GND接地、16脚VCC接+5V。

本设计选用RE-232作为串行通信是因为其串行通信简单易控制,且I/O口少,成本低。符合本设计的各项要求。

4 软件设计

4.1 Keil uVision 4软件介绍

Keil C51是美国Keil software公司(ARM公司)出品的51系列兼容单片机C语言软件开发系统,C语言在功能、结构性、可读性、可维护性上比汇编语言更具有优势,因为易学易用,适合每个阶段的开发人员,不管专业的应用工程师,还是在校学习软件开发的学生。

Keil C51软件包含了丰富的库函数和功能强大的集成开发调试工具。C51工具包的整体结构,其中uVision与Ishell分别是C51 for Windows和for Dos的集成开发环境(IDE),可以完成编辑、编译、连接、调试、仿真等整个开发流程。开发人员可以将编辑好的C或汇编源文件分别有C51及A51编译器生成目标文件(.OBJ)。目标文件再由LIB51创建生成库文件,也可以与库文件一起经L51连接定位生成绝对目标文件(.ABS)。ABS文件由OH51转换成标准的Hex文件,以供调试器dScope51或tScope51使用进行源代码级调试,也可由仿真器使用直接对目标板进行调试,也可以直接写入程序存贮器如EPROM中[11]。

另外,只要看一下编译后生成的汇编代码,就能体会到Keil C51生成的目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解。在开发大型软件时更能体现高级语言的优势。

Keil uVision4是2011年3月ARM公司发布最新集成开发环境RealView MDK开发工具中集成了最新版本,其编译器、调试工具实现与ARM器件的最完美匹配。 4.2 程序设计思想与开发环境

在本设计中,软件系统采用模块化的编程方式,把整体程序分成若干部模块,每个模块具有相对的独立性,也可通过函数调用的发式相互关联。模块化的编程发式利于程序的调试、修改和维护,其思路清晰有条理,便于阅读,被各类开发人员广泛的使用。

本系统软件设计采用C语言编程,开发环境: PC操作系统Windows 7,单片机开发平台keil uVision 4,程序下载软件为STC_ISP_V483。

18

桂林电子科技大学毕业设计(论文)报告用纸 第19 页

4.3 主程序设计

在本设计中,软件根据设计的要求进行编写,要求将红外对管传感器、DS18B20温度传感器、DS1302时钟芯片所测得数据送进STC89C52单片中,再由其将速度、路程、温度、时间等参数送至LCD12864中显示。主程序工作流程如图4-1所示。

图4-1主程序流程图

4.4 各个模块程序设计

4.4.1 红外对管测速模块程序设计

当单片机获取从红外对管测速模块中产生的脉冲个数时,无法马上得出当前车轮的速度和里程,要经过单片机定时器的计算才能得出结果,本系统默认车轮的周长为1米,使用者可以自己设置车轮的大小。本系统通过单片机计算单位时间内接收脉冲的个数来得出速度,再将单位时间内的速度相加得到其路程数,系统计算时间为0.5秒计算一次。在Proteus仿真的结果与计算结果一致。下图4-2为测速子程序设计的流程图。

19

桂林电子科技大学毕业设计(论文)报告用纸 第20 页

图4-2 测速流程图

程序核心代码如下: if(flag)

{

flag = 0; TR0 = 0; EX0 = 0; Couter = 0;

//关闭定时器0 //关闭外部中断

//500ms显示一次速度

Speed = Couter/2; //一个脉冲等于25cm

//清零

bai=Speed/100; shi=Speed%100/10; ge=Speed%100%10; Write_Address(2,5); Write_Data(d[bai]); Write_Data(d[shi]); Write_Data(d[ge]);

20

桂林电子科技大学毕业设计(论文)报告用纸 第21 页

{

TR0=1; //打开定时器0

//打开外部中断

EX0 = 1;

}

if((Speed == 0)&(flag1 == 1)) //路程显示

void timer0(void) interrupt 1 //定时器0中断服务程序 TH0=(65536-50000)/256; TL0=(65536-50000)%256; num++; if(num==10) { }

void int0(void) interrupt 0 //外部中断0服务程序 {

Couter++; //计算速度 Couter1++; //计算路程

4.4.2 DS18B20温度测量模块程序设计

本设计采用DS1820温度传感器进行温度测量,并将其测得数据在LCD12864上显示,因为DS18B20只有一条数据输出线,所以一定要采用一位读取,读取到的温度值分别存入高/低八位寄存器中,显示时要将十六位进制数值转换成十进制。温度测量模块的程序流程如下图4-3所示。

EX0 = 0; num = 0; TR0 = 0; flag =1;

//清零计数

//关闭定时器0 //打开标志位

//定时500ms 显示一次速度

}

21

桂林电子科技大学毕业设计(论文)报告用纸 第22 页

图4-3温度测量模块程序流程图

温度测量模块程序核心代码如下:

bit Init_DS18B20(void) //函数功能:将DS18B20传感器初始化,读取应答信号 出口参数:flag

{

bit flag; DQ = 1;

for(time=0;time<2;time++) ; DQ = 0;

for(time=0;time<200;time++) ; DQ = 1;

for(time=0;time<10;time++) ; flag=DQ; for(time=0;time<200;time++) ; return (flag); }

unsigned char ReadOneChar(void) 节数据 出口参数:dat

{

//函数功能:从DS18B20读取一个字

22

桂林电子科技大学毕业设计(论文)报告用纸 第23 页

unsigned char i=0; unsigned char dat; for (i=0;i<8;i++) {

DQ =1; _nop_();

DQ = 0; _nop_(); DQ = 1;

for(time=0;time<2;time++) ; dat>>=1; if(DQ==1) dat|=0x80; else dat|=0x00;

for(time=0;time<8;time++) ; } return(dat); }

void WriteOneChar(unsigned char dat) 个字节数据 入口参数:dat

{

unsigned char i=0;

for (i=0; i<8; i++) { DQ =1; _nop_(); DQ=0; DQ=dat&0x01; for(time=0;time<10;time++) DQ=1; for(time=0;time<1;time++);

dat>>=1;

23

函数功能:向DS18B20写入一

// ; 桂林电子科技大学毕业设计(论文)报告用纸 第24 页

}

for(time=0;time<4;time++) ; 4.4.3 DS1302时钟芯片模块程序设计

本设计中采用DS1302作为系统的时钟芯片,DS1302芯片内置年、月、星期、日、时、分、秒寄存器,通过读取各个时间寄存器的数据并将其输入LCD。可显示当前的时间日期。DS1302时钟芯片模块程序设计流程图如4-4所示。

图4-4 时钟芯片模块程序流程图

DS1302时钟芯片模块程序核心代码如下:

void Init_DS1302(void) //函数功能: 1302进行初始化设置 {

unsigned char flag; flag= ReadSet1302(0x81);

if(flag&0x80) {

WriteSet1302(0x8E,0x00); WriteSet1302(0x80,((40/10)<<4|(40%10)));

WriteSet1302(0x82,((5/10)<<4|(5%10))); WriteSet1302(0x84,((0/10)<<4|(0%10)));

24

桂林电子科技大学毕业设计(论文)报告用纸 第25 页

}

WriteSet1302(0x86,((11/10)<<4|(11%10))); WriteSet1302(0x88,((3/10)<<4|(3%10))); WriteSet1302(0x8c,((14/10)<<4|(14%10))); WriteSet1302(0x90,0xa5); WriteSet1302(0x8E,0x80);

}

void DisplaySecond(unsigned char x) {

unsigned char i,j; }

void DisplayMinute(unsigned char x) {

unsigned char i,j; }

i=x/10; j=x%10;

Write_Address(1,2); Write_Data(digit1[i]); Write_Data(digit1[j]); delay(1); i=x/10; j=x%10;

Write_Address(1,4); Write_Data(digit1[i]); Write_Data(digit1[j]); delay(1);

//函数功能:显示秒

//函数功能:显示分钟

void DisplayHour(unsigned char x) //函数功能:显示小时 {

unsigned char i,j;

25

桂林电子科技大学毕业设计(论文)报告用纸 第26 页

}

i=x/10; j=x%10;

Write_Address(1,0); Write_Data(digit1[i]); Write_Data(digit1[j]); delay(1);

void DisplayDay(unsigned char x) //函数功能:显示日 {

unsigned char i,j; }

void DisplayMonth(unsigned char x) //函数功能:显示月 {

unsigned char i,j; }

void DisplayYear(unsigned char x) //函数功能:显示年 {

unsigned char i,j;

i=x/10; j=x%10; i=x/10; j=x%10;

Write_Address(0,2) ; Write_Data(digit1[i]); Write_Data(digit1[j]); delay(1); i=x/10; j=x%10;

Write_Address(0,4); Write_Data(digit1[i]); Write_Data(digit1[j]); delay(1);

26

桂林电子科技大学毕业设计(论文)报告用纸 第27 页

}

Write_Address(0,0); Write_Data(digit1[i]); Write_Data(digit1[j]); delay(1);

4.4.4 LCD12864显示模块程序设计

本设计采用LCD12864显示各个功能模块所测得数据,先在LCD上设置显示年、月、日、时、分、秒、T:、V:、路程:字符,然后在显示页面的指定位置输入各个功能模块的数据。LCD12864显示模块设计流程图如4-5所示。

图4-5 LCD显示模块设计流程图

LCD12864显示模块程序核心代码如下: unsigned char Strinr0[]={\" 年 月 日\unsigned char Strinr1[]={\" 时 分 秒\unsigned char Strinr2[]={\"T: ℃ V: \unsigned char Strinr3[]={\"路程 : \unsigned

Number[]={ '0','1','2','3','4','5','6','7','8','9','.'};

void WriteData_LCD12864 (unsigned char X,unsigned char Y,unsigned char Data) //函数功能:对LCD指定位置写入数据

{

27

char

桂林电子科技大学毕业设计(论文)报告用纸 第28 页

Write_Address(X,Y); delay(5); Write_Data(Data); delay(5); }

5 系统测试

5.1 硬件调试

硬件调试主要是为了保证系统硬件部分能正常工作,硬件调试主要分为 4大部分进行调试:(1)元器件是否能正常工作;(2)是否存在逻辑故障;(3)检测各个模块是否正常工作;(4)是否存在电源故障。以下是各个部分的调试工作。

(1)元器件是否能正常工作

造成元器件无法工作的的原因主要有两个:一个是在没有使用前就已经损坏了,另外一个就是对元器件安装错误造成烧坏。因此在购买元器件时要注意元器件的型号规格是否与设计要求一样,和其外形包装是否正常,还有就是对元器件进行检测,保证元器件能正常使用。另外还要注意在焊接元器件时,是否安装错误,若发现有错误,采用替换法排除此错误。

(2)是否存在逻辑故障

若产生逻辑故障,一般来说是是在设计和焊接的过程中的失误造成的,主要包括错线、短路、开路。排除此类故障的方法是首先焊接的电路板与原理图认真对照,检差两者是否一致。尤其是注意电源系统检查,以防止电源存在短路和极性错误的问题,重点检查系统总线是否存在相互短路或与其他信号线短路的问题,可用万用表检测电路是否存在短路问题。

(3) 检测各个模块是否正常工作

首先对显示器部分进行调试,将单片机与LCD显示器分离,在LCD的显示引脚加至规定的电平,看LCD的显示是否与理论一致,若不一致,一般为显示器接触不良所致。接着检查STC89C52单片机电路是否正常工作,可以对单片机进行编程调试,编程调试分两步骤,一是对其初始化,二是将其与LCD结合起来,借助开发机对其进行软件编程检测。若通过检测没有问题,则继续对DS18B20温度测量模块、DS1302时钟模块分别进行调试检测。

(4)是否存在电源故障

在通电前,必须要检查电源电压的幅值和极性,否则容易损坏元器件。加电

28

桂林电子科技大学毕业设计(论文)报告用纸 第29 页

后检查各插件上的引脚电位,首先检查VCC和GND之间的电位,若在4.8V~5V间是属于正常范围。 5.2 软件调试

对系统的软件调试主要通过在Protues软件上进行仿真,首先对各个模块的系统功能进行程序编程,再对程序进行检测,直到程序能完成系统的功能,各个模块功能能正常工作。然后在Protues上仿真,直到仿真系统能正常,便可将编程好的程序通过STC-ISP下载工具烧录进单片机。 5.3 对实际电路进行测试

本设计的硬件实物分成两大部分,一个是数据处理显示部分,一个是测速部分,如下图5-1所示。

图5-1硬件实物

实物测试流程:

1.在单片机系统部分(上图左)接5V电源,电机测速部分(上图右)接3V电源;

2.拨动单片机系统和电机开关键,系统开始工作,LCD显示出当前电机运行的速度、温度和时间日期。如图5-2所示。

3.关闭电机电源,按下系统路程显示键(P1.3),LCD显示电机运行的路程、

29

桂林电子科技大学毕业设计(论文)报告用纸 第30 页

温度和时间日期。如图5-3所示

图5-2 LCD显示速度

图5-3 LCD显示路程

通过以上测试,可知道本设计的系统可测量电机车轮转速和路程,还可以显示当前的温度和时间日期,基本达到了本设计对系统的要求

30

桂林电子科技大学毕业设计(论文)报告用纸 第31 页

6 总结

本次设计的自行车测速系统以STC89C52单片机为核心,利用硬软件的结合实现系统测速、计算里程、显示温度和时间日期的功能。系统的设计和制作都已经全部完成,基本上达到了设计预期的目标。但是由于时间仓促和条件有限,设计还是存在一些缺陷,如测速和路程不能同时显示、系统抗干扰能力弱、不够人性化等等,这些让我明白知识的海洋是无穷无尽的,需要我们不断学习。

本次设计从选题到制作完成经历差不多半年的时间,这主要包括以下几个过程:选题、查阅相关文献资料、确定设计思路和方案、设计制板和焊接、软件设计、系统测试。这些过程都是紧密结合的,每一步都有紧密的关联,缺一不可。

在这次设计的过程中,我发现平时在许多课程想学到的知识,都可以运用到本次设计上,这让我对所学的专业知识进行一次复习和融会贯通,也让我明白在校学习的知识重要性。这次的设计制造不仅让我懂得如何运用所学知识,还锻炼自己独立思考能力和动手能力,这些都为我积累了许多宝贵的经验,为我以后的学习工作打下坚实的基础。

31

桂林电子科技大学毕业设计(论文)报告用纸 第32 页

致 谢

本次设计从选题到完成经历了半年多的时间,设计的成功完成不仅有自己心血付出,还有老师、同学和家人的大力支持。我的指导老师武小年老师从选题到制作过程中,都给了我许多帮助,在他悉心指导下,我的毕业设计才能按进度合理的完成,在我遇到困难时能寄予及时的帮助和鼓励。

衷心感谢我的指导老师,武老师渊博的知识、丰富的科研经验、严肃的科学精神和严谨的治学精神都让我受益匪浅,让我在学习知识的过程中明白了许多做人的道理,在毕业设计完成之际,在此谨向武老师致以诚挚的谢意和崇高的敬意。

衷心感谢学校为我们提供良好的学习环境和丰富的教学资源。感谢教导我们的各科老师,感谢4年来他们对我们的栽培,感谢同学舍友的大力支持,感谢你们的帮助和鼓励。

衷心感谢我的家人,谢谢他们多年的养育之恩,是他们让我有学习的机会,他们的期望和鼓励让我的人生不断进步的动力。感谢在我求学路上所有关心我的人,谢谢你们的支持。

最后,对所有评阅此论文的老师、教授表示感谢!

32

桂林电子科技大学毕业设计(论文)报告用纸 第33 页

参考文献:

[1] 月影狂风. 自行车[EB/OL].

http://baike.baidu.com/view/6328.htm?fr=aladdin 2014-5-1 [2]汪道辉. 单片机系统设计与实践[M]. 北京: 电子工业出版社, 2006,5

[3]V. Yu. Teplov,A. V. Anisimov. Thermostatting System Using a Single-Chip Microcomputer a nd Thermoelectric Modules Based on the Peltier Effect[J] ,2002

[4] Meehan Joanne,Muir Lindsey.SCM in Merseyside SMEs:Benefits and barriers[J].. TQM [5]sumnerss1989. STC89C52RC用户使用手册[EB/OL].

http://wenku.baidu.com/view/6edcbad0195f312b3169a5c3.html 2014-5-7 [6] phjryp. 测速仪[EB/OL].

http://www.doc88.com/p-291182781113.html 2014-5-7

[7]黄明强.DS1302在单片机系统中的应用[N].保定师范专科学校学报.2004 [8] 天山晴雪wyj.DS18B20工作原理[EB/OL].

http://wenku.baidu.com/view/0dd2f163ddccda38376baff0.html 2014-5-7 [9]曹海平.基于单片机和DS18B20的分布式多点温度检测系统的设计[D].自动化技术与应用.27(11):90-93 2008

[10]李金群.基于51单片机的12864液晶图文显示研究[J].机电信息.2010.36

[11]陈朝大.李杏彩.单片机原理与应用—基于Keil C和虚拟仿真技术[M].北京.化工工业出版社.2013.23-35

33

桂林电子科技大学毕业设计(论文)报告用纸 第34 页

附 录

主设计程序:

//自行车测速驱动 C51版本 //Programmer:Steve Lee //coyp @Lee

//Caution: Do not privately modify the program, //pleaserespect the programmers sweat, thank you //2014.3.11

//***************************************************** #include\"reg52.h\" #include\"lcd12864.h\" #include\"ds1302.h\" #include\"ds18b20.h\" #include\"intrins.h\"

sbit Display = P1^3; //显示路程控制端

sbit Clear = P1^5; //清除屏幕显示的路程信息 sbit Count = P3^2; //外部中断管脚,计脉冲数

unsigned int num=0,Speed=0;

unsigned char bai=0,shi=0,ge=0,i=0,j=0,k=0,l=0,m=0; unsigned int num;

//定时器计数

long Couter=0,Couter1=0,S=0; // Couter脉冲数用于计算速度,Couter1脉冲数用于计算路程

bit flag=0,flag1=0;

void main() //主函数 {

TMOD = 0x01; //设置定时器0工作模式1 TH0 = (65536-45872)/256; //定时器赋初值50ms TL0 = (65536-45872)%256; EA = 1; //开启总中断

34

//标志位

unsigned char code d[10]={\"0123456789\定义字符数组显示数字

桂林电子科技大学毕业设计(论文)报告用纸 第35 页

ET0 = 1; //打开定时器0中断 EX0 = 1; //打开外部中0 TR0 = 1; //转动启定时器 IT0 = 1; //边沿触发 Lcd_Int(); //液晶初始化 Init_DS1302(); while(1) {

Display_DS18B20(); //显示温度 Display_Data(); //显示时间

//DS1302初始化

if(Display == 0) //路程显示与否标志位控制

{

delay(1); if(Display == 0)

{

flag1 = 1;

while(!Display); }

} {

if(Clear == 0)

delay(1);

//清除路程显示信息

if(Clear == 0)

{

Write_Address(3,3); Write_Data(d[0]); Write_Data('.'); Write_Data(d[0]); Write_Data(d[0]); Write_Data(d[0]);

while(!Clear);

35

桂林电子科技大学毕业设计(论文)报告用纸 第36 页

}

} {

if(flag) //500ms显示一次速度

flag = 0; TR0 = 0; EX0 = 0; Couter = 0;

//关闭定时器0 //关闭外部中断

Speed = Couter/2; //一个脉冲等于25cm

//清零

bai=Speed/100; shi=Speed%100/10; ge=Speed%100%10; Write_Address(2,5); Write_Data(d[bai]); Write_Data(d[shi]); Write_Data(d[ge]); TR0=1;

//打开定时器0

//打开外部中断

EX0 = 1;

}

if((Speed == 0)&(flag1 == 1)) //路程显示 {

if((Couter1/4)>9999)

{

Write_Address(3,3); Write_Data('e'); Write_Data('r'); Write_Data('r');

Write_Data('o'); Write_Data('r'); Couter1 = 0; flag1=0;

} else

{

36

桂林电子科技大学毕业设计(论文)报告用纸 第37 页

}

}

i = Couter1/4/1000;

j = Couter1/4%1000/100;

l = Couter1/4%1000%100%10; Write_Address(3,3); Write_Data(d[i]); Write_Data('.'); Write_Data(d[j]); Write_Data(d[k]); Write_Data(d[l]); Couter1 = 0; flag1=0; }

k = Couter1/4%1000%100/10;

}

void timer0(void) interrupt 1 //定时器0中断服务程序 { }

void int0(void) interrupt 0 //外部中断0服务程序 {

37

TH0=(65536-50000)/256; TL0=(65536-50000)%256; num++; if(num==10) {

EX0 = 0; num = 0; TR0 = 0; flag =1;

//清零计数

//关闭定时器0 //打开标志位

//定时500ms 显示一次速度

}

桂林电子科技大学毕业设计(论文)报告用纸 第38 页

}

Couter++; //计算速度 Couter1++; //计算路程

DS18B20模块程序: #include\"ds18b20.h\" #include\"reg52.h\" #include\"intrins.h\" #include\"lcd12864.h\" unsigned 组显示数字

unsigned char tltemp;

sbit DQ=P2^2; //DS18B20数据管脚

bit Init_DS18B20(void) //函数功能:将DS18B20传感器初始化,读取应答信号 出口参数:flag

{ }

unsigned char ReadOneChar(void)

38

char code

digit[10]={'0','1','2','3','4','5','6','7','8','9'}; //定义字符数

//临时暂存变量

unsigned char time;

bit flag; DQ = 1;

for(time=0;time<2;time++) ; DQ = 0;

for(time=0;time<200;time++) ; DQ = 1;

for(time=0;time<10;time++) ; flag=DQ; for(time=0;time<200;time++) ; return (flag);

//函数功能:从DS18B20读取一个

桂林电子科技大学毕业设计(论文)报告用纸 第39 页

字节数据 出口参数:dat

{

unsigned char i=0; unsigned char dat; for (i=0;i<8;i++) {

DQ =1; _nop_();

DQ = 0; _nop_(); DQ = 1;

for(time=0;time<2;time++) ; dat>>=1; if(DQ==1) dat|=0x80; else dat|=0x00;

for(time=0;time<8;time++) ; } return(dat);

}

void WriteOneChar(unsigned char dat) 一个字节数据 入口参数:dat

{ unsigned char i=0; for (i=0; i<8; i++) { DQ =1; _nop_(); DQ=0; DQ=dat&0x01; for(time=0;time<10;time++)

DQ=1;

39

函数功能:向

DS18B20写入 //

; 桂林电子科技大学毕业设计(论文)报告用纸 第40 页

}

for(time=0;time<1;time++); dat>>=1;

}

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

// 函数功能:做好读温度的准备

void ReadyReadTemp(void) {

Init_DS18B20(); }

void display_temp1(unsigned char x) 分 入口参数:x

{ }

void Display_DS18B20(void) //函数功能:温度显示 {

unsigned int TL; unsigned int TH; unsigned int TN;

40

WriteOneChar(0xCC); WriteOneChar(0x44); Init_DS18B20(); WriteOneChar(0xCC); WriteOneChar(0xBE);

delay(200);

//函数功能:显示温度的整数部

unsigned char shi,ge; shi=x/10;

ge=x%10; Write_Address(2,1); Write_Data(digit[ge]); delay(1);

Write_Data(digit[shi]);

桂林电子科技大学毕业设计(论文)报告用纸 第41 页

}

delay(1);

ReadyReadTemp(); TH=ReadOneChar(); TN=TH*16+TL/16;

display_temp1(TN); delay(1);

{

TL=ReadOneChar();

}

DS1302时钟模块程序: #include\"ds1302.h\" #include\"reg52.h\" #include\"lcd12864.h\" #include\"intrins.h\"

sbit SCLK=P2^3; //位定义1302芯片的接口,时钟输出端口 sbit DATA=P2^4; //位定义1302芯片的接口,数据输出端定 sbit RST=P2^5; //位定义1302芯片的接口,复位端口

unsigned char code digit1[10]={\"0123456789\定义字符数组显示数字

void Write1302(unsigned char dat) //函数功能:向1302写一个字节数据 低位在前,高位在后 Eg;0000 0001 写入后变成 1000 0000

{

unsigned char i; SCLK=0; _nop_(); _nop_();

for(i=0;i<8;i++) {

DATA=dat&0x01;

41

桂林电子科技大学毕业设计(论文)报告用纸 第42 页

}

_nop_(); _nop_(); SCLK=1; _nop_(); _nop_(); SCLK=0; dat>>=1;

}

void WriteSet1302(unsigned char Cmd,unsigned char dat) //函数功能:根据命令字,向1302写一个字节数据 入口参数:Cmd,储存命令字;dat,储存待写的数据

{

RST=0; SCLK=0; }

unsigned char Read1302(void) //函数功能:从1302读一个字节数据 {

unsigned char i,dat; _nop_(); _nop_(); for(i=0;i<8;i++)

{

dat>>=1;

42

RST=1; _nop_();

_nop_(); Write1302(Cmd); Write1302(dat); SCLK=1; RST=0;

桂林电子科技大学毕业设计(论文)报告用纸 第43 页

if(DATA==1) dat|=0x80; SCLK=1; _nop_(); _nop_(); SCLK=0; _nop_(); _nop_();

}

return dat;

}

unsigned char ReadSet1302(unsigned char Cmd) //函数功能:根据命令字,从1302读取一个字节数据

{ }

void Init_DS1302(void) //函数功能: 1302进行初始化设置 {

unsigned char flag; flag= ReadSet1302(0x81);

if(flag&0x80) {

WriteSet1302(0x8E,0x00); WriteSet1302(0x80,((40/10)<<4|(40%10)));

43

unsigned char dat; RST=0; SCLK=0; RST=1; Write1302(Cmd); dat=Read1302(); SCLK=1; RST=0; return dat;

桂林电子科技大学毕业设计(论文)报告用纸 第44 页

}

WriteSet1302(0x82,((5/10)<<4|(5%10))); WriteSet1302(0x84,((0/10)<<4|(0%10))); WriteSet1302(0x86,((11/10)<<4|(11%10))); WriteSet1302(0x88,((3/10)<<4|(3%10))); WriteSet1302(0x8c,((14/10)<<4|(14%10))); WriteSet1302(0x90,0xa5); WriteSet1302(0x8E,0x80);

}

//函数功能:显示秒

void DisplaySecond(unsigned char x) { }

void DisplayMinute(unsigned char x) { }

unsigned char i,j;

i=x/10; j=x%10;

Write_Address(1,2); Write_Data(digit1[i]); Write_Data(digit1[j]); delay(1); unsigned char i,j;

i=x/10; j=x%10;

Write_Address(1,4); Write_Data(digit1[i]); Write_Data(digit1[j]); delay(1);

//函数功能:显示分钟

void DisplayHour(unsigned char x) //函数功能:显示小时 {

44

桂林电子科技大学毕业设计(论文)报告用纸 第45 页

}

unsigned char i,j;

i=x/10; j=x%10;

Write_Address(1,0); Write_Data(digit1[i]); Write_Data(digit1[j]); delay(1);

void DisplayDay(unsigned char x) //函数功能:显示日 { }

void DisplayMonth(unsigned char x) //函数功能:显示月 { }

void DisplayYear(unsigned char x) //函数功能:显示年 {

unsigned char i,j;

45

unsigned char i,j;

i=x/10; j=x%10;

Write_Address(0,4); Write_Data(digit1[i]); Write_Data(digit1[j]); delay(1);

unsigned char i,j;

i=x/10; j=x%10;

Write_Address(0,2) ; Write_Data(digit1[i]); Write_Data(digit1[j]); delay(1);

桂林电子科技大学毕业设计(论文)报告用纸 第46 页

}

i=x/10; j=x%10;

Write_Address(0,0); Write_Data(digit1[i]); Write_Data(digit1[j]); delay(1);

void Display_Data(void) //函数功能:显示日期 {

unsigned char second,minute,hour,day,month,year; unsigned char ReadValue; {

ReadValue = ReadSet1302(0x81); DisplaySecond(second); ReadValue = ReadSet1302(0x83); DisplayMinute(minute);

second=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);

minute=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); ReadValue = ReadSet1302(0x85);

hour=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);

DisplayHour(hour); ReadValue = ReadSet1302(0x87);

day=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); }

DisplayDay(day); ReadValue = ReadSet1302(0x89); DisplayMonth(month); ReadValue = ReadSet1302(0x8d); DisplayYear(year);

month=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);

year=((ReadValue&0xf0)>>4)*10 + (ReadValue&0x0F);

}

46

桂林电子科技大学毕业设计(论文)报告用纸 第47 页

LCD12864显示模块程序: #include\"lcd12864.h\" #include\"reg52.h\" //#include\"key.h\"

#define LCD_DATA P0 sbit LCD_RS = P1^0; sbit LCD_RW = P1^1; sbit LCD_EN = P1^2; sbit LCD_PSB = P2^7; sbit LCD_RST = P2^6;

unsigned char Strinr0[]={\" 年 月 日\

unsigned char Strinr1[]={\" 时 分 秒\unsigned char Strinr2[]={\"T: ℃ V: \unsigned char Strinr3[]={\"路程 : \

unsigned

Number[]={ '0','1','2','3','4','5','6','7','8','9','.'};

void delay1ms() //函数功能:延时1毫秒 {

unsigned char i,j;

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

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

}

void delay(unsigned int n)//函数功能:延时n毫秒 { unsigned int i;

for(i=0;i}

47

char

桂林电子科技大学毕业设计(论文)报告用纸 第48 页

void Write_Com (unsigned char Com) //函数功能:写指令数据到液晶

RS=0 RW=0 E=高脉冲 { }

void Write_Data(unsigned char Data) //函数功能:将数据写入液晶模块 RS=1 RW=0 E=高脉冲

{

LCD_RS = 1; }

void Write_Address(unsigned char X,unsigned char Y) // 函数功能:设定显示位置

{

unsigned char Pos;

if(X == 0) X = 0X80; else if(X == 1) X = 0X90;

48

LCD_RS = 0; LCD_RW = 0; LCD_EN = 0; P0 = Com; delay(1); LCD_EN = 1; delay(1); LCD_EN = 0;

LCD_RW = 0; LCD_EN = 0; P0 = Data; delay(1); LCD_EN = 1; delay(1); LCD_EN = 0;

桂林电子科技大学毕业设计(论文)报告用纸 第49 页

}

else if(X == 2) X = 0X88; else if(X == 3) X = 0X98; Pos = X+Y;

Write_Com (Pos);

void Lcd_Int() {

//函数功能:对LCD的显示模式进行初始化设置

unsigned char i; LCD_PSB = 1; LCD_RST = 1;

Write_Address(0,0); //将初始化数据写入液晶 while(Strinr0[i]!= 0)

{

Write_Data(Strinr0[i]) ; i++; }

i = 0;

Write_Com (0X38);

delay(5); delay(5); Write_Com (0X0C); Write_Com (0X01); delay(5);

Write_Address(1,0); i = 0;

while(Strinr1[i]!= 0)

{

Write_Data(Strinr1[i]) ; i++; }

49

桂林电子科技大学毕业设计(论文)报告用纸 第50 页

Write_Address(2,0); i = 0; while(Strinr2[i] != '\\0') {

}

Write_Data(Strinr2[i]); i++;

Write_Address(3,0); i = 0; while(Strinr3[i] != '\\0') {

}

Write_Data(Strinr3[i]); i++;

Write_Address(2,5); Write_Data( Number[0]);

Write_Data( Number[0]); Write_Data( Number[0]); Write_Data('m'); Write_Data('/'); Write_Data('s'); Write_Address(3,6);

Write_Data('K'); Write_Data('m'); }

void WriteData_LCD12864 (unsigned char X,unsigned char Y,unsigned char Data) //函数功能:对LCD指定位置写入数据

{

Write_Address(X,Y); delay(5); Write_Data(Data); delay(5); }

50

因篇幅问题不能全部显示,请点此查看更多更全内容