基于STC12C5410AD单片机的倾角测试系统方案设计书

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

摘要
本文详细介绍了一种利用加速度传感器、转换器、单片机实现高精度倾角测量的方法。

给出了利用加速度传感器测量倾角的原理提出了整体设计方案。

实验证明该系统工作稳定可靠并对角度传感器进行了研究;分析了不同角度传感器的特性及应用特点。

研究了磁敏角度传感器在拉线式位移传感器的设计与应用,倾角传感器的原理、特点。

结果表明角度传感器具有无触点、高灵敏度、接近无限转动寿命、无噪声、高重复性、高频响应特性好等特点,且广泛应用于航天、航空、国防、科技和工农业生产等各个领域中。

关键词:STC12单片机。

加速度传感器。

角度测量
\
Abstract
The angle sensor is studied。

analyzes the characteristics and application of the characteristics of different angle sensor,and the magnetic angle sensor in the design and application of Guyed displacement sensor, principle, characteristics of the inclination sensor. The results show that the angle sensor has no contact, high sensitivity, close to life, no noise, rotating infinitely high repeatability, high frequency response characteristic and so on, which is widely used in aerospace, aviation, national defense, science and technology and the production of industry and agriculture and other fields.
Key words: STC12 MCU。

Acceleration Sensor。

Measurement of angle
1 绪论
1.1 引言
在科学技术高速发展的现代社会中,人类已经入瞬息万变的信息时代,人们在日常生活,生产过程中,主要依靠检测技术对信息经获取、筛选和传输,来实现制动控制,自动调节,目前我国已将检测技术列入优先发展的科学技术之一。

传感器技术是现代测量和自动化系统的重要技术之一,从宇宙开发到海底探秘,从生产的过程控制到现代文明生活,几乎每一项技术都离不开传感器,因此,许多国家对传感器技术的发展十分重视,如日本把传感器技术列为六大核心技术(计算机、通信、激光、半导体、超导体和传感器) 之一。

智能传感器已广泛应用于航天、航空、国防、科技和工农业生产等各个领域中。

例如,它在机器人领域中有着广阔应用前景,智能传感器使机器人具有类人的五官和大脑功能,可感知各种现象,完成各种动作。

在工业生产中,利用传统的传感器无法对某些产品质量指标(例如,黏度、硬度、表面光洁度、成分、颜色及味道等)进行快速直接测量并在线控制。

而利用智能传感器可直接测量与产品质量指标有函数关系的生产过程中的某些量(如温度、压力、流量等)。

精密倾角度调测是几何量测量的一个重要工程,也是计量科学中发展较为完备的一个分支,在过去的20年中,倾角度调测的精度也提高了10倍多。

倾角度调测技术分为静态调测和动态调测两种,某些静态调测技术仍然是动态调测的基础,一些动态调测技术可以实现静态调测。

目前,很多重要的测控仪器,如陀螺转台、惯导平台、经纬仪、星体跟踪器、雷达、导弹发射架、空间望远镜、高精度数控机床、机器人等系统中一般都需要角度传感器,用于测量被测物体相对于某基准方位的绝对转角或相对于自身在不同时刻的相对转角、倾角。

1.2 本文主要工作及章节安排
本文以单片机STC12C5410AD单片机为核心搭建硬件平台,使用加速度传感器MMA7260Q测量物体倾斜角度,并利用串口实现数据的传输。

并进行了实际实验。

本文分五章对研究课题进行阐述:
第一章:绪论。

阐述课题的背景及意义,研究现状。

第二章:倾角测量系统硬件设计。

详细介绍了以STCSTC12C5410AD为核心的硬件电路设计,包括倾角采集模块、串行通信模块、微处理器外围电路。

重点介绍了基于加速度传感器MMA7260Q的数据采集模块、微处理器模块的电路设计。

第三章:倾角测量系统软件设计。

重点介绍了下位机程序,包括数据采集程序和数据存储通信程序,并对各个子程序进行了详细介绍。

第四章:给出了实验的方法及测试结果,对倾角测试的原理及倾角的计算做出了详细介绍。

2 倾角测试系统设计
2.1 硬件功能及总体结构
系统由单片机、倾角传感器、键盘编码器、键盘、数码管驱动器和数码管等组成。

系统的功能是通过倾角传感器采集角度信息,传送给单片机。

通过LED数码管显示时间角度信息。

