基于单片机的扭矩测量系统设计(精华)

更新时间:2024-03-28 00:24:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

摘 要

扭矩是电机最重要的一个参数之一,要合理地使用电机,必须要准确地对扭矩进行测量。而且扭矩的测量是机械产品的开发研究、测试分析、质量检验、型式鉴定和节能、安全或优化控制等工作中必不可少的内容。扭矩测量仪是科研部门和工业生产过程中必备的测试工具。因而研制出一种数字式、高精度的扭矩测量仪具有非常现实的意义。

以往的扭矩测量中,将电机与传感器和负载直接连接起来,这种方法构成的电机扭矩测量仪具有结构简单,测量平稳等优点。但是其结构庞大、能耗大、价格昂贵且测量误差大,如果测量各种大扭矩电机,需要加大负载,将导致测量仪体积和重量增加,且受旋转轴固有频率的影响,不适于测量高速电机。因此,本次设计以ZJ型传感器为基础,以单片机为核心设计了一款数字化高精度扭矩测量仪。

本次设计的扭矩测量仪可以对各种电机进行测量,扭矩的测量范围预计可达到0~500.0Nm,而且还可以对扭矩超标进行报警提示。本系统设计的测量仪具有测量范围广、精度高等特点。而现在的测量仪正在朝着高精度、宽测量范围、小体积、低价格等方向发展。在这样的情况下,可以说本测量仪在扭矩测量领域里具有很强的实用性和广阔的发展前景。

关键字: 扭矩测量,数字式,单片机控制

1 -

Abstract

Torque is one of the most important parameters motor one, to reasonably use the motor, must be accurately measured for the torque. And torque measurement is the mechanical product development research, testing and analysis, quality inspection, type identification and energy-saving, safety or optimization control in the job such as indispensable content. Torque measuring instrument is scientific research departments and industrial production process necessary testing tools. Thus developed a digital, high-precision torque meter is very realistic significance.

Previous torque measurement, motor and sensor and load will be connected directly, this method constitute motor torque meter measuring has simple structure, stable, etc. But its structure is huge, energy consumption is big, expensive and measurement error is big, if torque motor measuring various, need to increase the load will result in measuring instrument bulk and weight increased, and the influence of by the axis of the inherent frequency, not suitable for measuring high-speed motor. Therefore, this design based on ZJ type sensor, based on singlechip design a new digital precision torque measuring instrument.

The design of torque measurement instrument measured for various motor can be the measuring range, torque can be expected to reach 0 ~ 500.0 Nm, and still can exceed of torque for alarm prompt. This system design of measuring instrument has wide measuring range, high precision and. But now the measuring instrument is going in the high precision, wide measuring range, small volume, low price direction. In such situations, can say this measurement instrument in the field in torque measurement with strong practicability and broad development prospects.

Key word: torque measurement, digital, SCM control

- 2 -

目录

摘 要 ............................................................................................................................ 1 ABSTRACT ..................................................................................................................... 2 第1章 绪 论 ................................................................................................................ 4 1.1 课题背景及理论与实际意义 ................................................................................ 4 1.2 课题的发展状况 .................................................................................................... 4 1.3本课题的来源及设计要求和主要内容 ................................................................. 5 第2章 总体方案论证 .................................................................................................... 6 第3章 硬件电路设计 .................................................................................................... 7 3.1硬件电路总体结构及工作原理 ............................................................................. 7 3.2 ZJ传感器的结构及工作原理 ................................................................................ 8 3.3信号的放大与比较电路设计 ................................................................................. 9 3.4 主控模块单片机系统的设计 .............................................................................. 11 3.5显示模块的设计 ................................................................................................... 16 3.6 AD转换电路设计 .............................................................................................. 19 第4章 软件设计 .......................................................................................................... 21 4.1主程序设计 ........................................................................................................... 21 4.2 初始化程序设计 .................................................................................................. 23 4.3 测量子程序设计 .................................................................................................. 24 4.4 串口通信程序设计 .............................................................................................. 26 4.5 看门狗程序设计 ................................................................................................ 27 致 谢 .......................................................................................................................... 29 参考文献 ........................................................................................................................ 30 附录一、 硬件原理图 .................................................................................................. 31 附录二、 主要参考文献及摘要 .................................................................................. 32 附录三、部分程序清单 ................................................................................................ 34

3 -

第1章 绪 论

1.1 课题背景及理论与实际意义

随着生产和科学技术的迅速发展,测量和试验技术作为涉及多种学科的综合科学技术,正在形成独立的学科体系。扭矩是工业生产过程中的重要参数,为了保证生产正常进行,必须对扭矩进行检测和控制。扭矩的测量是各种机械产品的开发研究、测试分析、质量检验、型式鉴定和节能、安全或优化控制等工作中所必不可少的内容。例如在各种发动机的研制和调试过程中,需要知道发动机的性能是否满足要求以及是否正常运行,这就需要对扭矩进行测量。其次,在各种电机的运行过程中往往需要设置一个扭矩的上限值,以确保电机的安全运行,通过对扭矩和的测量,当超过上限值时发出报警信号。以提醒用户进行相应的操作。

测量扭矩的传感器、仪器和装置已成为科研单位、院校、工厂实验室或检验部门的必备测试工具;也是电子计算机控制的生产或试验系统中提供扭矩信息所必需的组成部分。

在现代化测量仪中,数字显示仪表得到了迅速发展。这种仪表有读数直观,信号可以原传或遥传,不容易受到干扰;测量准确度高;测量结果便于自动纪录,或输入到电子计算机中进行数据处理等等优点。数字扭矩测量仪表在现代科学试验工作中的应用日益广泛。

随着数字时代的到来,以单片机为核心的微型测控系统获得了飞速发展,现已应用于生产生活的各个方面,并且快速取代了传统的同类产品。对于大多数扭矩测量系统而言,运行稳定可靠、操作灵活简便、节省时间、性能价格比高、扩展兼容性强和易于维护是基本的要求,然而对于大多数企业用户来说,精度和实时性并不像实验室要求那么高,中等精度的扭矩测量系统已基本能满足使用上的要求。

1.2 课题的发展状况

在人们的日常生产和生活中,扭矩的测量是随处可见的,小到微型轴承、录音机、缝纫机、洗衣机,大到汽车发动机、机床主轴、舰船推进器、飞机发动机等等,都需要测量扭矩值。随着生产生活要求的提高,传统的低精度测量仪器已不能满足人们的需要,现在的测量仪正在朝着高精度、宽测量范围、小体积、低价格等方向发展。单片机的出

- 4 -

现使科技发展跃进了一大步,它在家用电器及工业上的用途更为广泛,采用单片机进行控制,可以使扭矩测量仪的控制更准确、灵活、直观,它使扭矩测量仪电路设计更为简易,而且实现了非人工调节性能。数字时代的到来更为这些科技产品带来了更为有效、准确的数字信息。总之,现代的扭矩测量仪是结合了前沿科技于一体的产物。

在现代社会的生产和生活中,

