您好,欢迎来到步遥情感网。
搜索
您的当前位置:首页基于单片机的转速测量系统设计讲解

基于单片机的转速测量系统设计讲解

来源:步遥情感网
基于单片机的霍尔测速报警系统的设计

摘要

转速作为工程中应用的一个非常广泛的参数,它的测量方法有很多,而模拟量的采集和模拟处理一直是转速测量的主要方法,这种测量方法已不能适应现代科技发展的要求,在测量范围以及测量精度上,已不能满足大多数系统的使用。随着大规模及超大规模集成电路技术的迅速发展,数字系统测量得到普遍应用,特别是单片机对脉冲数字信号的强大处理能力,使得全数字测量系统越来越普及,其转速测量系统也可以用全数字化处理。

本设计属于码盘转速测量系统,用来测量来自于外部的不同的转速值。实现转速的实时测量和显示。本系统以ATC51单片机为核心,旋转编码器实时轴转速测量,同时用八位串行段码式LCD数码管显示模块显示。旋转编码器输出电压为4.25V,8位二进制自然码送入单片机处理后经过计算处理,再查表转换为10进制数,送LCD模块显示。

本文从转速测量原理入手,详细阐述了转速测量系统的工作过程,以及硬件电路的设计、显示效果。本文吸收了硬件软件化的思想,实现了题目要求的功能。

关键词:转速测量, 旋转编码器,单片机, LCD显示模块

ABSTRACT

Speed is a very wide range of engineering applications one parameter , the measurement method more, and collection and processing of analog simulation has been the main method of speed measurement , this measurement method can not meet the requirements of modern technology , the measurement range and the measurement accuracy, can not meet with most systems. With the scale and development of VLSI technology, digital systems have been widely used to measure , especially for single-chip digital signal processing power pulse , so that the increasing popularity of digital measuring system , the speed measurement system can also be used the whole digital processing .

The design for the code wheel speed measurement system for measuring the speed of different value from the outside. Achieve real-time measurement speed display . Specific applications AT80C51 microcontroller as the core , rotary encoder shaft speed real-time measurement , while eight serial code segment LCD display module displays . Rotary encoder output 4.25V, 8 -bit binary code into the microcontroller processing natural treatment has been calculated , and then converted to a decimal number look-up table , sending the LCD module .

In this paper, starting from the speed measurement principle , elaborated on the work process speed measurement systems, and hardware design , display effect. This article has absorbed the idea of hardware and software to achieve the requirements of the subject function.

Keywords: speed measurement, rotary encoder, microcontroller, LCD display module

1绪论

1.1转速测量技术简介

转速测量是利用相关精密仪器测量运动物体的角位移的一种测量方法,常用的测量仪器为测量角位移的数字编码器和光电轴编码器,因其具有分辨率强、测量精度高和工作可靠等特点,被广泛用于测速系统中。

随着科学技术的发展,各种各样的转速测量仪不断出现。它们的结构不同,性能也各异。迄今为止也没有系统的分类方法,在这里只按测量原理以及主要元件性质进行分类和说明。按照测量原理主要可以分为测频法、测周法两种基本的方法,以此提高测量精度。由于电子计数器所特有的±1个数的误差的存在,应根据转速脉冲频率的大小来恰当选择对应的测量方法。所谓测频法,就是测量转速脉冲频率的方法,它是以基准时间信号发生电路的脉冲来相应控制计数门的开闭,在单位时间内,对来自转速传感器的脉冲进行计数。所谓测周法,就是测量转速脉冲周期的方法。它用传感器的脉冲来控制计数门的开闭,在转速脉冲周期内对基准时间信号发生电路的脉冲进行计数,然后按f=1/T公式换算成转速脉冲的频率。转速测量的方法见表1-1所示:

表1-1 各种测量方法得比较

目前按现有产品的主要构成元件分类,可分为晶体管式、集成电路式和单片

机式。晶体管式所采用的元件主要是晶体管,有的晶体管式转速测量仪设有记忆电路,其数码管无闪烁现象,显示效果较好,而且测量速度较高。顾名思义集成电路式转速测量仪,所采用的元件是集成电路元件。由于集成电路具有重量轻、体积小、功耗小等优点,而且集成电路元件内设有显示电路,这使得转速测量仪实现小型化。单片机的出现使得这种仪表的设计变得更加灵活。

1.2转速测量在国内外的研究

转速是能源设备与动力机械性能测试中的一个重要的特性参量,因为动力机 械的许多特性参数是根据它们与转速的函数关系来确定的,例如压缩机的排气量、轴功率、内燃机的输出功率等等,而且动力机械的振动、管道气流脉动、各 种工作零件的磨损状态等都与转速密切相关。转速测量的方法很多,测量仪表的型式也多种多样,其使用条件和测量精度也各不相同。根据转速测量的工作方式可分为两大类:接触式转速测量仪表与非接触式转速测量仪表。前者在使用时必须与被测转轴直接接触,如离心式转速表、磁性转速表与测速发电机等;后者在使用时不需要与被测转轴接触,如光电式转速表、电子数字式转速表、闪光测速仪等。测量发动机转速的传统方法是使用光电式转速表测量。用这种方法测量时,既要在发动机转动轴上粘贴光标纸,又要求测量人员把转速表与光标纸的距离控制在很近的范围,测量十分不方便。随着科学技术的迅速发展,转速测量仪表已步入现代化、电子化的行列。过去曾经使用过的接触式测量仪表,如离心式转速表、磁性转速表、微型发电机转速表及钟表是定时转速表,均已先后受到冷落;而利用已知频率的闪光与被测轴转速同步的方法来测速的闪光测速仪,虽属非接触式仪表,目前仍有应用,但也退居次要地位。代之而起的是非接触式的电子与数字化的测速仪表。这类转速仪表大多具有体积小、重量轻、读数准确、使用方便等优点,容易实现电脑荧屏显示和打印输出,能够连续的反映转速变化,既能测定发动机稳定情况下的平均转速,也能够用来在足够小的时间间隔这一特定条件下测定发动机的瞬时转速。

