基于单片机的数字电压表设计毕业论文 下载本文

西安工业大学学士学位论文 接口。SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,正是出于这种简单易用的特性,现在越来越多的芯片集成了这种通信协议[14]。 3.5.2 SPI总线的基本结构

SPI是一个环形总线结构,由SS(CS)、SCK、SDI、SIO构成,其时序其实很简单,主要是在SCK的控制下,两个双向移位寄存器进行数据交换。 上升沿发送、下降沿接收、高位先发送。

上升沿到来的时候,SDO上的电平将被发送到从设备的寄存器中。 下降沿到来的时候,SDI上的电平将被接收到主设备的寄存器中。 3.5.3 数据的传输

假设主机和从机初始化就绪:并且主机的sbuff=0xaa (10101010),从机的sbuff=0x55 (01010101),下面将分步对SPI的8个时钟周期的数据情况演示一遍(假设上升沿发送数据)[15]。

---------------------------------------------------

脉冲 主机sbuff 从机sbuff SDI SDO ---------------------------------------------------

0 00-0 10101010 01010101 0 0 --------------------------------------------------- 1 0--1 0101010x 10101011 0 1 1 1--0 01010100 10101011 0 1 --------------------------------------------------- 2 0--1 1010100x 01010110 1 0 2 1--0 10101001 01010110 1 0 --------------------------------------------------- 3 0--1 0101001x 10101101 0 1 3 1--0 01010010 10101101 0 1 --------------------------------------------------- 4 0--1 1010010x 01011010 1 0 4 1--0 10100101 01011010 1 0 --------------------------------------------------- 5 0--1 0100101x 10110101 0 1 5 1--0 01001010 10110101 0 1 --------------------------------------------------- 6 0--1 1001010x 01101010 1 0 6 1--0 10010101 01101010 1 0 --------------------------------------------------- 7 0--1 0010101x 11010101 0 1

18

西安工业大学学士学位论文 7 1--0 00101010 11010101 0 1 --------------------------------------------------- 8 0--1 0101010x 10101010 1 0 8 1--0 01010101 10101010 1 0 ---------------------------------------------------

这样就完成了两个寄存器8位的交换,上面的0--1表示上升沿、1--0表示

下降沿,sdi、 sdo相对于主机而言的。根据以上分析,一个完整的传送周期是16位,即两个字节,因为,首先主机要发送命令过去,然后从机根据主机的名准备数据,主机在下一个8位时钟周期才把数据读回来。

其中CS是控制芯片是否被选中的,也就是说只有片选信号为预先规定的使能信号时(高电位或低电位),对此芯片的操作才有效[16]。这就允许在同一总线上连接多个SPI设备成为可能。接下来就负责通讯的3根线了。通讯是通过数据交换完成的,这里先要知道SPI是串行通讯协议,也就是说数据是一位一位的传输的。这就是SCK时钟线存在的原因,由SCK提供时钟脉冲,SDI,SDO则基于此脉冲完成数据传输。数据输出通过 SDO线,数据在时钟上升沿或下降沿时改变,在紧接着的下降沿或上升沿被读取。完成一位数据传输,输入也使用同样原理。这样,在至少8次时钟信号的改变(上沿和下沿为一次),就可以完成8位数据的传输。

3.6电压显示电路

设计中采用的是8段LED数码管sm420364来显示电压值。LED具有耗电低、亮度高、视角大、线路简单、耐震及寿命长等优点,它由8个发光二极管组成,其中7个按‘8’字型排列,另一个发光二极管为圆点形状,位于右下角,常用于显示小数点。把8个发光二极管连在一起,公共端接高电平,叫共阳极接法,相反,公共端接低电平的叫共阴极接法,根据ZLG7289的要求我们采用共阴极接法。当发光二极管导通时,相应的一段笔画或点就发亮,从而形成不同的发光字符。其8段分别命名为dp g f e d c b a。例如,要显示“0”,则dp g f e d c b a分别为:1100 0000B;要显示“A”,则dp g f e d c b a分别为:0001 0001B(共阳极)。若要显示多个数字,只要让若干个数码管的位码循环为低电平就可以了。

根据设计要求,显示电路需要至少4位LED数码管来显示电压值,则有4位LED循环显示。设计中由ZLG7289的SA~DP驱动LED的段码显示,即显示字符,由ZLG7289的DIG0~DIG3选择LED位码,即选择点亮哪位LED来显示。电路图参考原理图2.1。

3.7小结

在满足设计要求的前提下,为保证电路造价和维修的方便,在设计中我尽可能的用电路制作中的常用元件。另外除了上述器件外,其他的元件如电阻,电容