对扭矩和测量的精度提出越来越高的要求,传统的测量仪表,由于自身的诸多缺陷,逐渐被高精度的数字式测量仪所取代,而由单片机系统组成的高精度数字式测量仪的核心部件之一——传感器又显得特别重要。人们已经相继研制出了多种类型的扭矩传感器,如ZJ型传感器、WS-1型智能传感器和CZ型传感器等,本系统就采用ZJ型扭矩传感器。

1.3本课题的来源及设计要求和主要内容

目前市场上的扭矩测量仪器很多,既有传统的机械类产品,也有现代的高精度多功能产品,后者主要是基于现代单片机系统而设计的,本次设计的扭矩测量仪就是基于AT89C52单片机系统研制而成的。其中涉及了传感器技术,看门狗X5045保护电路,AT89C52单片机应用系统,液晶显示系统,和报警系统。

本次设计要求及主要内容有:

? 扭矩的测量范围是0-500.0Nm

? 以ZJ型传感器为对象,配合信号调理电路的研究与设计。 ? 单片机存储和测控电路的设计。 ? 看门狗电路的设计。 ? 键盘输入和液晶显示电路。 ? 485通讯电路的设计

5 -

第2章 总体方案论证

近年来,随着电子测量技术的迅速发展,信号的相位测量方法也日趋完善。利用相位测量原理制成的相位扭矩测量仪,也得到了很广泛的应用。本次设计采用的ZJ传感器就是采用磁电转换原理制成的。

为了把扭矩和信息能够准确地从电机中提取出来,通常是由传感器将被测信息转换为电信号,并对电信号存储、传输、分析计算,最终显示测量结果。传感器是整个测量仪器的核心,对传感器的选择必须合理,并保证能够在一定的工作环境下正常地工作。

电机扭矩的测量方法可分为传递法、平衡力法及能量转化法。平衡力法是通过外加已知的与被测扭矩方向相反的扭矩,当传动轴静止或匀速转动时,外加扭矩与被测扭矩相等。这种方法简单,但必须通过另外一种方法测量外加的扭矩或力及力臂,这样会对测量引入一定的累计误差。能量转化法是通过利用能量守恒的原理间接测量扭矩,不易实现。传递法是将被测扭矩传递到弹性元件上,根据弹性元件物理参数的变化来测量扭矩的方法。变化的参数可以是变形、应力、或应变等,使用的弹性元件是扭轴。电机主轴旋转时, 将扭矩传递到扭轴上, 扭轴上所产生的应变,通过扭矩传感器的电阻应变片转换成相应的电信号,该信号通过处理后送显示器显示扭矩数值。

本次设计采用的ZJ传感器是采用磁电转换原理,将扭矩信号转换为两路有一定相位差的电信号。系统设计框图如图2-1所示。输入部分由通道1、2及鉴相器构成。通道1、2分别是由LM258和ADC0832构成的放大转换电路,来自ZJ型传感器的电信号送入仪器的通道1和通道2,经过放大转换为数字信号,并产生一连串宽度与相位差成正比的数字量。控制部分的核心是微处理器,信号送入单片机进行处理,在单片机中处理运算后得到扭矩测量值,送入液晶进行显示。此外在电路中还加入了看门狗保护电路。

信号1 信号2 通道1 AD转换 通道2 微处理器 显示 图2-1系统设计框图

- 6 -

第3章 硬件电路设计

3.1硬件电路总体结构及工作原理

3.1.1 硬件电路总体结构

本次设计是基于ZJ型传感器的扭矩测量仪,主要由输入、控制、显示输出三部分组成。输入部分是由LM258构成的放大电路、ADC0832构成的模/数转换电路和采用与门电路的鉴相器三部分组成,另外为了使系统更加稳定加入了简单的RC滤波电路和二极管保护电路。控制部分是以AT89C52单片机为核心,外加看门狗X5045保护电路构成。显示输出部分是用液晶1602进行显示。电路总体结构框图如图3-1所示。

传感 器 传 看门狗X5045 图3-1 硬件电路总体结构图

3.1.2 硬件电路的工作原理

本次设计的扭矩测量仪是采用相位差原理研制而成。通过ZJ传感器将电机的扭矩、机械量转换成两路有一定相位差的电压信号,经过LM258放大以后达到易于测量的大小,将经放大的信号送入由ADC0832构成的模/数转换电路,将模拟信号转换成适于单片机处理的数字量。

根据扭矩测量公式,对于扭矩的测量是通过测量两路信号的相位差,按照公式3-1计算出扭矩的值。

7 -

LM258 AD转换 鉴相 扭矩 AT89C52 单片机 驱动 感器 LM258 AD转换 液 晶 按键

T=R?5?F?T1 (式3-1)

T2其中R为传感器额定扭矩,F为传感器系数,T1为两信号过零点之间的相位差, 测得的各种信号值完成公式的计算,都是在单片机AT89C52中通过软件来实现的,最终将计算出的值送入显示部分。电路中加入的看门狗X5045是起保护和复位的作用,系统电压不稳定时,它会自动的发出复位信号,使整个系统复位。生产中我们不仅要测量扭矩值,而且要利用这些值对我们的生产过程进行控制,当超过电机能承受的扭矩时,单片机就控制蜂鸣器进行报警。

3.2 ZJ传感器的结构及工作原理

3.2.1 ZJ型传感器的结构

ZJ型扭矩传感器是根据磁电转换和相位差原理,将扭矩、机械量转换成两路有一定相位差电压讯号的一种精密仪器,图3-2为传感器的结构示意图,它由机座、端盖、扭力轴、内齿轮、外齿轮、磁钢、线圈轴承等组成。内齿轮、磁钢固定在套筒上,线圈固定在端盖上,外齿轮固定在扭力轴上。

图3-2 ZJ型传感器的结构示意图

- 8 -

3.2.2 ZJ型传感器的工作原理

内、外信号齿轮由铁磁材料制成,而磁钢是永久磁体制造的。从永久磁钢经气隙、信号齿轮再到永久磁钢,形成了闭合回路。当内、外齿轮旋转时,磁钢与齿顶、齿谷间的气隙发生改变,即磁路中的磁阻发生改变,而永磁体的磁动势一定,据磁路的欧姆定律知线圈中的磁通必然发生变化。据电磁感应定律可知,线圈中也要相应的产生近似正弦波的感应电动势e1,e2.两感应电动势的初始相位差Φ是恒定的,考虑到正、反加载,一般设计在180度位置上,当加上扭力时,扭力轴发生扭转变形,外齿轮和内齿轮间产生相对转角θ,从而两感应电动势e1,e2的相位关系发生了变化,相位差为Φ=Φ0+△Φ。相位差的变化量△Φ与相对转角θ的关系为△Φ=Z×θ,Z为内、外齿轮的齿数。由于在扭力轴的弹性范围内外加扭矩和机械扭转角成正比,因此,测量出Φ就等于间接测量出轴上的外加扭矩,这样就实现了将机械量转化成电子量的过程。图3-3为信号发生原理及时序波形图。

图3-3 信号发生原理及时序波形图

3.3信号的放大与比较电路设计

3.3.1 调理电路的设计