配备有声光报警电路,并通过键盘修改相应参数,通过串口完成与上位机的通信[8,9]。

系统结构如图2.1所示。

图2.1系统结构图
2.2 信号采集模块
2.2.1 加速度传感器MMA7260Q简介
MMA7260Q是一种低成本单芯片三轴向高灵敏度加速度传感器,基于表面微机械结构,集成信号调理电路、单极点低通滤波器和温度补偿部分,并且具有4种不同的灵敏度选择模式。

同时它包含一种睡眠模式,MMA7260Q能在XYZ 三个轴向上以极高的灵敏度读取低重力水平的坠落、倾斜、移动、放置、震动和摇摆[10]。

主要具有以下特点:
三轴向加速度测量;
测量范围可选:±1.5g、±2g、±4g、±6g;
μ;
低功耗,工作电压:2.2V~3.6V,工作电流500A
μ;
休眠模式:3A
封装:16引脚6mm⨯6mm⨯1.45mmQFN封装;
高灵敏度:800mV/g(量程为±1.5g);
启动时间短:1ms;
低噪音:达到更高的分辨率、更高的精确度。

2.2.2结构与原理
1.结构
MMA7260Q功能框图如图2.2所示。

在IC内部主要由双芯片构成,即重力检测单元(负责加速度的侦测)与IC控制单元(负责信号处理) 。

重力检测单元将检测到的加速度变化量信号送到C - V转换电路,而后进行取样、保持及信号放大处理,最后用低通滤波器滤除高频噪音,在温度补偿处理后即可输出加速度信息。

VDD
g-select2
Sleep Mode
VSS
图2.2MMA7260Q功能框图
2.原理
重力感测单元(G - CELL)由基于半导体材料的微机械结构构造而成。

物理模型可以构造成一对固定的面板,中间包含一块可移动的面板,如图 2.3所示。

当系统被给定一加速度时,中间板就会漂移。

中间板移动时,它到一边(固定的面板)的距离增加,而到另一边的距离相应地减少,这种距离的变化可用来表征加速度。

G - CELL 的面板构成了两个背对背的电容,当中间面板随着加速度移动时,两个面板之间的距离就会改变,因此电容值也随之改变, C =Aε/D。

这里A是指面板面积,ε是介电常数,D是面板间距。

在ASIC (专用集成电路)(Application Specific Integrated Circuit)中使用开关电容测量出G-CELL 的电容值,并从他们的差值中解读出加速度数据。

ASIC再进行信号调
理和信号滤波(使用开关电容) ,最后输出正比于加速度的电压。

3
2
图2.3简化的换能物理模型
灵敏度选择( g - Select) :根据g - Select1、g - Select2两脚输入电平的不同,MMA7260Q具有4种灵敏度选择模式,如表2.1所示。

根据不同的产品应用可以选择不同的灵敏度,而且在应用时可以任意改变。

睡眠模式( Sleep Mode) :当要提供MMA7260Q 12引脚(Sleep Mode)低电平时,传感器在低功耗模式下运行,此时运行电流仅为3μA。

当提供其高电平时,传感器就会保持正常的运行模式。

表2.1 MMA7260Q灵敏度选择模式
可按照下面规则选择g值:1.5g适合自由落体或精确的倾斜补偿应用;2g 适合手持式运动检测或游戏控制;4g适合与低震动监控、运输和处理;6g适合高震动监控与较高的震动读取。

2.2.3 倾角测试模块电路设计
MMA7260Q的供电电压在2. 2~3. 6V之间,输出信号在0~3V以内,电源本采用3.3伏电压供电,而且输出的信号可直接输入STC12的A/D通道而不必对信号电压进行变换。

MMA7260Q与STC12单片机的接口电路如图 2.4所示。

Z 100UF X Y MMA7260G-selsect1
G-selsect2VSS VDD NC NC
NC NC NC NC NC NC XOUT ZOUT YOUT SleepMode REG1117-3.3IN GND OUT OUT C17
C160.1NF C19
10UF C200.01NF
VCC
C140.1UF 0.UF 0.UF 0.UF
C11
C12
C13R22R23R241K 1K 1K P2.7
图2.4接口电路图
本文应用中选择g 值为 1.5g ,加速度传感器灵敏度选择引脚g-select1、g-select2全部接为低电平。

计算公式如公式2-1所示。

