S51开发板的设计
4 软件部分
4.1 整体程序设计
软件部分主要包括数码管程序、键盘程序、AD程序、DA程序、DS1302时钟程序、DS18b20温度传感器程序、串行通信程序、显示程序和其他简单模块程序。
4.2 分模块程序设计
依据开发板上硬件资源,进行程序的开发,在软件的设计过程中,采用模块化的设计方法,依次分别为每个模块设计软件。下面分别介绍以上各个模块的程序设计。
4.2.1 键盘模块程序设计
矩阵式键盘的按键识别方法为:
判断键盘中有无键按下:将全部行线KEY0-KEY3置低电平,然后检测列线的状态。只要有一列的电平为低,则表示键盘中有键被按下,而且闭合的键位于低电平线与4根行线相交叉的4个按键之中。若所有列线均为高电平,则键盘中无键按下。
判断闭合键所在的位置:在确认有键按下后,即可进入确定具体闭合键的过程。其方法是:依次将行线置为低电平,即在置某根行线为低电平时,其它线为高电平。在确定某根行线位置为低电平后,再逐行检测各列线的电平状态。若某列为低,则该列线与置为低电平的行线交叉处的按键就是闭合的按键。
矩阵式键盘的按键编码处理:将行线和列线依次进行数值编码,然后进行一定规则的运算,就是对键值的编码。
键盘程序流程图如图4-1所示:
19
S51开发板的设计
开始 键盘扫描 N 有键按下 Y 原有键值不变 取键值 键值送P0选通数码管
图4-1 键盘程序流程图
键盘采用的是行扫描法确定键值,在程序中具体是这样扫描键盘的:将键盘扫描码送入P2口,先是使行线依次为低电平,顺序为KEY1、KEY2、KEY3、KEY4,在某一行线为低电平的状态下,读取P2口的状态,将状态值依次右移四位,这样便将KEY5-KEY8的状态值移到了低四位,再将高四位状态值置一,将处理后的状态值与当前的扫描码比较,如果此时的状态值与四个扫描码中的一个相同,证明有键按下,此时保存扫描码的数组下标和与状态值相等的扫描码数组下标,并将两个值按照键盘编码值进行某一规则的四则运算后返回给主函数中的某一变量;如果在全部行线依次为低电平情况下的状态值与四个扫描码中没有一个相同,证明没有键按下,返回-1到主函数。在主函数中调用键盘扫描函数对键盘进行扫描,判断返回键值,若返回值不为-1,证明右键按下,在某一个数码管上显示键值,若返回值为-1,证明没有键按下,显示先前按下的按键键值。 4.2.2 AD模块程序设计 a ADC0832的工作时序
ADC0832的工作时序图如图4-2所示:
20
S51开发板的设计
图4-2 ADC0832的工作时序图
当CS由高变低时,选中ADC0832。在时钟的上升沿,D I端的数据移ADC0832内部的多路地址移位寄存器。在第一个时钟期间, D I为高,表示启动位,紧接着输入两位配置位。当输入启动位和配置位后,选通输入模拟通道,转换开始。转换开始后,经过一个时钟周期延迟,以使选定的通道稳定。ADC0832 接着在第4个时钟下降沿输出转换数据。数据输出时先输出最高位(D7~D0);输出完转换结果后,又以最低位开始重新输出一遍数据(D7~D0),两次发送的最低位共用。当片选CS为高时,内部所有寄存器清0,输出变为高阻态。如果要再进行一次模/数转换,片选CS必须再次从高向低跳变,后面再输入启动位和配置位。 b AD程序流程图
AD程序流程图如4-3所示:
开始 启动AD转换 输入方式选择 输入通道选择 读取数据 数据处理与显示
图4-3 AD程序流程图
21
S51开发板的设计
依据操作时序对ADC0832编程,包括转换启动和AD值读取函数,在AD转换函数中可以选择ADC0832的转换通道和输入方式,即通道0或通道1,单通道输入或差分输入。在主函数中循环读取某一通道的模拟电压值,将采集到的数据由16进制转换为ASCLL码。并在液晶或数码管上显示出来。 4.2.3 DA模块程序设计 a TLC5615的工作时序
TLC5615的工作时序如图4-4所示:
图4-4 TLC5615的时序图
由时序图可以看出,当片选CS为低电平时,输入数据DIN由时钟SCLK同步输入或输出,而且最高有效位在前,低有效位在后。输入时SCLK的上升沿把串行输入数据DIN移入内部的16位移位寄存器,SCLK的下降沿输出串行数据DOUT,片选CS的上升沿把数据传送至DAC寄存器。当片选CS为高电平时,串行输入数据DIN不能由时钟同步送入移位寄存器;输出数据DOUT保持最近的数值不变而不进入高阻状态。由此要想串行输入数据和输出数据必须满足两个条件:第一时钟SCLK的有效跳变;第二片选CS为低电平。这里,为了使时钟的内部馈通最小,当片选CS为高电平时,输入时钟SCLK应当为低电平。
串行数模转换器TLC5615的使用有两种方式,即级联方式和非级联方式。如不使用级联方式,DIN只需输入12位数据。DIN输入的12位数据中,前10位为TLC5615输入的D/A转换数据,且输入时高位在前,低位在后,后两位必须写入数值为零的低于LSB的位,因为TLC5615的DAC输入锁存器为12位宽。如果使用TL5615的级联功能,来自DOUT的数据需要输入16位时钟下降沿,因此完成一次数据输入需要16个时钟周期,输入的数据也应为16位。输入的数据中,前4位为高虚拟位,中间10位为D/A转换数据,最后2位为低于LSB的位即零。 b DA程序流程图
DA程序流程图如图4-5所示:
22