在本次基于ZJ型传感器的扭矩测量仪研制的设计中由传感器采集来的扭矩模拟信号需要经过一系列的处理才能为单片机所用。为此设计了以LM258和AD为基础的信号放大和转换电路,将模拟信号转换为可以为单片机运算处理用的数字信号。如图3-4

9 -

所示。

由传感器采集来的两路信号比较小,不容易处理,需首先经无源RC滤波器处理后送LM258双运算放大器放大,得到方便处理的电压信号。为了防止电压过大,电路中还加入了二极管保护电路。单片机处理的是数字信号,所以需要将模拟电压信号转换为单片机可以处理的二级制数值。

3.3.2 LM258简介

LM358系列(包括LM158、LM258、LM358、LM2904)是由两个独立的高增益、内部频率补偿运算放大器组成。通过特殊设计,它可在宽电压范围的单电源下工作。当然它也能在双电源下工作。低的电源电流与电源数值大小无关。其应用领域包括转换放大器,直流增益部件和所有常规的运算放大器,这些更易于在单电源系统中实现。

图3-4 信号调理电路图

- 10 -

3.4 主控模块单片机系统的设计

3.4.1主控芯片AT89C52在设计中的应用 1) AT89C52与外围芯片的连接

根据设计任务书的要求,在基于ZJ传感器扭矩测量仪的研制中,主要就是由ZJ传感器,放大、转换电路,核心芯片AT89C52与看门狗芯片X5045构成的主控系统,键盘与显示电路一起来实现一个完整的扭矩测量仪,它能够测量各种电机的扭矩。

在具体的设计中,通过AT89C52的P0口与1602相连,这样便构成了CPU与液晶的数据/命令传送。其中P2口的P2.0、P2.1分别与显示液晶的RS和EN相连。P1口的P1.1、P1.2、P1.3、P1.4分别与看门狗芯片X5045的SO、/CS、SCK、SI相连构成看门狗电路用来监控系统防止死机,P2.7口和报警电路连接。其中AT89C52与外围的器件连接结构图如图3-5所示:

X5045 AT89C52 液晶显示 报警

图3-5 AT89C52与外围器件的连接结构图

2)AT89C52在本设计中所用管脚的介绍

主控部分采用的是ATMEL公司的AT89C52,外接12M的石英晶振,还有复位电路,该系列单片机由先进的CMOS工艺制造并带有非遗失性Flash程序存储器,全部支持12时钟和6时钟操作。AT89C52是一种带8K字节闪烁可编程可擦除只读存储器(FPEROM—Flash Programmable And Erasable Read Only Memory)的低电压、高性能

11 -

CMOS 8位微处理器,俗称单片机。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C52是一种高效微控制器,为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。

它包含256字节RAM、32条I/O口线、3个16位定时/计数器、6输入4优先级嵌套中断结构、2个串行I/O口以及片内振荡器和时钟电路。此外,由于器件采用了静态设计,可提供很宽的操作频率范围,可实现两个由软件选择的节电模式——空闲模式和掉电模式,空闲模式冻结CPU,但RAM、定时器、串口和中断系统仍然工作。掉电模式保存RAM的内容,但是冻结振荡器,导致所有其它的片内功能停止工作,由于设计是静态的,时钟可停止而不会丢失用户数据,运行可从时钟停止处恢复。

其中在该设计中所用到的一些AT89C52的管脚功能介绍如下: VCC:供电电源。 GND:接地。

P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在此次设计中,P1口主要是用来与看门狗芯片X5045一起构成系统保护电路,当扭矩的测量值超过规定上限值时,产生复位信号,从而起到保护作用。

P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收输出4个TTL门电流,当P2口被写入1时,其管脚被内部上拉电阻拉高,且作为输入。因此作为输入时,P2口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。P2口电路中接收AD0832的CS,DI,DO,CSCK。

P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。 P3口也可作为AT89C52的一些特殊功能口,如下所示:

- 12 -

表 3-1 P3口线的特殊功能

口线 特殊功能 P3.0 P3.1 P3.2 RXD TXD /INT0 P3.3 /INT1 P3.4 P3.5 P3.6 P3.7 T0 T1 /WR /RD 定时器/计数器0记数输入 定时器/计数器1记数输入 外部RAM写选通 外部RAM读选通 外部中断1申请 串行数据接收 串行数据发送 外部中断0申请 信号名称 RST:复位输入。当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。设计中与X5045的复位脚相连,构成CPU的复位电路。

XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。 XTAL2:来自反向振荡器的输出。 3) AT89C52的存储器系统介绍

单片机的存储器由三部分组成,即程序存储器(包括片内程序存储器,大小与芯片型号有关)、片内数据存储器(包括内部RAM存储器00H~FFH,共256字节;特殊功能寄存器)、外部数据存储器(0000H~FFFFH,共64KB)。

1、 程序存储器

对于带有片内ROM的单片机来说,片内程序存储器和外部程序存储器地址空间重叠。如果EA/Vpp引脚为高电平,且程序计数器PC小于等于片内ROM的地址空间时,将从片内程序存储器去指令(在这种情况下,PSEN信号无效);而当PC超出片内ROM地址空间时,自动到外部程序存储器去指令,即在P0口输出低8位地址(A0~A7),在P2口输出高8位地址(A15~A8)。当EA/Vpp引脚为低电平时,一律从外部程序存储器取指令。

13 -

2、片内数据存储器

片内数据存储器由内部RAM和特殊功能寄存器组成。对于89C52芯片来说,内部RAM的容量为256字节(00H~FFH)。

1、片内RAM

AT89C52芯片内部RAM容量为128字节,根据用途可划分为工作寄存器区、位寻址区和用户数据存储器区(可作为用户RAM和堆栈区)。

工作寄存器区有32个字节组成,从00H~1FH的单元,分成四个区,每个区8个字节,分别用R0~R7作为这8个字节的寄存器名。

20H~2FH单元,共16个字节,属于位寻址区。该区域可以按字节读写,也可以按位读写。

30H单元以后可作为内部用户RAM区或堆栈区。对于AT89C52来说为30H~7FH,尚有80个字节可作用户内部RAM或堆栈区。

复位后,堆栈指针SP指向07H单元。因此,一般需要修改,将SP设在2FH之上。 3、特殊功能寄存器

由于单片机内集成了一些常用的I/O端口、串行口、定时器/计数器、中断控制器等,因此这些I/O接口单元电路内的寄存器也就位于CPU内部,统称为特殊功能寄存器(SFR,即Special Function Registers)。

AT89C52CPU除了给I/O接口电路寄存器,如定时/计数器控制寄存器TCON分配字节地址外,CPU内的寄存器也有字节地址,如累加器Acc字节为0E0H。此类单片机内共有27个特殊功能寄存器,其地址分散在80H~FFH之间。

3.4.2看门狗电路的设计 1. X5045简介

看门狗(Watchdog)电路是嵌入式系统需要的抗干扰措施之一,工控系统在运行时,通常都会遇到各种各样的现场干扰,抗干扰能力是衡量工控系统性能的一个重要指标。看门狗(Watchdog)电路是自行监测系统运行的重要保证,几乎所有的工控系统都包含看门狗电路。看门狗电路一般有软件看门狗和硬件看门狗两种。软件看门狗不需外接硬件电路,但系统需要出让一个定时器资源,这在许多系统中很难办到,而且若系统软件运行不正常,可能导致看门狗系统也瘫痪,硬件看门狗是真正意义上的“程序运行监视器”,