off V =1.65 (2-1)
V
G ∆∆=800mv/g ,out V =0.85~2.45之间变化
给MMA7260Q 的12引脚(SleepMode )提供高电平,即不是工作在睡眠模式。

MMA7260Q 内部使用开关电容作为滤波器,为降低时钟带来的噪声,在输出通道上采用简单的RC 滤波,在输出通道上使用1k Ω的电阻和0. 1μF 的电容构成RC 滤波器即可(如图5, XOUT 、YOUT 、ZOUT ) 。

另外,A / D 采样率的选择不能干扰加速度计采样频率(11kHz) ,以防混叠误差。

2.3 LED显示模块
2.3.1 SPI简介
1.SPI简介
串行外设接口(Serial Peripheral Interface,简称SPI)实际上是一种串行总线接口标准,SPI方式可允许同时同步接收和传送8位数据,是一种全双工串行总线。

其速度比UART串行接口要快。

SPI支持在同一总线上将多个从机连接到一个主机。

同一总线上也可以有多个主机,当两个或多个主机试图同时进行数据传输时,需要进行碰撞检测[11]。

STC12C5410AD单片机集成了SPI接口,它是一个全双工高速同步通信接口,既可以和其他微处理器通信,也可以与具有SPI兼容接口的器件,如存储器、A/D转换器、D/A转换器、LED或LCD驱动器等进行同步通信。

SPI也可以在一个多主机系统中负责内部处理器之间的通信。

SPI接口有两种操作模式:主模式和从模式。

在主模式中支持高达3Mbit/s的速率(工作频率为12MHz时,如果CPU主频采用20MHz到36MHz,则可更高);从模式时速度无法太快,速度在fosc/8以内较好。

此外,SPI接口还具有传输完成标志和写冲突标志保护功能。

SPI接口由MISO(与P1.6共用)、MOSI(与P1.5共用)、SCLK(与P1.7)和/SS(与P1.4共用)4根信号线构成。

2.SPI接口的数据通信过程
在SPI中,传输总是由主机启动的。

作为主机时,如果SPI使能(SPEN=1)并选择作为主机,主机对SPI 数据寄存器的写操作将启动SPI时钟发生器和数据的传输。

在数据写入SPDAT之后的半个到一个SPI位时间后,数据将出现在MOSI引脚。

需要注意的是,主机可以通过将对应器件的/SS引脚驱动为低电平实现与之通信。

写入主机SPDA T寄存器的数据从MOSI引脚移出发送到从机的MOSI引脚。

同时从机SPDAT寄存器的数据从MISO引脚移出发送到主机的MISO引脚。

传输完一个字节后,SPI 时钟发生器停止,传输完成标志(SPIF)置位并
产生一个中断(如果SPI中断使能)。

主机和从机CPU的两个移位寄存器可以看作是一个16位循环移位寄存器。

当数据从主机移位传送到从机的同时,数据也以相反的方向移入。

这意味着在一个移位周期中,主机和从机的数据相互交换。

2.3.2显示功能设计
系统当前角度,角度下限值和时间都采用LED数码管来显示。

显示当前角度用到4位数码管,显示上下限报警值时要同时显示,用到4位数码管,时间显示当前的分秒。

所以系统用8个数码管就可以完成显示功能。

采用该单片机的SPI串行接口进行控制,需要把串行数据转换在并行数据来控制数码管显示。

系统选74HC595有8位串行输入/输出或者并行输出功能的芯片。

74HC595是具有8位移位寄存器和一个存储器,三态输出功能。

移位寄存器和存储器是分别的时钟。

移位寄存器有一个串行移位输入(Ds),和一个串行输出(Q7),和一个异步的低电平复位,存储寄存器有一个并行8位的,具备三态的总线输出,当使能OE时(为低电平),存储寄存器的数据输出到总线,输出寄存器可以直接清除100MHz的移位频率。

/G(13脚): 高电平时禁止输出(高阻态)。

用一个引脚控制它,可以方便地产生闪烁和熄灭效果。

74595的主要优点是具有数据存储寄存器,在移位的过程中,输出端的数据可以保持不变。

这在串行速度慢的场合很有用处,数码管没有闪烁感。

系统首先由SPI分别向两片74HC595先发送段码再发送位码,两片74HC595实现数码管段码和位码的控制,显示方式采用动态扫描方式。

在轮流显示过程中,每位数码管的点亮时间为1~2ms,由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感。