转速测量的应用系统在工业生产、科技教育、民用电器等各领域的应用极为 广泛,往往成为某一产品或控制系统的核心部分,其各种参数在不同的应用中有其侧重,但转速测量系统作为普遍的应用在国民经济发展中,有重要的意义。

1.3 课题研究的目的与意义

在工程测量中,转速作为一个常用的参数,其测量方法很多,而转速测量的主要方法是模拟量的采集和模拟处理,这种测量方法已不能满足现代科技发展的要求,同时,在测量范围和测量精度上,已不能满足大多数系统的使用。随着大规模集成电路技术的发展,数字测量系统开始得到普遍的应用,尤其是单片机对脉冲数字信号的强大处理能力,这种能力使得全数字测量系统的普及越来越广泛,其转速测量系统也可用全数字化处理。在测量范围和测量精度方面都有极大的提高。因此,本课题的目的是:对各种测量转速的基本方法予以分析,针对不同的应用环境,利用单片机设计一种全数字化测速系统,从提高测量精度的角度出发,分析讨论其产生误差的可能原因,为今后的实际使用提供借鉴。并从实际硬件电路出发,分析电路工作原理和软件流程,根据仿真情况提出修改方案和解决办法。本课题以单片机为中心,设计的全数字化测量转速系统,在工业控制和民用电器中都有较高使用价值。其可以应用于工业控制中的某一部分,如数控车床的电机转速检测和控制、水泵流量控制以及需要利用转速检测来进行控制的许多场合。如车辆的里程表、车速表等。其次该转速测量系统由于采用全数字化结构,因而可以很方便的和工业控制计算机进行连接,实行远程管理和控制,进一步提高现代化水平。并且,几乎不需做很大改变直接就能作为单独的使用产品。因此,转速测量系统的研究是一件非常有意义的课题。

2基于单片机的转速测量原理

2.1测量原理

针对测量原理而言,可以将这些原理分为三大类,第一类就是类似于测量频率,即在单位时间里测量物体旋转的角度,通过相应计算得到相应的速度,比如在单位时间内累计传感器发出脉冲数量N即为该单位时间的速度,这种以测

量频率的方法来确定转速的方法叫测频法,也称作M法,第二类是在一定的角位移距离内,通过测量通过这一角位移的时间来进行测速的方法,称测周法,也叫“T”法。这两种测速方法各有优点和缺点,,在转速较低时,测量误差较大,而且,检测装置对转速分辨能力也变差,因此,“M”法一般用于高速测量系统中; “T”法则与“M”法相反,一般用于低速测量,速度越低测量精度越高,但在测量高转速时,误差较大;结合这两种测量方法就可以推出第三种测量方法,即‘M/T’法,这种方法结合这两种方法的优点,一方面类似于“M”法那样在对传感器发出的脉冲计数的同时,也像“T”法那样计取脉冲的时间,通过计算即可得出转速值。

2.2单片机测量转速基本方法

简单的测速系统一般由以下几个部分构成,如图2-1

图2-1转速测量框图

1 信号的拾取

这个部分包括三个环节,第一环节,通过敏感原件拾取被测信号,由于敏感元件体积小,可以根据用户和环境的要求做成各种形状的探头,敏感元件能将被测的物理量转换成电流、电压等信号,只需设计相应的电路即可。第二环节,就是专业人员将敏感元件和相应的测量电路和传递机构通过合适的形式做成不同的类型和不同功能的传感器,根据相关原理输出电量,该电量可以是模拟量或数字量,现代传感器还可以输出开关量,用于数字逻辑电路。第三环节,通过测量仪表拾取被测信号,通用的转速测量系统大都采用一种俗称“码盘”的传感装置,将圆形的码盘固定在转轴上,码盘上有若干规则排列的小孔,用光电偶来输

出电信号,以反映转速对应关系,即是将转轴的速度以脉冲形式反映出来,通常有两种形式:

1)模拟量量化后经A/D转换,由数字量反映角度,供单片机计算处理,得出转速。 2)直接由脉冲来反应转轴的角度,用每转产生的脉冲经单片机处理得出转速。 2.整形和倍频

由于传感器接受到的信号都是比较微弱的,此外,外部信号的接受频率各不相同,单片机无法接受到相应的信号,此时,必须对采集到的电流或者电压信号进行放大,整形和倍频就是利用集成电路的放大电路对信号进行放大,另外,有些采集的信号可能会对其他测量信号产生干扰,整形和倍频电路中可以对信号进行滤波,从而让单片机接收到需要检测的信号。 3单片机