- 14 -

所以在该设计中,我将用X5045芯片设计一种新的硬件看门狗电路,具有体积小、占用I/O口线少和编程方便的特点。 1234U12X25045CSSOWPVSSVCCRESSCKSI8765 图3-6 X5045引脚图 2. X5045看门狗电路的设计 X5045硬件连接图如图3-7所示。X5045芯片内包含有一个看门狗定时器,可通过软件预置系统的监控时间,在看门狗定时器预置的时间内若没有总线活动,则X5045将从RESET输出一个高电平信号,使CPU复位。图3-7电路中,CPU的复位信号是Watchdog复位。其中/CS、SI、SO、SCK脚都与AT89C52的P1口相连,/WP为写保护输入端接高电平。 图3-7 看门狗电路原理图 15 -

3.5显示模块的设计

本系统采用1602字符型液晶显示系统的电压电流,电源的功率以及温湿度信号,达到显示蓄电池状态的目的。

3.5.1 液晶介绍

1602是工业字符型液晶,能够同时显示16x02即32个字符能显示16列2行字符。1602字符型液晶通常有14条引脚线或16条引脚线, 具有显示质量高,液晶显示器画质高且不会闪烁,数字式接口,功耗低等特点,适合显示字母、数字、符号等。

表3-2 为液晶引脚接口:

3.5.2 1602液晶模块内部的控制器的11条控制指令 如表3-3所示:

- 16 -

序号 指令 RS R/W D7 D6 D5 D4 D3 D2 D1 D0 1 清显示 光标返回 置输入模式 显示开/关控制 光标或字符移位 置功能 置字符发生存贮器地址 置数据存贮器地址 读忙标志或地址 0 0 0 0 0 0 0 0 0 1 2 0 0 0 0 0 0 0 0 1 * 3 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1 DL 0 1 1 D I/D C * * S 4 0 0 0 1 B 5 S/C R/L N F * 6 * 7 字符发生存贮器地址 8 1 显示数据存贮器地址 BF 计数器地址 9 10 11 写数到CGRAM或DDRAM) 1 从CGRAM或DDRAM读数 1 0 要写的数据内容 1 读出的数据内容 表3-3 控制指令 其中*代表任意电平

1602液晶模块的读写操作、屏幕和光标的操作都是通过指令编程来实现的。(说明:1为高电平、0为低电平)

指令1: 清显示,指令码01H,光标复位到地址00H位置。 指令2: 光标复位,光标返回到地址00H。

指令3: 光标和显示模式设置 I/D:光标移动方向,高电平右移,低电平左移 S:屏幕上所有文字是否左移或者右移。高电平表示有效,低电平则无效。

指令4: 显示开关控制。 D:控制整体显示的开与关,高电平表示开显示,低电平表示关显示 C:控制光标的开与关,高电平表示有光标,低电平表示无光标 B:控制光标是否闪烁,高电平闪烁,低电平不闪烁。

指令5:光标或显示移位 S/C:高电平时移动显示的文字,低电平时移动光标。

17 -

指令6: 功能设置命令 DL:高电平时为4位总线,低电平时为8位总线 N:低电平时为单行显示,高电平时双行显示 F: 低电平时显示5x7的点阵字符,高电平时显示5x10的点阵字符。

指令7: 字符发生器RAM地址设置。

指令8:读忙信号和光标地址 BF:为忙标志位,高电平表示忙,此时模块不能接收命令或者数据,如果为低电平表示不忙。

3.5.3 液晶的读写时序:

读状态 写指令 读数据 写数据 输入 输入 输入 输入 RS=L,R/W=H,E=H 输出 D0—D7=状态字 RS=L,R/W=L,D0—D7=指令码,E=高脉冲 输出 RS=H,R/W=H,E=H输出D0—D7=数据 RS=H,R/W=L,D0—D7=数据,E=高脉冲 输出 表3-4 液晶的读写时序表 3.5. 4 1602液晶与单片机的接口设计

1602字符型液晶可以支持4位和8位并行通信,在这里我采用8为并行通信的方式。液晶1602属于慢显示器件,本系统单片机所要处理的程序比较多,如果采用串行通信,液晶显示可能不流畅,所以液晶与单片机采用并行接口。通过调节滑动变阻器旋钮来改变VL引脚的电压从而调节液晶的对比度。液晶的RS端接在了单片机的P2.7口,由于本系统只需要向液晶写数据所以RW端直接接地,使能端E接在了单片机的P2.6口。数据端与单片机的P0口相连,提供液晶显示的数据。液晶与单片机的接口如图3-8所示:

- 18 -

图3-8 液晶硬件连接图

3.6 AD转换电路设计

本系统的电压是通过电阻分压后的0-5v的电压信号送往AD采集后转化成数字量送往单片机在进行运算还原成与电压信号对应的数字量,然后再液晶上显示,电流采样类似电压采用,即采样电阻上流过的电流值产生的电压信号来获取与之对应的电流值。这其中都必须用到AD模数转化芯片,本系统采用ADC0832作为AD采用芯片。

3.6.1常用AD转换器简介

常用AD转换器有并行比较型,反馈比较型,和间接AD转换器。

并行比较型由电压比较器,寄存器和代码转换器三部分组成,其特点是:由于转换时并行的,其转换时间只受比较器、触发器和编码电路延迟时间限制,因此转换速度快;随着分辨率的提高元件数目要按几何级数增加;使用这种含有寄存器的并行AD转换电路时,可以不用附加积分保持电路。

反馈比较型经常常用的是计数型和逐次比较型两种方案;转换电路由比较器,DA转换器,计数器脉冲源,控制门以及输出寄存器组成。逐次比较型AD转换器完成一

19 -

次转换所需时间与其位数和时钟脉冲频率有关,位数越少,时钟频率越高,转换所需时间越短。这种AD转换器具有转换速度快,精度高的特点。

间接AD转换器有电压-时间变换型和电压-频率变换型两类。间接转换型AD,主要就是将输入的电压信号转换成时间量或者频率量来实现的,目前使用的不多。

3.6.2 ADC0832介绍

ADC0832 是一种8 位分辨率、双通道A/D转换芯片。由于它体积小,兼容性,性价比高而深受单片机爱好者及企业欢迎,其目前已经有很高的普及率。 输入输出电平与TTL/CMOS相兼容,输入电压在0~5V之间,且 工作频率可达到250KHZ,转换时间仅为32μS。且据有双数据输出可作为数据校验,以减少数据误差,转换速度快且稳定性能强。独立的芯片使能输入,使多器件挂接和处理器控制变的更加方便。通过DI 数据输入端,可以轻易的实现通道功能的选择。

引脚功能

? CS 片选使能,低电平芯片使能。

? CH0 模拟输入通道0,或作为IN+/-使用。 . ? CH1 模拟输入通道1,或作为IN+/-使用。 ? DI 数据信号输入,选择通道控制。 ? DO 数据信号输出,转换数据输出。 ? CLK 芯片时钟输入。