显示模块电路如图2.5,2.6所示
U4
SN74HC595SPI
DIG0
DIG1
DIG2
DIG3
DIG4
DIG5
DIG6
DIG7
U3
SN74HC595
D0
D7
D6
D5
D4
D3
D2
D1
图2.5 单片机与74HC595连接图
7407C10
图2.6 LED驱动电路
2.4单片机编程下载及串口通讯设计
该系列单片机是采用串口下载用户程序,有在系统编程功能。

目前采用RS232接口与计算机通信,但随着计算机技术的发展,支持热插拔的USB标准接口将取代RS232接口,因此计算机将越来越少配置甚至不配置RS232接口。

RS232接口与USB接口虽然都属于串行接口,但它们的数据格式、通信协议、信号电平以及机械连接方式则不同。

这样单片机不能编程下载和和上位机通讯,这样给开发带来了麻烦。

解决这一问题就得把现有的单片机异步通讯接口转换成USB接口。

方案是采用USB/RS232桥接器件如CP2102,CP2103进行设计,计算机通过USB接口虚拟一个RS232接口,与传统设备器件连接,设备对计算机接口的形式为USB接口。

设计现在CP2102来实现RS232~USB之间的转换。

Silicon Laboratories公司推出的USB接口与RS232接口转换器CP2102/CP2103是一款高度集成的USB-UART桥接器,提供一个使用最小化元件和
PCB空间来实现RS232转换USB的简便解决方案。

CP2102/CP2103包含了一个USB功能控制器、USB收发器、振荡器和带有全部调制解调器控制信号的异步串行数据总线(UART)。

CP2102/CP2103作为USB/RS232双向转换器,一方面可以从主机接收USB数据并将其转换为RS232信息流格式发送给外设;另一方面可从RS232外设接收数据转换为USB数据格式传送至主机,其中包括控制和握手信号。

图2.7是CP2102与USB接口图,该芯片可以从USB接口处获取电源。

R,T分别接单片机的TXD(发射端)和RXD(接收端)。

图2.7 CP2102与USB接口
2.5 DS1302简介
DS1302是美国DALLAS公司推出的一种高性能、低功耗的实时时钟芯片,附加31字节静态RAM,采用SPI三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号和RAM数据。

实时时钟可提供秒、分、时、日、星期、月和年,一个月小与31天时可以自动调整,且具有闰年补偿功能。

工作电压宽达2.5~5.5V。

采用双电源供电(主电源和备用电源),可设置备用电源充电方式,提供了对后背电源进行涓细电流充电的能力。

DS1302的外部引脚分配如图2.8所示。

DS1302用于数据记录,特别是对某些具有特殊意义的数据点的记录上,能实现数据与出现该数据的时间同时记录,因此广泛
应用于测量系统中[12]。

图2.8 DS1302电路连接图
2.6 微控制器模块
2.6.1 STC12系列单片机简介
宏晶STC12C5410AD单片机是新一代单片机,它主要特点是高速,高可靠,宽电压,低功耗,超强抗干扰,无法解密[11]。

该单片机有以下性能:
1)高速:1个时钟周期/机器时间,增强8051内核,速度比普通51单片快8~12倍。

2)宽电压:5.5V~3.5V,2.2V~3.8V(STC12LE5410AD系列)。

3)低功耗设计:空闲模式,掉电模式(可由外部中断唤醒)。

4)工作频率:0~35MHz,相当于普通8051:0~420MHz。

5)12K/10K/8K/6K/4K/2K字节片内的程序Flash存储器,可以擦写10万次以上
6)512字节片内数据存储器,内部集成了2K字节的数据Flash存储器(EEPROM)。

7)ISP/IAP,在系统可编程/在应用可编程,无需编程器和仿真器。

8)10位ADC,8通道STC12C2052AD为8位ADC,4路PWM可选,4通道
捕获/比较功能(PWM/PCA/CCU)---可用来再实现4个定时器或四个外部中断(支持上升沿/下降沿中断)
9)6个16位定时器,包括T0、T1,PCA也是4个定时器。

10)硬件看门狗(WTD),高速SPI通讯接口,全双工异步串行口通讯
(UART)兼容普通8051串口。

11)通用I/O口,可以设置为4种工作模式,有准双向口/弱上拉,仅为输入/高
阻,开漏,推挽/强上拉。