单片机是整个系统的核心部件,对整个测试系统进行控制处理。关于此系统的单片机介绍见后文。 4显示接口

单片机将接收到的信号经过相应处理后,对信号进行显示,把测量数据经过编码后显示到显示屏上。另外,单片机经过处理后的信号属于数字信号,数字信号是无法显示到显示设备上到,因此,要设计D/A转换电路,将单片机发出来的信号经过相应处理,然后经过驱动电路,显示到数码管上面。

超大规模集成电路技术的发展和提高,使得单片机的应用技术越来越广泛,也使得其功能越来越强大,价格越来越低廉,使得全数字化测量转度系统得到广泛的应用。同时,由于单片机在测量转速方面具有体积小、性能强、成本低的特点,它也越来越受到企业用户们的青睐。对测量转速系统的硬件和编程进行研究,在此设计出一种以单片机为主的转速测量系统,从而保证了测量精度。

2.3转速信号采集

1传感器的选择

霍尔传感器是对磁敏感的传感元件,由磁钢、霍耳元件等组成。测量系统的转速传感器选用SiKO的NJK-8002D的霍尔传感器,其响应频率为100KHz ,额定电压为5-30(V)、检测距离为10(mm)。其在大电流磁场或磁钢磁场的

作用下,能测量高频、工频、直流等各种波形电流。该传感器具有测量精度高、电压范围宽、功耗小、输出功率大等优点,广泛应用在高速计数、测频率、测转速等领域。输出电压4~25V,直流电源要有足够的滤波电容,测量极性为N 极。安装时将一非磁性圆盘固定在电动机的转轴上,将磁钢粘贴在圆盘边缘,磁钢采用永久磁铁,其磁力较强,霍尔元件固定在距圆盘1-10mm处。当磁钢与霍尔元件相对位置发生变化时,通过霍尔元件感磁面的磁场强度就会发生变化。 圆盘转动,磁钢靠近霍尔元件,穿过霍尔元件的磁场较强,霍尔元件输出低电平;当磁场减弱时,输出高电平,从而使得在圆盘转动过程中,霍尔元件输出连续脉冲信号。这种传感器不怕灰尘、油污,在工业现场应用广泛。

本系统采用开关型霍尔传感器A3144以及磁钢,由它们来检测电机的转速。工作方式为:将磁钢安装在电机的转轴上,而霍尔传感器则放在转轴的旁边,霍尔传感器连接在电路中,当磁钢随转轴经过霍尔传感器时,由开关型霍尔传感器的工作原理知,此时将输出一个低电平信号;而当磁钢离开霍尔传感器后,又将输出一个高电平。这样通过高低电平的转换,将其送入单片机后就可以测量它的转速。

霍尔传感器的外形图和与磁场的作用关系如图2-2所示。磁场由磁钢提供,所以霍尔传感器和磁钢需要配对使用。

图2-2 霍尔传感器及其磁钢外形图

霍尔传感器连线图如图2-3所示

图2-3 霍尔传感器连线图

霍尔传感器的电子特性如图2-4所示

图2-4霍尔传感器的电子特性

2.4霍尔传感器的测量原理

霍尔转速传感器在测量机械设备的转速时,被测量机械的金属齿轮、齿条等运动部件会经过传感器的前端,引起磁场的相应变化,当运动部件穿过霍尔元件产生磁力线较为分散的区域时,磁场相对较弱,而穿过产生磁力线较为几种的区域时,磁场就相对较强。霍尔转速传感器就是通过磁力线密度的变化,在磁力线穿过传感器上的感应元件时,产生霍尔电势。霍尔转速传感器的霍尔元件在产生霍尔电势后,会将其转换为交变电信号,最后传感器的内置电路会将信号调整和放大,输出矩形脉冲信号。霍尔转速传感器的测量方法霍尔转速传感器的测量必须配合磁场的变化,因此在霍尔转速传感器测量非铁磁材质的设备时,需要事先在旋转物体上安装专门的磁铁物质,用以改变传感器周围的磁场,这样霍尔转 这样霍尔转速传感器才能准确的捕捉到物质的运动状态。

图2-5 霍尔传感器测速原理

本系统采用M法(测频法)测量电机转速,由于转速的定义是单位时间内转数,在变换的过程中,多数是有规律的重复运动。根据霍尔效应原理,将一块永久磁钢固定在电机转轴上的转盘边沿,转盘随侧轴旋转,磁钢也将跟着同步旋转,在转盘下方安装一个霍尔器件,转盘随轴旋转时,受磁钢所产生的磁场的影响,霍尔器件输出脉冲信号,其频率和转速成正比。脉冲信号的周期与电机的转速有以下关系:

n为电机转速;P为电机转一圈的脉冲数;T为输出方波信号周期。根据上式即可计算出直流电机的转速。

3硬件电路的设计

3.1 A/D转换电路

A/D转换器是一种能将连续的模拟信号转换成二进制的数字量的器件。模拟量可以是电压或电流等电信号,也可以使声、光、压力、温度、湿度等随时间连续变化的非电量的模拟量。非电量的模拟量可以通过合适的传感器(如光电传感器、压力传感器、温度传感器)转换成电信号。模拟量只有被转换成数字量才能被计算机采集、分析、计算。A/D转换器的种类有很多,按转换原理可以分为以下4种:计数式A/D转换器、双积分式A/D转换器、逐次逼近式A/D转换器和