? Vcc/REF 电源输入及参考电压输入(复用)。 单片机对ADC0832 的控制原理:

电路设计时可以将DO,DI,CLK分别接在单片机的P3.3,P3.4,P3.5端。当要进行A/D转换时,须先将CS使能端置于低电平并且保持低电平直到转换完全结束。此时芯片开始转换工作,同时由处理器向芯片时钟输入端CLK 输入时钟脉冲,DI端则使用DI端输入通道功能选择的数据信号。在第1 个时钟脉冲的下沉之前DI端必须是高电平,表示启始信号。在第2、3个脉冲下沉之前DI端应输入2 位数据用于选择通道功能,当此2 位数据为“1”、“0”时,只对CH0 进行单通道转换。当2位数据为“1”、“1”时,只对CH1进行单通道转换。当2 位数据为“0”、“0”时,将CH0作为正输入端IN+,CH1作为负输入端IN-进行输入。当2 位数据为“0”、“1”时,将CH0作为

- 20 -

负输入端IN-,CH1 作为正输入端IN+进行 ,本次才用通道0,和通道1进行AD转换,ADC0832与单片机的接口电路如图3-9所示:

图3-9 ADC0832与单片机接口

第4章 软件设计

4.1主程序设计

本设计程序主要包括:系统初始化模块、测量模块、串行通信模块、看门狗程序模块、显示模块五部分组成。系统初始化模块包括内存单元和变量缓冲区的初始化、定时器设置、中断向量设置和各芯片引脚的初始化定义等内容。测量模块主要完成对和扭矩的测量工作,也是本次设计所要完成的主要工作。串行通信模块实现数据与计算机的相互收发,以便于计算机对过程进行控制。看门狗程序模块是对单片机系统进行保护作用,当系统跑飞或者出现其他异常现象时完成对系统的复位。显示模块是完成对测量结果的显示功能,整个测量系统所要完成的工作就是测量扭矩和值,并将其显示出来,因此显示模块也是非常重要的部分。

主程序设计首先要对这个系统进行初始化,然后开中断,开始对扭矩和进行测量。接着调用显示子程序,将测量结果显示出来。本次设计还需要完成与计算机的数据交换,因此需要一个串行通信程序,通过485总线与计算机进行数据传输。主程序流程图如图4-1所示。

21 -

开始系统初始化开中断开始测量调显示子程序完成与PC机的数据交换结束

图4-1 软件程序总流程图

- 22 -

4.2 初始化程序设计

系统的初始化是既复杂又很重要的工作。初始化程序主要完成对设计中使用的存储单元的初始化、串行通信的初始化、看门狗电路的初始化、1602的初始化、T0、T1、T2的初始化和中断向量的设置。

图4-2初始化程序流程图

23 -

4.3 测量子程序设计

测量子程序主要完成转矩和转速的测量。转速的测量是根据公式N=60×C/(T×P)所得,利用定时器T2定时测量时间1分钟,T1对1分钟内信号脉冲个数进行计数,再根据转速测量公式计算出转速值。转矩的测量是根据公式T=5×R×F×T1/T2所得,利用T0的GATE门来测量信号的相位差,即T1,根据前面转速测量时得出的值可计算出信号的周期,即T2=60/C,然后再根据转矩测量公式计算出转矩的值。转速和转矩的程序流程图分别如4-3和4-4所示。

- 24 -

4-3转速测量程序流程图 25 -

图4-4 转矩测量程序流程 图

4.4 串口通信程序设计

串口通信程序主要包括两个部分,一个是将计算机发来的数据传给单片机,另一部分是将单片机传来的数据通过串口发给计算机,在主程序里直接调用即可。下面给出这个子程序流程图。

图4-5 串口中断服务程序流程图

- 26 -

4.5 看门狗程序设计

本文的看门狗程序设计的框图如下图所示

图4-6 看门狗程序设计框图

看门狗电路的定时时间长短可由具体应用程序的循环周期决定,通常比系统正常工作时最大循环周期的时间略小即可。编程时,可在软件的合适的地方加一条喂狗指令,使看门狗的定时时间永远达不到预置时间,系统就不会复位而正常工作。当系统跑飞,用软件陷阱等别的方法无法捕捉回程序时,则看门狗定时时间很快增长到预置时间,迫使系统复位。

看门狗定时器的预置时间是通过X5045的状态寄存器的相应位来设定的。 X5045状态寄存器共有6位有含义,其中WDl,WD0和看门狗电路有关,其余位和EEPROM的工作设置有关。

W Dl= 0, WD0=0, 预置时间为1.4s W Dl= 0, WD0=1, 预置时间为0.6s W Dl= 1, WD0=0, 预置时间为0.2s

27 -

W D1=1, WD0=1, 禁止看门狗工作。

结论与展望

本文设计的基于ZJ型传感器的扭矩测量仪采用了相位差测量技术,结合了单片机处理技术,完成了对扭矩的高精度测量,并且采用数字化显示功能。解决了传统扭矩测量仪结构庞大、能耗大、容易产生误差且测量范围受限制等问题。

用单片机实现的扭矩测量系统不仅可以高精度的测量扭矩值的大小,而且在加入了串行通信后还能方便的与计算机进行数据发送和接收,以实现智能化控制。本次课题采用的以ZJ型传感器为基础、AT89C52单片机系统为核心的设计方案,与以往的扭矩测量系统相比有以下几个优点:

? 智能化设计,精度高,能够对扭矩进行较准确地测量; ? 控制电路简单易懂; ? 增强了系统的抗干扰功能; ? 附加其它功能简单、方便。

本次设计使用的ZJ型传感器由于本身工艺的限制,测量精确度以及测量范围等还受到一定程度的限制,所以本次设计的扭矩测量仪还有一些不足。但随着现代传感器技术发展越来越快,各种新型的、智能化的传感器将会不断被研制出来。所以我们将可以选择更好的传感器来代替设计中的传感器,以使测量系统功能更加完善。

现在的测量仪正在朝着高精度、宽测量范围、小体积、低价格等方向发展,而本次设计的扭矩测量仪就是一种精度高、测量范围宽的数字化测量系统。因此本次课题研究具有很广阔的发展前景和价值。随着技术的不断发展,可以在本次课题研制的扭矩测量系统中选择更精良的传感器以增加其测量精度和测量范围。还可以添加报警电路和更好的抗干扰系统,以提高整个测量系统的稳定性、安全性和抗干扰功能。

- 28 -

致 谢

毕业设计即将结束了,这也是我在大学阶段的最后一次设计。我的导师给本人提供了良好的设计条件和细心的指导。导师前瞻性的科学思维、宽广的专业知识和兢兢业业的工作精神,令我敬佩,使我受益匪浅。在导师的指导和帮助下,我顺利地完成了这次设计任务,在此向我的导师致以最诚挚的感谢!从一开始选题的确定,到开题报告的完成、初稿的修改,定稿的调整,以及论文格式方面的问题,直至终稿,自始至终导师都给予了大量的关心与帮助,这使我在完成论文的过程中很是受益,在此再次深表感谢。此次毕业设计既是对我大学四年所学知识的总结与运用也是对我即将步入社会,走向工作岗位前的一次考验与检查。虽然毕业设计已经完成了,但是,由于自己所学的知识有限,我们在设计中遇到很多问题,在很多方面还不够全面,我希望在以后的工作和专业发展中,导师能继续给以指导和帮助下学到更多有关的知识,来充实自己!