19

西安工业大学学士学位论文 的选择都是由一些典型电路经测试调节确定的。所以电路显得更于理解和分析,这一点给也将给最后的调试带来很大的方便。

4 基于单片机数字电压表的软件设计

4.1软件系统整体设计

系统的软件流程如下:

开始时首先初始化ZLG7289,使数码管显示为“0.000”,然后调用A/D转换子程序启动ADC0809。单片机等待查询转换结束信号,如果有信号则通过并行口读取转换数据并存储,就这样连着读取五次数据后求平均值。再将所求得的结果进行运算Dout100/51,将运算后的结果除以10得到千分位,再把商除以10得到百分位,再除以10又分别得到十分位和个位,最后把个位,十分位,百分位和千分位通过串口发送给ZLG7289经译码后送至数码管显示,此时LED数码管显示的就是ADC0809采集的电压值。 4.1.1 C51简介

C语言是今年来在国内外得到迅速推广应用的一种计算机语言。C语言功能丰富,表达力强,使用灵活方便,应用面广,目标程序效率高,可移植性好,既具有高级语言的优点,又有低级语言的许多特点。因此,C语言特别适合于编写系统软件。C语言诞生后,许多原来用汇编语言编写的软件,现在可以用C语言编写了,而学习和使用C语言要比学习和使用汇编语言容易得多[17]。

51 的编程语言常用的有二种,一种是汇编语言,一种是C 语言。汇编语言的机器代码生成效率很高但可读性却并不强,复杂一点的程序就更是难读懂,而C 语言在大多数情况下其机器代码生成效率和汇编语言相当,但可读性和可移植性却远远超过汇编语言,而且C 语言还可以嵌入汇编来解决高时效性的代码编写问题。对于开发周期来说,中大型的软件编写用C 语言的开发周期通常要小于汇编语言很多[17]。

Keil C51是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统,Keil C51软件提供丰富的库函数和功能强大的集成开发调试工具,全——Windows界面。另外重要的一点,只要看一下编译后生成的汇编代码,就能体会到Keil C51生成的目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解。在开发大型软件时更能体现高级语言的优势[18]。

20

4 基于单片机数字电压表的软件设计 设计步骤:

1. 建立一个新的项目; 2. 选择所用单片机;

3. 在新建立的项目中加入程序; 4. 保存运行; 5. 编译是否通过。

4.1.2 程序流程图

系统软件的总体框架如图4.1所示:

开始 系统初始化

启动A/D转换 采集A/D转换值 N

是否采集五次? Y 对五次求平均值 显示数值 21

西安工业大学学士学位论文 图4.1程序流程图

系统上电即初始化,首先,单片机片选A/D转换器,然后发出信号启动A/D转换。此时单片P3.2口开始工作,不断扫描A/D转换结束端口有无结束信号。若有,即启动信号采集,对A/D转换器的数据输出口送来的数值进行存储,又重新开始,并且准备下一次的采集;若没有,则继续等待。每当采集系统采集一次,a的值就自增1,直至采集满5次时归零,然后单片机一边对数据处理,一边进入下一次的扫描。数据处理完之后,通过SPI总线将数据传给ZLG7289,ZLG7289把接收到的数据译码后送显示器显示出来。 4.1.3数据采集模块的设计

(1). ADC0809内部带有输出锁存器,可以与AT89S51单片机直接相连。 (2). 初始化时,使ST和OE信号全为低电平。 (3). 送要转换的哪一通道的地址到A,B,C端口上。 (4). 在ST端给出一个至少有100ns宽的正脉冲信号。

(5). 是否转换完毕,根据EOC信号来判断。 (6). 当EOC变为高电平时,这时给OE为高电平,转换的数据就输出给单片机了。

4.1.4数据处理模块的设计

为了得到更高精度和曾强系统的抗干扰能力,当微处理器从ADC0809读取数据后,把连续读入的5次数据进行累加求平均值:

Dout1?Dout2???Dout5Vo? (4.1) 5

再由单片机对VO进行标度变换,得到被测电压数值:

Vo (4.2) Vin??5255

但是单片机在进行数学运算时结果只读取整数部分,且要显示的是三位小数,所以需要给VIN乘以1000:

Vm?Vin?1000 (4.3) 用取余数的方法将电压值按位输出[5]:

千分位 取余数输出 Oq?Vm10百分位 取余数输出 Ob?Oq10 十分位 取余数输出 Os?Ob104.2原程序见附录A 4.3小结

22