并行式A/D转换器。

目前最常见的是双积分式A/D转换器和逐次逼近式A/D转换器。双积分式A/D转化器的优点主要在于精度高、抗干扰能力强且价格便宜,但转换速度较慢,因此这种转换器主要运用于速度要求不高的场合。逐次逼近式A/D转换器是一种速度较快且精度较高的转换器,其转换时间大约在几微秒到几百微妙之间。

本系统采用的是A/D转换芯片ADC0809,它是一个采用CMOS工艺的逐次逼近式8位A/D转换器,片内除A/D转换部分外还有8路模拟开关,可对8路模拟电压量进行分时转换,典型的转换时间为0.1微秒,片内还有三态输出缓冲器,可以与单片机的数据总线直接连接。A/D内部结构如图3-1所示:

图3-1 ADC0809内部逻辑结构及引脚定义

引脚功能如下:

IN7~IN0——模拟量输入通道

ALE——地址锁存允许信号。对应ALE上跳沿,A、B、C地址状态送入地址锁存器中。

START——转换启动信号。

START上升沿时,复位ADC0809;START下降沿时启动芯片,开始进行A/D转换;在A/D转换期间,START应保持低电平。本信号有时简写为ST。

A、B、C——地址线。 通道端口选择线,A为低地址,C为高地址,引脚图中为ADDA,ADDB和ADDC。

CLK——时钟信号。ADC0809的内部没有时钟电路,所需时钟信号由外界

提供,因此有时钟信号引脚。通常使用频率500KHz的时钟信号

EOC——转换结束信号。EOC=0,正在进行转换;EOC=1,转换结束。使用中该状态信号即可作为查询的状态标志,又可作为中断请求信号使用。

D7~D0——数据输出线。为三态缓冲输出形式,可以和单片机的数据线直接相连。D0为最低位,D7为最高

OE——输出允许信号。用于控制三态输出锁存器向单片机输出转换得到的数据。

OE=0,输出数据线呈高阻;OE=1,输出转换得到的数据。Vcc——+5V电源。

Vref——参考电源参考电压用来与输入的模拟信号进行比较,作为逐次逼近的基准。其典型值为+5V。

3.2单片机的选择

单片机我们采用ATC51(其引脚图如图3-2),相较于INTEL公司的8051它本身带有一定的优点。ATC51是一种带4K字节闪烁可编程可擦除只读存贮器的低电压,高性能CMOS 8位微处理器,俗称单片机。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的ATC51是一种高效微控制器,ATC51单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。

一个单片机应用系统的硬件电路设计应包含有两个部分内容: 第一是系统扩展,即当单片机内部的功能单元,如ROM、RAM、I/O口、定时/计数器、中断系统等容量不能满足应用系统要求时,必须在片外进行扩展,选择适当的芯片,设计相应的电路。第二是系统配置,即按照系统功能要求配置外围设备,如键盘、显示器、打印机、D/A、A/D转换器等,并设计相应的接口电路。

图3-2 ATC51单片机引脚图

主要特征:

与MCS-51兼容4K字节可编程闪烁存储器 寿命:1000写/擦循环 数据保留时间:10年 全静态工作:0Hz-24Hz 三级程序存储器锁定 128*8位内部RAM 32可编程I/O线两个 16位定时器/计数器 5个中断源 可编程串行通道

低功耗的闲置和掉电模式 片内振荡器和时钟电路

P0口:P0口是一组8位漏极开路型双向I/0口,也即地址/数据总线复用口。作为输出口用时,每位能驱动8个TTL逻辑门电路,对端口写“l”可作为高阻抗输入端用。在访问外部数据存储器或程序存储器时,这组口线分时转换地址(低8位)和数据总线复用,在访问期间激活内部上拉电阻。在F1ash编程时,P0口接收指令字节,而在程序校验时,输出指令字节,校验时,要求外接上拉

电阻。

P1口:Pl是一个带内部上拉电阻的8位双向I/O口,Pl的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。对端口写“l”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口。作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流(IIL)。 Flash编程和程序校验期间,Pl接收低8位地址。

表3-1 P1口引脚功能表

P2口:P2是一个带有内部上拉电阻的8位双向I/O口,P2的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。对端口写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口,作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流(IIL)。

在访问外部程序存储器或16位地址的外部数据存储器(例如执行MOVX@DPTR指令)时,P2口送出高8位地址数据。在访问8位地址的外部数据存储器(如执行MOVX@Ri指令)时,P2口线上的内容(也即特殊功能寄存器(SFR)区中P2寄存器的内容),在整个访问期间不改变。

Flash编程或校验时,P2亦接收高位地址和其它控制信号. P3口:P3口是一组带有内部上拉电阻的8位双向I/0口。P3

口输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。对P3口写入“l”时,它们被内部上拉电阻拉高并可作为输入端口。作输入端时,被外部拉低的 P3口将用上拉电阻输出电流(IIL).

P3口除了作为一般的I/0口线外,更重要的用途是它的第二功能,如下表所示:

表3-2 P3口的引脚功能

RST复位输入。当振荡器工作时,RST引脚出现两个机器周期以上高电平将使单片机复位。WDT溢出将使该引脚输出高电平,设置SFR AUXR的DISRT0位(地址8EH)可打开或关闭该功能。DISRT0位缺省为RESET 输出高电平打开状态。

ALE/PROG:当访问外部程序存储器或数据存储器时,ALE(地址锁存允许)输出脉冲用于锁存地址的低8位字节。即使不访问外部存储器,ALE仍以时钟振荡频率的1/6输出固定的正脉冲信号,因此它可对外输出时钟或用于定时目的。要注意的是:每当访问外部数据存储器时将跳过一个ALE脉冲。

对F1ash存储器编程期间,该引脚还用于输入编程脉冲(PROG)。 如有必要,可通过对特殊功能寄存器(SFR)区中的8EH单元的D0 位置位,可禁止ALE操作。该位置位后,只有一条M0VX和M0VC指令ALE才会被激活。此外,该引脚会被微弱拉高,单片机执行外部程序时,应设置ALE无效。

PSEN:程序储存允许(PSEN)输出是外部程序存储器的读选通信号,当ATC51由外部程序存储器取指令(或数据)时,每个机器周期两次PSEN有效,即输出两个脉冲。当访问外部数据存储器,没有两次有效PSEN信号。

EA/VPP:外部访问允许。欲使CPU 仅访问外部程序存储器(地址为0000H-FFFFH),EA 端必须保持低电平(接地)。需注意的是:如果加密位LB1被编程,复位时内部会锁存EA端状态。如EA端为高电平(接Vcc端),CPU则执行内部程序存储器中的指令。F1ash存储器编程时,该引脚加上+12V 的编程电

压Vpp即输出两个脉冲。当访问外部数据存储器,没有两次有效的PSEN信号。

EA/VPP:外部访问允许。欲使CPU仅访问外部程序存储器(地址为0000H-FFFFH),EA端必须保持低电平(接地)。需注意的是:如果加密位LB1被编程,复位时内部会锁存EA端状态。如EA端为高电平(接Vcc端),CPU则执行内部程序存储器中的指令。F1ash存储器编程时,该引脚加上+12V 的编程电压Vpp。

XTALl:振荡器反相放大器及内部时钟发生器的输入端。 XTAL2:振荡器反相放大器的输出端。 振荡器特性:

XTAL1和XTAL2分别为反向放大器的输入和输出。该反向放大器可以配置为片内振荡器。石英振荡和陶瓷振荡均可采用。如采用外部时钟源驱动器件,XTAL2应不接。有余输入至内部时钟信号要通过一个二分频触发器,因此对外部时钟信号的脉宽无任何要求,但必须保证脉冲的高低电平要求的宽度。芯片擦除:整个PEROM阵列和三个锁定位的电擦除可通过正确的控制信号组合,并保持ALE管脚处于低电平10ms来完成。在芯片擦操作中,代码阵列全被写“1”且在任何非空存储字节被重复编程以前,该操作必须被执行。

此外,ATC51设有稳态逻辑,可以在低到零频率的条件下静态逻辑,支持两种软件可选的掉电模式。在闲置模式下,CPU停止工作。但RAM,定时器,计数器,串口和中断系统仍在工作。在掉电模式下,保存RAM的内容并且冻结振荡器,禁止所用其他芯片功能,直到下一个硬件复位为止。

3.2时钟电路

单片机的工作过程是:取指令、执行指令。这些工作都是在统一的时钟脉冲控制下一拍一拍地进行的,而这个脉冲是由单片机控制器中的时序电路发出的。单片机的时序就是CPU在执行指令的时候所需要控制的信号的时间顺序,为了保证各个部件之间的同步进行,单片机内部电路应在唯一的时钟脉冲信号下严格按时许进行工作。其时钟电路如图3-3所示:

图3-3 系统时钟电路

ATC51单片机内部含有一个高增益反相放大器,这个反相放大器的作用就是用于构成振荡器的,但是要形成时钟,外部还需要增加一些附加电路。

3.3复位电路

复位是单片机的初始化操作,单片机启动运行时,都需要先复位,其作用是使CPU和系统中其他部件处于一个确定的初始状态,并从这个状态开始工作。因而,复位是一个重要的操作方式,但单片机本身是不能自动复位的,必须配合相应的外部电路才能实现。

当单片机的复位引脚RST出现两个周期以上的高电平时,单片机就执行复位操作。如果RST持续为高电平,单片机就处于循环复位的状态。根据应用的要求,复位操作通常有两种基本形式:上电复位和上电或按键复位。其复位电路如图3-2

(a)上电复位电路

(b)按键电平复位

(c)按键脉冲复位

3.4显示电路

显示电路采用LED数码管动态显示,LED(Light-Emitting Diode)是一种外加电压从而渡过电流并发出可见光的器件。LED是属于电流控制器件,使用时

必须加限流电阻。LED有单个LED和八段LED之分,也有共阴和共阳两种。

图3-4七段发光数码管结构

共阴极数码管的发光二极管阴极必须接低电平,当某发光二极管的阳极为高电平时(一般为+5V)时,此二极管点亮;共阳极数码管的发光二极管是阳极接到高电平,对于需要点亮的发光二极管使其阴极接低电平(一般为地)即可。