最后,还要感谢母校一直关心我的老师和领导!

29 -

参考文献

[1] 王幸之,钟爱琴,王雷,王闪.AT89C51系列单片机原理与接口技术[M].北京 航空航天大学出版社,2004.5

[2] 王幸之.单片机应用系统抗干扰技术[M].北京:北京航空航天大学出版社,2004. [3] 冯建华,赵亮. 单片机应用系统设计与产品开发[M]. 北京:人民邮电出版社, 2004.11

[4] 张有颐.扭矩测量技术[M].北京:中国计量出版社,1986

[5] 李敏,孟臣,文凯.数字式高精度扭矩测量仪的研制[J].电工技术杂志, 2004年01期,80-82

[6] 张凤生,张光辉.基于单片机的扭矩测量系统[J].仪表技术与传感器, 2000年06期,21-23

[7] 孟祥贵,杨辉林,潘孟春. 无源RS-232/RS-485智能转换器[J]. 湖南大学学报(自 然科学版),2004年02期,43-45

[8] 周凯,郭黎利.采用MAX485实现单片机与PC机串行通信的一种方法[J].应用 科技,2003年03期,27-29

[9] 赵思宏,范惠林.电机扭矩测量方法的分析[J].光学精密工程,2002年6月10 卷3期,290-295

[10] 柳永林,宋汝江,田真银,刘国红.PCDIY最新显示器集成电路大全[M].北京 希望电子出版社,2002.12,

[11] 秦岭,高宁宁.基于ZJ型传感器的扭矩测量仪研制[J].南通职业大学学报, 2004年12月第18卷第4期,12-15

[12] 阎石主编.数字电子技术基础(第4版)[M].北京:高等教育出版社,1998 [13] 康华光主编.模拟电子技术基础(第4版)[M].北京:高等教育出版社,1999 [14] 雷尧,郝红旗.S3C44B0X同步串口(SIO)驱动ZLG7289的设计与编[J].科技信 息(学术研究),2007年07期,72-76

[15] 潘永雄. 新编单片机原理及应用[M].西安:安电子科技大学出版社,2003. [16] Alan reeve. Fieldbus routes and timetables. Control & instrumentation [J], 1995.5,153-155

[17]AT89C52.DataShee[EB/OL].http://www.atmel.com/dyn/products/product_card

- 30 -

附录一、 硬件原理图

31 -

附录二、 主要参考文献及摘要

[1] 王幸之,钟爱琴,王雷,王闪.AT89C51系列单片机原理与接口技术[M].北京航空航天大学出版社,2004-5-1

摘要:AT89C51系列单片机以其优良的性能和价格优势,成为取代MCS51单片机的主流机型之一,有着十分广阔的应用前景。全书共分8章,系统而详细地介绍了AT89C51系列的17种型号单片机的结构、原理及特点;单片机指令系统及程序设计;并行和串行扩展技术及常用外围芯片的应用举例;功率接口和控制技术;还介绍了各种型号单片机的主要电气性能、封装形式和型号选用指南。

[2] 张有颐.扭矩测量技术[M].北京:中国计量出版社,1986

摘要:本书比较全面地论述扭矩测量的原理和方法,系统地介绍了各种光学、光电、磁电、磁弹、相位、应变、电容、机械、液压、气动和钢弦等测量传感器和仪器;对扭矩测量传感器的弹性元件的设计制造方法和扭矩信号的传输方式作了专门的叙述;分别介绍了各种水力、电力、涡电流、磁粉等扭矩测量装置和用电机、飞轮测量扭矩的方法。

[3] 李敏,孟臣,文凯.数字式高精度扭矩测量仪的研制[J].电工技术杂志,2004年01期,80-82

摘要:介绍一种由JN338数字式扭矩传感器与单片机构成的数字式扭矩测量仪,仪器具有全数字、测试精度高、智能化程度高的特点。具体阐述了传感器及硬件电路结构,并给出了软件设计流程图。

[4] 张凤生,张光辉.基于单片机的扭矩测量系统[J].仪表技术与传感器, 2000年06期,21-23

摘要:采用ZJ型扭矩传感器和8098单片机构成了小型智能化的相位式扭矩测量系统。它是利用8098单片机的高速输入HSI部件对传感器输出的两路同频交变信号进行比相和“测频”来获取扭矩信息。系统硬件构成简单、测量实时性好、精度高、抗干扰能力强 ,既可测高下的扭矩 ,也可测低 (乃至零 )下的扭矩。

[5] 孟祥贵,杨辉林,潘孟春. 无源RS-232/RS-485智能转换器[J]. 湖南大学学报(自然科学版),2004年02期,43-45

摘要:设计了一种无源的RS-232 /RS-485智能转换器 ,详细说明了从RS-232串口上窃取电源以及完全由硬件控制MAX485收发使能的硬件实现电路。该转换器体积小、电

- 32 -

路结构简单、工作可靠等特点 ,能满足大部分工业现场的使用要求。

[6] 周凯,郭黎利.采用MAX485实现单片机与PC机串行通信的一种方法[J]. 应用科技,2003年03期,27-29

摘要:介绍MAX485芯片的使用和采用MAX485接口的通信电路,给出MCS51单片机与PC机之间的点对点串行通信程序设计。

[7] 秦岭,高宁宁.基于ZJ型传感器的扭矩测量仪研制[J].南通职业大学学报, 2004年12月第18卷第4期,12-15

摘要:本文介绍了一种基于ZJ型传感器的扭矩测量仪的设计。该测量仪采用了单片机技术,因此能对信号进行快速采样、即时分析、精确显示。

[8] 阎石主编.数字电子技术基础(第4版)[M].北京:高等教育出版社,1998 摘要:本书主要内容包括:数字逻辑基础、逻辑门电路、组合逻辑电路的分析和设计、常用组合逻辑功能器件、触发器、时序逻辑电路的分析和设计、常用时序逻辑功能器件、存储器和可编程逻辑器件、脉冲的产生与变换、模数与数模转换器和数字系统设计基础。

[9] 康华光主编.模拟电子技术基础(第4版)[M].北京:高等教育出版社,1999 摘要:本书主要介绍了电子系统与信号,半导体二极管及其基本电路,半导体三极管及放大电路基础,场效应管放大电路,功率放大电路,集成电路运算放大器,反馈放大电路,信号的运算与处理电路,信号产生电路,直流稳压电源和电子电路的计算机辅助分析与设计。

[10] 雷尧,郝红旗.S3C44B0X同步串口(SIO)驱动ZLG7289的设计与编程[J].科技信息(学术研究),2007年07期,72-76