每个I/O口驱动能力均可达20mA,但整个芯片最大不得超过55mA.
选择STC12C5410AD单片机为主控器件,单片机的片上资源能满足系统的功能要求,减少了外围器件,加强了系统的抗干扰能力,提高系统稳定性,降低了开发成本和开发难度。

2.6.2 单片机系统电路设计
1)MMA7260Q与单片机的接口。

单片机STC12C5410AD的P1为通用数字I/O与12位AD转换器模拟输入通道复用端口。

本文中使用MSP430F1612的P1.0/ADC0、P1.1/ADC1、P1.2/ADC2作为模拟输入通道,分别与加速度传感器MMA7260Q三轴向模拟信号输出XOUT、YOUT、ZOUT连接,实现加速度信号的采集;。

MMA7260Q 与STC12C5410AD接口电路如图2.9所示。

图2.9 MMA7260Q与MSP430接口示意图
2)74HC595与单片机接口
单片机的SPI由MISO(与P1.6共用)、MOSI(与P1.5共用)、SCLK (与P1.7)和/SS(与P1.4共用)4根信号线构成。

由于只是选择主机模式故/SS信号线不用。

74HC595与单片机接口电路如图2.10所示
图2.10 74HC595与单片机接口
2.7 其他电路设计
2.7.1.键盘电路设计
系统涉及到压力的上下限报警值的设定,时间的设定,由于没有过多的键,考虑到单片机的I/O口,所以用独立式键盘来实现,如图2.11所示。

接收按键信号的时候,会出现前沿和后沿抖动,采用用软件延时的办法消除抖动[13]。

图2.11 键盘电路设计
2.7.2.声光报警电路设计
报警功能主要是角度超过设定的上线报警值或低于设定的下线报警值时候会发出报警信号,系统采用较为常用的方案设计——声光报警。

声音报警用蜂
鸣器来实现,光报警采用高亮度红光LED来实现。

报警声音可以有高低报警,LED闪烁报警[14]。

原理图如图2.12所示。

图2.12声光报警电路设计
3 软件设计
软件采用Keil uVision3作为下位机系统的开发平台。

3.1数据处理
3.1.1 角度数据采集设计
MMA7260Q输出为模拟信号,采集过程需进行AD转换。

STC12C5410AD 单片机集成有8路高速模数转换器(ADC)。

,它是一种逐次比较型模数转换器,速度可达到100KHz(10万次/秒),10位的转换精度,ADC输入通道与P1口复用,上电复位后P1口为弱上拉型I/O口,用户可以通过软件设置将8路中的任何一路设置为A/D转换,不需作为A/D 使用的口可继续作为I/O口使用。

A/D采样率的选择不能干扰加速度计采样频率(11kHz) ,以防混叠误差。

AD转换频率: 11.0592MHZ/210=52khz
52khz/2=26khz
A/D转换结果计算公式如下:
(ADC_DATA[7:0],ADC_LOW2[1:0])= 1024×Vin/Vcc 其中,Vin为模拟输入通道输入电压,Vcc为单片机实际工作电压,用单片机工作电压作为模拟参考电压。

数据采集子程序流程图如图3.1所示。

图3.1数据采集子程序流程图
3.1.2 数字滤波及工程变换部分
采样结束后进行数字滤波,数字滤波有多种方式,由于角度变化,可慢可快,所以为了适应快速变化的角度的测量,相比之下,采用了均值滤波,由于它实现简单,占用单片机的资源较少,是一种比较好的选择。

其滤波效果与所选择的采样次数有关,次数越大,效果越好,但花费时间越长[15]。

--------------------滤波程序---------------------------
float filter(void)//AD滤波平均值滤波
{ float sum=0。

float ad_data。

char count。

for(count=0。

count<N。

count++)
{
sum+=Get_data()。

}
return (sum/N)。

}
将滤波后的结果带入公式:
800 (3.1) 就可以得到角度值。

以下为程序代码:
int ChengeADtoAngle(float m1) //m1为数字量
{ float q2,q1。

q1=(m1/1023)*4335。

//q1为得到的电压值 4335为实际单片机的电压值
q2=((q1-1650)/800)。

//分子分母同时扩大1000倍
return(572.96*asin(q2))。

// 将角度扩大10倍
}
3.2数据存储部分
为了观察角度的变化及对角度的历史数据经行分析,需要将该数据与出现该数据的时间同时记录。