根据LED显示器可知,如果希望显示“8”字,那么除了“dp”管不要点亮以外,其余管全部点亮。同理如果要显示“1”,只需bc两个发光二极管点亮,其余均布点亮。通常将控制发光二极管的8位数据称为段选码,共阴极和共阳极的段选码互为补码。LED显示器的段选码如下表所示:

表3-1 LED数码管段选码

显示部分电路如图3-5所示

图3-5 显示部分与单片机的连接电路

3.5 系统供电电路

要取得+5V电压,若选用12V的变压器,整流滤波后输出往往大于12V,会使稳压器功耗大,自身温度较高。故不选用输出电压为12V的变压器,而选用输出电压为9V的变压器。系统接通220V交流电源后,将220V交流电变压到9V,经过二极管全波整流、电解电容Cl,C2滤波,再经一只正输出稳压器LM7805,为了缓冲负载突变,改善瞬态响应,输出端还采用了电容C3、C4,最后得到+5V的直流工作电源,用于给控制系统中单片机系统及其它外围电路的Vcc+端供电。供电电路如图3-5所示:

图3-5系统供电电路

4系统程序设计

4.1程序流程图

主程序流程图

显示子程序流程图:

定时计数子程序流程图:

4.2系统的初始化

系统自检初始化是保证整个控制系统能够正常运行的重要条件,系统加电复位后,直接进入自检初始化程序,完成系统的自检及初始化。初始化过程主要是对一些控制寄存器(如中断控制)、数据区和外部芯片(如时钟芯片DS1302等)进行初始参数设置和定义。本系统中的自检初始化主要指各接口芯片的检测、芯片

内部设定参数的初始化及系统内部寄存器的初始化。

各接口芯片的检测主要检测各芯片是否己处于准备工作的就绪状态,有无硬件故障等,如检测各位LED是否正常显示系统设置开机时的界面,检测硬件时钟DS1302是处于更换芯片后初次使用为起振状态,还是处于备用电源供电振荡保持状态,即检测系统中控制时间表的有效性,检测人体传感器输出信号是否正常体现人体存在的信息,检测环境光是如何影响光采集电路输出的信号等。若时钟芯片处于启动状态,系统控制时间表无效,则需要对其进行初始化并启动实时时钟。

系统内部寄存器初始化主要是指在数据缓冲区内,各用户定义的数据变量的初始化赋值及部分特殊功能寄存器SFR的复位初始化,单片机复位后,程序计数器PC指向程序存储器的入口地址0000单元,程序状态字寄存器PSW清零,片内存储器选择工区工作寄存器,用户标志位F0为0状态,堆栈指针SP指向07H,其它定时器、中断允许寄存器IE、累加器ACC等皆为00H。

4.3A/D转换模块

当DAC0832芯片的片选信号,写信号及传送控制信号的引脚全部接地,允许输入锁存信号ILE引脚接+5V时,DAC0832芯片就处于直通工作方式,数字量一旦输入,就直接进入DAC寄存器,进行D/A转换。A/D转换程序如下:

ATOD:CLR P1.0;转换前条件 CLRP1.1; CLRP1.3;

MOVR0,#30H;转换结果存放首地址 MOVR2,#0;初始通道号 MOVR3,#8;总的通道数 GOON:MOVP0,R2;输出通道号 SETBP1.0;锁存通道号

CLRP1.0; SETBP1.1;启动转换

CLRP1.1; LCALLDEL;调延时10μS延时子程序 SETBP1.2;准备读转换结束标志 JNBP1.2,$;等待转换结束 SETBP1.3;输出允许

MOVP0,#0FFH;将P0口置为输入口 MOV@R0,P0;读入并保存数据 CLRP1.3;恢复转换前条件 INCR0;修改数据区地址 INCR2;修改通道号

DJNZR3,GOON;判8路转换完否?未完继续RET;8路转换完,返回退出

4.4显示驱动模块

系统运行过程中的数据显示是人机交互对话的一个重要通道。通过系统数据的显示,我们才可以更好的了解系统运行的状态,从而便于对整个系统进行必要的操作。显示驱动程序如下:

#include

#define uchar unsigned char #define uint unsigned int sbit rs=P3^5;//4jiao sbit rw=P3^6;//5 sbit e =P3^7;//6

/********************************************************************** ***********************************************************************/ void delay(uint z) {

uint x,y;

for(x=z;x>0;x--) for(y=110;y>0;y--); }

/********************************************************************** ***********************************************************************/ void send_cmd(uchar cmd)//向液晶发送地址或指令 { e=0;

rs=0; //写指令地址 rw=0; P0=cmd; delay(5); e=1;//上升沿 delay(5); e=0;

}

/********************************************************************** ***********************************************************************/ void send_data(uchar date)//向液晶发送数据 { e=0;

rs=1; //写数据 rw=0; P0= date; delay(5); e=1;//上升沿 delay(5); e=0; }

/********************************************************************** ***********************************************************************/ void display(uchar add,uchar date)//第一显示地址,第二显示数据 {

send_cmd(add); send_data(date); }

void lcd_init()//lcd初始化 {