摘要:本文详细的介绍了S3C44B0X同步串口(SIO)编程原理以及ZLG7289芯片驱动键盘和LED显示的功能介绍,在此基础上给出了同步串口(SIO)驱动ZLG7289芯片来实现键盘和LED的设计和编程。

[11] 雷升印,周元志.X5045芯片在单片机系统中应用的研究[J].武汉理工大学学报(信息与管理工程版),2003年03期,28-31

摘要:X5045芯片是美国Xicor公司生产的集把关定时器、电压监控功能于一体的专用集成芯片。介绍了把关定时器X5045芯片的结构,功能和工作原理,以及在单片机系统中的应用实例;给出了X5045芯片与AT89C52单片机的硬件接口电路。

33 -

附录三、部分程序清单

#include #include #include #define DATA_1602 P0 #define uchar unsigned char #define uint unsigned int

void Init_Device(void); void Reset_Sources_Init(void); void UART0_Init (void); void SYSCLK_Init (void); void PORT_Init (void); void Timer_Init(void); void ADC_Init(void); void Interrupts_Init(void);

void delaynus(unsigned int q); void ADC (void); void LED_Disply(void);

void vUart0SendByte(unsigned char Num); void LiangChengPanDuan(void); void ADResult_Out(void);

//----------------------------------------------------------------------------- // Global CONSTANTS

//-----------------------------------------------------------------------------

#define BAUDRATE 115200 // Baud rate of UART in bps #define SYSCLK 11059200 // SYSCLK frequency in Hz

- 34 -

//定义数据口

#define LED P2 #define LED_CS P3 #define SHIFTSELECT P1

unsigned int pdata i = 0; // delaynms counter unsigned char pdata Count_124us = 0; // timer0 106.5us unsigned int pdata Count_20ms = 500; //UART output times unsigned char pdata Count_DuZhuan = 0; unsigned char pdata Zero_count = 0; unsigned char pdata Test_count = 0; unsigned char pdata maoci_count = 0;

unsigned char ZeroTest_Flag = 0x00;

unsigned char data ManZai_ZhuanJu = 0;

unsigned char pdata LED_Ge = 0; unsigned char pdata LED_Shi = 0; unsigned char pdata LED_Bai = 0; unsigned char pdata LED_Qian = 0;

unsigned char pdata UARTOut[8] = {0x95,0x00,0x00,0x00,0x00,0x00,0x00,0x00};

unsigned char pdata YYY = 0;

signed int pdata AD_VAL = 0; unsigned int pdata AD_Result = 0;

35 -

unsigned int xdata ad_arr[8] = {0}; float xdata AD_VAL_SUM = 0;

unsigned int xdata AD_Result_ago = 0; unsigned int xdata AD_Result_max = 0; unsigned int xdata AD_Result_maoci = 0;

unsigned int xdata AD_ZhuanJu = 0;

unsigned int xdata AD_ZhuanJu_max = 0;

unsigned char xdata table[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //----------------------------------------------------------------------------- // MAIN Routine

//----------------------------------------------------------------------------- sbit LCDRS=P2^6; sbit LCDEN=P2^7; sbit ADC_CS=P2^6; 为是个半双工

sbit ADC_CLK=P2^5; sbit ADC_DO =P2^4; sbit ADC_DI =P2^3;

/*******************************************************************/

unsigned int Voltage(bit bi);

- 36 -

//CS 是必须的,但DI和DO可以接在一起,因

//di和do不同时传输数据

uchar code Num[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39}; void Delay(uint z) { uint x,y; for(x=0;x

}

void Write_1602_Com(uchar com)//液晶送指令 {

LCDRS=0; DATA_1602=com; Delay(5); LCDEN=1; Delay(5); LCDEN=0; }

void Write_1602_Date(uchar date)//液晶送数据 {

LCDRS=1; DATA_1602=date; Delay(5); LCDEN=1; Delay(5); LCDEN=0; }