这种记录对数据的分析及对异常数据出现的原因的查找具有重要意义若采用单片机计时,一方面占用硬件资源,另一方面需要设置中断、查询等,同样耗费单片机资源。

DS1302时钟芯片可以用于时间记录,很好地解决了这个问题。

STC12C5410AD单片机内部集成了2K字节的数据Flash存储器(EEPROM),地址范围是2800H~2FFFH。

这2K字节的数据Flash存储器分
为4个扇区,每个扇区包含512字节。

数据Flash擦除只有扇区擦除,没有字节擦除。

对于数据Flash存储器的操作有三个基本命令,分别是字节读、字节编程和扇区擦除。

进行字节编程时,只能将“1”改为“0”,或“1”保持为“1”,“0”保持为“0”。

考虑到数据Flash只有扇区擦除,所以将数据按扇区存储,不按字节数存储。

角度数据分为整数和小数部分存储,这是由于用UART传输方便而定的。

角度数据再加上时间标签共9个字节。

称之为一个数据块。

每个扇区可存储56个数据块。

考虑到数据存储空间有限,于是采取的这样的存储方法:采样的角度值与上一次的角度值比较,如果相差不大的话,则舍弃本次角度值,如果相差很大,则经进行存储,程序流程图如图3.2所示。

图3.2 数据存储子程序
部分子程序
//------------扇区擦除功能-----------------
void sector_erase(unsigned int addr) //送地址
{ ISP_CONTR = 0x83。

//系统工作时钟<12Mhz 打开IAP功能
ISP_CMD = 0x03。

//3为扇区擦除功能
ISP_ADDRH = addr>>8。

//----地址右移八位取高地址
ISP_ADDRL = addr&0x00ff。

EA=0。

//以免中断打断
ISP_TRIG = 0x46。

ISP_TRIG = 0xb9。

EA=1。

iap_disable()。

}
//-----------字节编程-----------------------
void byte_program(unsigned int addr, char dat) //送地址addr 和数据 dat {
ISP_CONTR = 0x83。

ISP_CMD = 0x02。

//2为字节编程
ISP_ADDRH = addr>>8。

ISP_ADDRL = addr&0x00ff。

ISP_DATA = dat。

EA=0。

ISP_TRIG = 0x46。

ISP_TRIG = 0xb9。

EA=1。

iap_disable()。

}
//--------------------字节读功能-------------------
unsigned char byte_read(unsigned int addr) //送地址
{
unsigned char dat。

ISP_CONTR = 0x83。

ISP_CMD = 0x01。

//1为字节读功能
ISP_ADDRH = addr>>8。

ISP_ADDRL = addr&0x00ff。

EA=0。

ISP_TRIG = 0x46。

ISP_TRIG = 0xb9。

dat= ISP_DATA。

EA=1。

iap_disable()。

return(dat)。

}
3.3 DS1302软件设计
DS1302是SPI总线驱动方式。

它要向寄存器写入控制字,还需要读取相应寄存器的数据。

1)DS1302的控制字节
表 4.1 DS1302的控制字
DS1302 的控制字如图所示。

控制字节的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入DS1302中。

位6如果为0,则表示存取日历时钟数据,为1表示存取RAM数据。

位5至位1指示操作单元的地址。

最低有效位(位0)如为0表示要进行写操作,为1表示进行读操作,控制字节总是从最低位开始输出。

2)数据输入输出(I/O)
在控制指令字输入后的下一个SCLK时钟的上升沿时,数据被写入
DS1302,数据输入从低位即位0开始。

同样,在紧跟8位的控制指令字后的下一个SCLK脉冲的下降沿读出DS1302的数据,读出数据时从低位0位到高位7。

3)DS1302的寄存器
DS1302有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为BCD码形式,其日历、时间寄存器及其控制字见表2。

此外,DS1302 还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与RAM相关的寄存器等。