send_cmd(0x38);//以1602--5*7点阵,8位数据接口 send_cmd(0x0f);//开背光。开光标,光标闪 send_cmd(0x06);//地址自动加一,整屏不移动 send_cmd(0x01); }

/********************************************************************** ***********************************************************************/ void main() {

lcd_init(); while(1) {

display(0x88,'O'); display(0x,'K'); display(0x8a,'!'); for(;;) { } } }

5仿真与调试

5.1 Keil软件简介

KeilC51是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统。与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。用过汇编语言后再使用C来开发,体会更加深刻。KeilC51软件提供丰富的库函数和功能强大的集成开发调试工具,全Windows界面。另外重要的一点,只要看一下编译后生成的汇编代码,就能体会到KeilC51生成的目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解。在开发大型软件时更能体现高级语言的优势。

5.2应用Keil软件进行程序调试

软件的调试必须在开发系统的支持下进行。先分别调试通过各个模块程序,然后调试中断服务程序,最后调试主程序,将各部分连接进行调试。调试的范围可以由小到大,逐步增加,必要的中间信号可以先做设定。通常交叉使用单步运行,断点运行,连续运行等多种方式,每次执行完毕后,检查CPU执行现场,RAM的有关内容,I/O接口的状态等。发现一个问题,解决一个问题,直至全部通过。首先新建一个工程项目文件;其次为工程选择目标器件;再次为工程项目设置软硬件调试环境;并创建源程序文件并输入程序代码,及保存创建的源程序项目文件;最后,把源程序文件添加到项目中。

Keil软件的操作界面如下图所示:

图5-1

图5-2

图5-3

图5-4

图5-5

5.3软件仿真

在Proteus软件中画出原理图,向单片机中加入需要调试的程序的.hex文件,便可以进行调试了。其电路图

图5-6 仿真电路图

启动仿真后。数码管显示结果如图5-7所示:

图5-7 仿真结果图

硬件实物图如图5-8所示:

图5-7硬件实物图

6 结束语

采用单片机技术来实现转速的测量,可以提高转速的测量,可以提高转速测量的精确度,并且加快了采样的速率,具有较好的实时性。本文介绍的转速方法使用于高、低转速的测量,测量精确度与转速无关,因而具有较宽的应用范围和广阔的应用的前景。

基于单片机的转速测量系统,具有硬件电路简单,程序简单和运算速度快,测速范围广,抗干扰性能好的特点。在设计的信号处理电路中经过滤波,能够进一步减少误差,是测速精度得到提高。

参考文献

[1]冯先成.单片机应用系统设计[M].北京航空航天大学出版社,2009 [2]马光.单片机原理及应用[M].机械工业出版社,2006 [3]王晓东.算法设计与分析[M].北京清华大学出版社,2003 [4]李全利.单片机原理及接口技术[M].高等教育出版社,2009

[5]胡杰,吴磊,赵鸣.51单片机C语言应用与开发[M].北京航空航天大学出版社,2010

[6]张洪润.单片机原理及应用[M].清华大学出版社,2005

[7]蔡民文,冯先成.单片机课程设计[M].武汉华中科技大学出版社2007 [8] Ndala Co Capacitance Sensors for Measureing Single Kernal Moisture Content in Corea AmSOCAg Eng,1995

[9]王幸之.单片机应用系统抗干扰技术[M].北京:北京航空航天大学出版社,2001, 69-78

[10] 靳济芳.Visual C++小波变换技术与工程实践[M].北京:人民邮电出版社,2004.

附录A

软件程序 #include #include\"juxun001.h\"

//====================================

========================================================= void main() {

time0_int0_init();//定时器0和外部中断0的初始化 while(!TR0) //上电一直未切割时就显示 0.0.0.0 {

init_display(); } while(1) {

if(!change)//按下切换按键显示里程 {

delay1m(5); if(!change) {

flag = ~flag; }

while(!change);

} } }

//==================================定时器0

中断函================================

void time0_interrupt()interrupt 1 {

TL0 = (65536 - 5000) % 256;// 12M晶振,5ms定时 TH0 = (65536 - 5000) / 256; display_function(); time_counter++; time_counter8++;

if(time_counter8 >= 1600)//大于8s没切割,车子视为停下了,速度为:0,但里程还记着 {

time_counter8 = 0; speed = 0;//速度为 0 point1 = 0;

buf1[3] = speed%10;buf1[2] = speed/10%10; buf1[1] = speed/100%10;buf1[0] = speed/1000%10; } }

//==================================外部中断========================= void int0_interrupt()interrupt 0 {

external_counter++;

if(external_counter ==1 )TR0 = ~TR0;//第一次切割打开定时器0 if(external_counter == 65535)external_counter = 0; time_counter8 = 0; //只要8秒内有切割,车子就任在运行 if(external_counter % 2 == 0)//切割2次 更新下速度 { //*5是因为中断一次是5MS

if(flag1==0){speed =((ulong)(36000)*zhouchang)/(time_counter * 5);flag1=1;}

else if(flag1==1){speed =((ulong)(36000)*2*zhouchang)/(time_counter *

0

中断函数

5);}//速度:单位为 m/h ,*1000的目的是不出现浮点数

if((speed >= 100)&&(speed < 1000)) //100 ---- 1000 3位整数 {