void Init_Lcd() {

37 -

for(y=0;y<100;y++); //可能得大些,

//50在仿真上是可以显示的,实物的话

// LCDEN=0;

Write_1602_Com(0x38);//定义为液晶状态 Write_1602_Com(0x0c);//开显示,关光标和闪烁 Write_1602_Com(0x01);//清屏 Write_1602_Com(0x80);//数据指针归零 Write_1602_Com(0x06);//光标加一,自动加一 }

/*次函数有用于将数据指针移到相应的位置x,行,y第几个*/

void Write_Pos(uchar x,uchar y) {

uchar posit; if(x==1)

posit=0x80+y-1;

if(x==2)

posit=0xc0+y-1;

Write_1602_Com(posit); }

/*此函数用于显示0-999的数字,例如13显示13不是013,*/ void Dis_Num_Zh(uint uhour) {

if(uhour>=100) { }

- 38 -

Write_1602_Date(Num[uhour/100]); Write_1602_Date(Num[uhour0/10]); Write_1602_Date(Num[uhour] );

else

if(uhour>=10) {

Write_1602_Date(0x20); }

Write_1602_Date(Num[uhour/10]);

Write_1602_Date(Num[uhour] );

else

{ }

Write_1602_Date(0x20); Write_1602_Date(0x20);

Write_1602_Date(Num[uhour] );

Write_1602_Date('0'); }

/*此函数用于显示,0-9的数***********************/ /*

void Dis_num_deci(uchar uhour) { } */

/*显示字符串,x第几行,y第几个位置,然后字符窜内容,l代表字符串的长度*/

39 -

Write_1602_Date(Num[uhour/10]);

void Dis_Str(uchar x,uchar y,uchar *p) {

switch(x) { }

Write_1602_Com(y); while(*p) }

/*此函数用来显示数字,在什么位置需在里面修改 ,参数,3个数如12,11,10

void Dis_Num(uchar uhour) {

// write_date(num[uhour/100]); }

void Dis_Jump(uchar x,uchar y,uchara) {

if(x==1)y=y+0x80-1; if(x==2)y=y+0xc0-1;

- 40 -

case 1:y=0x80+y-1;break; case 2:y=0xc0+y-1;break;

{ }

Write_1602_Date(*p); p++;

Write_1602_Date(Num[uhour0/10]); Write_1602_Date(Num[uhour] );

Write_1602_Com(y);

Write_1602_Date(0x20);//送个空使这一位跳 Write_1602_Date(0x20); } */

//x代表第几行,y第几个,ge代表空格的个数

void KGE(uchar x,uchar y,uchar ge) { y--;

if(x==1)y|=0x80; if(x==2)y|=(0x80+0x40); Write_1602_Com(y); for(i=0;i

Write_1602_Date(0x20); }

/***********************************************************************

使用此函数时,需要先配置CS,DI,DO,CLK端口,通过调用函数Voltage(bi)函数

来读取相应通道的数据,其中bi为通道,其值为0,1,代表通道0和通道1.无需初始化

**********************************************************************/

/*******************************************************************/

void Delays(unsigned char x)

41 -

uchar i;

{

unsigned char i;

for(i=0;i

/*******************************************************************/

unsigned char ReadADC(bit dat) //把模拟电压值转换成8位二进制数并返回,dat为通道选择。

{

unsigned char i,ch=0; ADC_CS=0;

ADC_DO=0;//片选,DO为高阻态 Delays(10); ADC_CLK=0; Delays(2); ADC_DI=1; ADC_CLK=1;

Delays(2);//第一个脉冲,起始位 ADC_CLK=0; Delays(2);

ADC_DI=1; ADC_CLK=1;

Delays(2);//第二个脉冲,DI=1表示双通道单极性输入 ADC_CLK=0; Delays(2);

ADC_DI=dat; /*******************************/

ADC_CLK=1;

- 42 -

Delays(2);//第三个脉冲,DI=1表示选择通道1(CH2) ADC_DI=0;

ADC_DO=1;//DI转为高阻态,DO脱离高阻态为输出数据作准备 ADC_CLK=1;

Delays(2);

ADC_CLK=0;

Delays(2);//经实验,这里加一个脉冲AD便能正确读出数据, //不加的话读出的数据少一位(最低位d0读不出) for(i=0;i<8;i++) {

ADC_CLK=1; Delays(2); ADC_CLK=0; Delays(2);

ch=(ch<<1)|ADC_DO;//在每个脉冲的下降沿DO输出一位数据,最终ch为8位二进制数

}

ADC_CS=1;

return(ch);//把转换结果返回 }

/*******************************************************************/

unsigned int Get_Voltage(bit bi) {

uchar vol=0; uint dat;

vol=ReadADC(bi);

43 -

dat=(int)(100*vol)/51; //51是由5/255的倒数得来的,5是5V,255是8位AD。 return(dat); }

void main(void) {

Init_Device();

LiangChengPanDuan();

while (1) { WDTCN = 0xa5; for(i = 0;i<8;i++) { ADC();

}

ADResult_Out();

if(Count_124us>159)

{ if(ZeroTest_Flag == 0x01) { Count_20ms++;

if(Count_20ms >= 1000) //30s { AD_Result = 0; AD_Result_max = 0;

AD_Result_ago = 0;

- 44 -

game over,start again

}

}

}

Count_20ms = 0; ZeroTest_Flag = 0x00;

Count_124us = 0;

} }

//----------------------------------------------------------------------------- // Initialization Subroutines

//----------------------------------------------------------------------------- void Init_Device(void) {

//WDTCN = 0xde; // disable watchdog timer //WDTCN = 0xad; Reset_Sources_Init();

SYSCLK_Init();

PORT_Init (); Timer_Init(); ADC_Init(); UART0_Init(); Interrupts_Init(); }

void Reset_Sources_Init(void) {

WDTCN = 0x06;

45 -

}

//----------------------------------------------------------------------------- // PORT_Init

//----------------------------------------------------------------------------- void PORT_Init (void) {

PRT1CF = 0xF8; // P1.0 P1.1 P1.2 is input port //0xFF; PRT2CF = 0xFF;

PRT3CF = 0x0F; XBR0 = 0x04; XBR1 = 0x00; XBR2 = 0xC0; }

//----------------------------------------------------------------------------- // SYSCLK_Init

//----------------------------------------------------------------------------- void SYSCLK_Init (void) {

OSCXCN = 0x67; // start external oscillator with for (i=0; i < 256; i++) ; // XTLVLD blanking interval (>1ms) while (!(OSCXCN & 0x80)) ; // Wait for crystal osc. to settle OSCICN = 0x88; // select external oscillator as SYSCLK

}

//----------------------------------------------------------------------------- // UART0_Init

//----------------------------------------------------------------------------- void UART0_Init (void)

- 46 -

{

SCON = 0x50; // SCON: mode 1, 8-bit UART, enable RX

TMOD = 0x21; // TMOD: timer 1, mode 2, 8-bit reload

TH1 = -(SYSCLK/BAUDRATE/16); // set Timer1 reload value for baudrate

TR1 = 1; // start Timer1

CKCON |= 0x10; // Timer1 uses SYSCLK as time base PCON |= 0x80; // SMOD = 1 TI = 1; // Indicate TX ready }

//----------------------------------------------------------------------------- // timer0 timer1_Init

//----------------------------------------------------------------------------- void Timer_Init(void) {

TCON = 0x54; TMOD = 0x21; TL0 = 0x90; TH0 = 0xFF; //124us

TH1 = -(SYSCLK/BAUDRATE/16); // set Timer1 reload value for baudrate //0xDC;

CKCON = 0x14; //timer1 and timer0 systerm clock }

//----------------------------------------------------------------------------- // ADC_Init

47 -

//----------------------------------------------------------------------------- void ADC_Init(void) {

AMX0CF = 0x01; //0x60; // AIN0 and AIN1 work as comparator AMX0SL = 0x00;

// select AIN0 and AIN1 without others

ADC0CF = 0x62; // SAR convert colock is 8 systerm colck, fang da 4 bei

ADC0CN = 0x40; //0x00; // ADC Control Register }

void Interrupts_Init(void) {

IE = 0x82; }

void ADC(void) {

ADCINT = 0; ADBUSY = 1; while (!ADCINT); ADCINT = 0; _nop_(); _nop_();

_nop_(); //*AD_POINTER = ADC0 AD_VAL = (ADC0H << 8) + ADC0L ; if(AD_VAL < 0)

{

AD_Result_maoci = (unsigned int)((AD_VAL ^ 0x7fff) + 1); // (AD_VAL

REF0CN = 0x03; ADC0CN |= 0x80;

^ 0x7fff) + 1; // 2的补码 返回到 原值

- 48 -

AD_Result_maoci = AD_Result_maoci + 18; /// 9 2bei 18 4bei sui

zeng yi bian hua

AD_Result_maoci = (AD_Result_maoci & 0x7fff); //CW

}

else if(AD_VAL < 18) { AD_VAL = AD_VAL - 18;

AD_Result_maoci = (unsigned int)(AD_VAL ^ 0x7fff) + 1; 回到 原值

AD_Result_maoci = (AD_Result_maoci & 0x0fff) ;

}

else { AD_Result_maoci = (unsigned int)AD_VAL;

AD_Result_maoci = AD_Result_maoci - 18; }

ad_arr[i] = AD_Result_maoci;

}

void ADResult_Out(void) {

AD_VAL_SUM = 0;

for(YYY = 0;YYY <8;YYY++) { AD_VAL_SUM += ad_arr[YYY] ; ad_arr[YYY] = 0;

}

49 -

// 2的补码 返

//CCW

AD_Result_maoci = (unsigned int)(AD_VAL_SUM/2.68); // (0~200mV 显示 0~2000)

if(AD_Result_maoci <= 100) { } else {

if(((AD_Result_maoci+2)>=AD_Result_ago)&&((AD_Result_maoci-2)<=AD_Result_a

Test_count ++ ; if(Zero_count >=1) if(Test_count >= 4) {

ZeroTest_Flag = 0x01; Test_count = 4;

Zero_count --;

Zero_count ++;

if(Test_count >=1) Test_count --; if(Zero_count >=4)

{ }

Zero_count = 4; AD_Result = 0;

go)) ;

else {

if(AD_Result_maoci > (AD_Result_max + 40)) {

maoci_count ++;

- 50 -

本文来源:https://www.bwwdw.com/article/l20r.html

Top