图3.3 DS1302实时时钟流程图
部分程序:
//----------------Ds1302-------------------------
void DS1302InputByte(unsigned char d) //实时时钟写入一字节(内部函数)
{ unsigned char i。

ACC = d。

for(i=8。

i>0。

i--)
{ DS1302_IO = ACC0。

DS1302_CLK = 1。

DS1302_CLK = 0。

ACC = ACC >> 1。

}
}
unsigned char DS1302OutputByte(void) //实时时钟读取一字节(内部函数)
{ unsigned char i。

for(i=8。

i>0。

i--)
{ ACC = ACC >>1。

ACC7 = DS1302_IO。

DS1302_CLK = 1。

DS1302_CLK = 0。

}
return(ACC)。

}
void Write1302(unsigned char ucAddr, unsigned char ucDa)
//ucAddr: DS1302地址, ucData: 要写的数据
{ DS1302_RST = 0。

DS1302_CLK = 0。

DS1302_RST = 1。

DS1302InputByte(ucAddr)。

// 地址,命令
DS1302InputByte(ucDa)。

// 写1Byte数据
DS1302_CLK = 1。

DS1302_RST = 0。

}
unsigned char Read1302(unsigned char ucAddr) //读取DS1302某地址的数据
{ unsigned char ucData。

DS1302_RST = 0。

DS1302_CLK = 0。

DS1302_RST = 1。

DS1302InputByte(ucAddr)。

// 地址,命令
ucData = DS1302OutputByte()。

// 读1Byte数据
DS1302_CLK = 1。

DS1302_RST = 0。

return(ucData)。

}
3.4键盘功能设置
在软件的编写上,可以采用软件查询方式对按键进行识别[16]。

读键子程序如图3.4所示。

键值功能设计:
系统默认显示的是当前时间和当前角度值,当第一次按下S1时,显示切换到角度上下限的显示,第二次按下调节角度下限的小数位,第三次按下调节角度下限的个位,依次按下,依次调节各位。

S2作为调节角度上下限时的加一及角度正负号的切换用。

S3作为调节角度上下限时的减一及角度正负号的切换用。

S4作为调节完毕后返回当前时间和当前角度值显示之用。

键盘功能程序代码请见附录。

键盘识别程序代码如下。

图3.4读键子程序
//---------------------获取键值-------------------------
void getkey(void)
{
if(P00==0&&key_last0==1)
{ delay_flag=0。

//delay_flag在定时器中4ms到置1 while(delay_flag==0)。

//延时4ms,去抖动
if(P00==0&&key_last0==1)
{ key_num=0。

key_last0=0。

delay_flag=0。

//去抖动
while(delay_flag==0)。

//延时4ms,去抖动
}
else if(P00==1) key_last0=1。

}
else if(P00==1) key_last0=1。

if(P01==0&&key_last1==1)
{ delay_flag=0。

while(delay_flag==0)。

//去抖动
if(P01==0&&key_last1==1)
{ key_num=1。

key_last1=0。

delay_flag=0。

while(delay_flag==0)。

//延时4ms,去抖动
else if(P01==1) key_last1=1。

}
else if(P01==1) key_last1=1。

if(P02==0&&key_last2==1)
{ delay_flag=0。

while(delay_flag==0)。

//延时4ms,去抖动
if(P02==0&&key_last2==1)
{ key_num=2。

key_last2=0。

delay_flag=0。

//去抖动
while(delay_flag==0)。

//延时4ms,去抖动
}
else if(P02==1) key_last2=1。

}
else if(P02==1) key_last2=1。

if(P03==0&&key_last3==1)
{
delay_flag=0。

while(delay_flag==0)。

//延时4ms,去抖动
if(P03==0&&key_last3==1)
{ key_num=3。

key_last3=0。

delay_flag=0。

while(delay_flag==0)。

//延时4ms,去抖动
} //去抖动
else if(P03==1) key_last3=1。

}
else if(P03==1) key_last3=1。

}
3.5 通信部分
上位机与单片机通信按应答方式经行。

由上位机给单片机发送一组命令数据,单片机受到命令经过分析后认为正常,则按照命令执行操作。

将操作结果返回给上位机。

若经过分析认为不正常,则返回给上位机出错信息。

单片机向上位机发送的数据的方式考虑了两种,第一种是等数据存储器容量存满了后在一块发,这种方式实时性不够,为了使角度数据的变化能够及时的传到上位机,采用定时发送,定时时间和上传的次数由上位机来定,这样一来就解决了实时性问题。

由于是定时发送,通过对数据的分析知道上位机收到的数据可能有重复的,或者是有FF字样。

这可由时间标签,加以区分,而FF为数据存储器中尚未写进的字节单元,通过上位机软件可以滤除。

上位机用串口调试助手来进行数据发送,为了使数据直观,命令码全部使用BCD码,由单片机传来的数据也使用BCD码存储。

上位机给单片机的指令为:
1)0x10:上传数据存储器中角度数据。

相关文档
最新文档