point1 = 1;buf1[3] = speed%10;buf1[2] = speed/10%10; buf1[1] = speed/100%10;buf1[0] = 0;}

else if((speed >= 1000)&&(speed < 10000)) //1000 ---- 10000 4位整数 {

point1 = 1;speed = (uint)speed;

buf1[3] = speed%10;buf1[2] = speed/10%10; buf1[1] = speed/100%10;buf1[0] = speed/1000%10;}

else if((speed >= 10000)&&(speed < 100000)) //10000 ----- 100000 数 { point1 = 2;

buf1[3] = speed/10%10;buf1[2] = speed/100%10; buf1[1] = speed/1000%10;buf1[0] = speed/10000%10;}

else if((speed >= 100000)&&(speed < 1000000)) //100000 ------ 1000000 整数 { point1 = 3;

buf1[3] = speed/100%10;buf1[2] = speed/1000%10; buf1[1] = speed/10000%10;buf1[0] = speed/100000%10;} time_counter = 0; }

if(external_counter % 8 == 0)//每切割8次 更新下里程 {

s = (ulong)external_counter * zhouchang; //里程:单位为 cm if((s >= 1000)&&(s < 10000)) {

point2 = 1;

//

5位整 6位0.012

001212

buf2[3] = s/100%10;buf2[2] = s/1000%10; buf2[1] = 0;buf2[0] = 0;}// 4位整数 else if((s >= 10000)&&(s < 100000)) { point2 = 1;

buf2[3] = s/100%10;buf2[2] = s/1000%10;

buf2[1] = s/10000%10;buf2[0] = 0;}// 5位整数 else if((s >= 100000)&&(s < 1000000)) { point2 = 1;

buf2[3] = s/100%10;buf2[2] = s/1000%10;

buf2[1] = s/10000%10;buf2[0] = s/100000%10;} // 6位整数 1.234 1234 56 else if((s >= 1000000)&&(s < 10000000)) { point2 = 2;

buf2[3] = s/1000%10;buf2[2] = s/10000%10;

buf2[1] = s/100000%10;buf2[0] = s/1000000%10;}// 7位整数 1234 567 else if((s >= 10000000)&&(s < 100000000)) { point2 = 3;

buf2[3] = s/10000%10;buf2[2] = s/100000%10;

buf2[1] = s/1000000%10;buf2[0] = s/10000000%10;} // 8位整数 5678 } }

//==================================开电源就显示的数据,初始显示速度======================== void init_display() {

1234

0.123

012345

uchar i;

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

wei = bitcode[num - 1]; led = display1[buf1[num--]]; delay1m(4); if(num == 0)num = 4; } }

//======================================================================= void display_function() {

if(flag == 0)//显示速度 {

switch(point1) {

case 0:wei = bitcode[num-1];led = display1[buf1[num-1]];num--;break;//速度显示 0 case

1:if(num

==

1){

wei

=

bitcode[num-1];led

=

0x7f&display1[buf1[num-1]];num--;}

else { wei = bitcode[num-1];led = display1[buf1[num-1]];num--;}break;//最高位小数点亮 case

2:if(num

==

2){

wei

=

bitcode[num-1];led

=

0x7f&display1[buf1[num-1]];num--;}

else { wei = bitcode[num-1];led = display1[buf1[num-1]];num--;}break;//第二高位小数点亮 case

3:if(num

==

3){

wei

=

bitcode[num-1];led

=

0x7f&display1[buf1[num-1]];num--;}

else { wei = bitcode[num-1];led = display1[buf1[num-1]];num--;}break;//第三高

位小数点亮 default:break; }

if(num == 0)num = 4; }

else if(flag == 1)//显示里程 { switch(point2) {

case 0:wei = bitcode[num-1];led = display1[buf2[num-1]];num--;break;//里程显示 0 case

1:if(num

==

1){

wei

=

bitcode[num-1];led

=

0x7f&display1[buf2[num-1]];num--;}

else { wei = bitcode[num-1];led = display1[buf2[num-1]];num--;}break;//最高位小数点亮 case

2:if(num

==

2){

wei

=

bitcode[num-1];led

=

0x7f&display1[buf2[num-1]];num--;}

else { wei = bitcode[num-1];led = display1[buf2[num-1]];num--;}break;//第二高位小数点亮 case

3:if(num

==

3){

wei

=

bitcode[num-1];led

=

0x7f&display1[buf2[num-1]];num--;}

else { wei = bitcode[num-1];led = display1[buf2[num-1]];num--;}break;//第三高位小数点亮 default:break; }

if(num == 0)num = 4; } }

//=================================定时器0和外部中断0的初始化函数================= void time0_int0_init()

{

TMOD |= 0x01;

TMOD &= 0xfd;//定时器0工作于方式1

TL0 = (65536 - 5000) % 256;//12M晶振,5ms定时 TH0 = (65536 - 5000) / 256;

IT0 = 1;//外部中断0,负跳变触发方式 TR0 = 0; ET0 = 1; EX0 = 1; EA = 1; }

//====================================ms =========================== void delay1m(uchar x) { uchar i,j;

for(i=0;i

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

Copyright © 2019- obuygou.com 版权所有 赣ICP备2024042798号-5

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务