标准上的.但是由于RS-232是用正负电压来表示逻辑状态,RS-232的逻辑0电平规定为+5~+15V,逻辑1电平规定为-15~-5V,与TTL以高低电平来表示逻辑状态的规定不同.因此,为了能够同计算机接口或终端的TTL器件连接,必须在RS-232和TTL电路之间进行电平和逻辑关系的变换。实现这种变换的方法可以用分立元件,也可以用集成电路芯片。本设计中采用MAX232集成电路接口芯片完成EIA电平到TTL电平之间双向电平的转换。
MAX232芯片内部有一个电源电压变换器,可以把输入的+5V电源电压变换成RS-232输出电平所需的+10V或-10V电压。采用此芯片接口的串行通信系统只需要单一的+5V电源就可以了。MAX232的价格适中,硬件接口简单,所以被广泛的采用。
MAX232芯片的引脚图如下图3-6所示.其各引脚的功能具体如下: Cl+, Cl-:倍压器电容接入端,接0.1laF电容; C2+,C2-:电压反相器电容接入端,接0.1gF电容; V+:升压电容接入端,对+5V接0.111F电容; V-:极性变换电容接入端,对地接0.1F电容;
TIin,T2in:TTL/CMOS电平输入端,接单片机输出端口; Tlout. T2out: E1ARS-232-C电平输出端,接串口端口; Rlin, R2in: EIARS-232-C电平输入端,接串口端口; Rlout, R2out: TTTJCMOS电平输出端,接单片机输出端口。
如图2-12引脚图中所示,电容C1,C2,C3,C4及V+,V-是电源变换部分。在实际应用中,期间对电源噪声很敏感。因此,VCC对地要加去耦电容C5,其值为0.1Uf。电容C1,C2,C3,C4都选用电解电容,电容值为1.0uF,可以提高抗干扰的能力。连接电容的时候要尽量靠近器件,注意极性。
26
图2-12 引脚图
RS-232电平与单片机电平不同,通过MAX232进行电平转换.,.MAX232使用单+5V供电,配接四个1uF电容即可完成EIA电平与TTL电平之间的转换.转换后RXD和TXD直接连接单片机的串口TXD和RXD。
2.4 本章小结
本章主要是采集单元的硬件电路的设计。该硬件电路以8051作为核心控制器件。并以单片机STC89C51、A/D转换芯片ADC0809、MAX232芯片等为组成电路。本章还对各组成电路和指令集进行了介绍。
27
3 单片机采集及通信系统软件设计
3.1 模拟量的A/D转换程序设计
在终端采集三种数据:模拟量、开关量和脉冲量。其中开关量和脉冲量数据通过硬件电路的设计直接由单片机端口读入,不需要进行软件的设计,只有模拟量数据要结合单片机与A/D转换芯片ADC0809的硬件设计和相应的软件编程才能读入单片机。
模拟量的数据采集硬件电路如图2-2,从图中可以看出,ADC0809的启动信号START是由单片机的P2.7与/WR信号的或非产生的。而ALE地址允许锁存信号是和START相连的,所以只要向ADC0809发送一条写操作指令就可以把给定的通道地址的模拟量进行转换。输出允许信号OE由单片机的P3.3与读信号的与非产生,所以只要一个读操作命令就可以把转换的结果读入单片机。转换结束信号EOC和单片机的P3.3相连,可以由两种方式读取转换后的数据:中断方式和查询方式。当进行转换的时候,EOC为低电平,当转换结束后EOC则变为高电平,此时就可以申请中断或用程序查询该引脚,然后读取数据。
按照数据采集硬件电路如图2-4的连接方法则可以计算出ADC0809的模拟通道IN0~IN7的地址为7FF8H~7FFFH。
ADC0809进行模数转换的程序流程图如下图3-1(查询方式)和图3-2(中断方式)。IN0是第一个通道,即&IN0是第一个通道的地址;*ad-addr是定义一个指针,使它的初值是第一个通道的地址(ad-addr=&IN0),那么ad-addr每次加1都表示指向下一个通道;X[10]是个能够存放10个数据的数组,每个通道转换结束后,单片机读取的转换结果都存放到该数组中。其基本流程是根据电路图的连接计算出通道的地址以后,先锁定通道0的地址即ad-addr=&IN0,并设置i的初值为0,然后进行模数,转换结束以后把转换结果存放到数组成员X[i]中,然后地址值ad-addr加1,i也加1,再启动模数转换,并把结果存放到X[i]中,依次
28
循环,直到处理完8个通道,这样就完成了8个通道的模拟量数据的A/D转换,单片机则把读取的8路信息存储在数组X[10]中。 开始
初始化 int i=0; *ad-addr;ad-addr= &IN0; int X[10] 启动转换 ad-addr=0 N 转 换 是 否 结 束 P3.3=0 N Y 读数,放入X[i]中X[i]=* N ad-addr Y ad-addr++ ; i++ 结束 图3-1 查询方式流程图
29
开始 初始化 int i=0; flag=0; *ad-addr;ad-addr=&IN0; int X[10]。数据都设为公共变量 开中断 EA=1;EX1=1 N i<8 启动转换 ad-addr=0 N flag=1 Y Y flag=0 Y 结束 1.主程序 开始 读数 X[i]=* ad-addr; ad-addr++;i++;flag=1 结束 2中断程序
图3-2 中断方式流程图
在中断方式流程图中有两部分,一部分是主程序的流程图,一部分是中断程序的流程图。在本设计中,采取查询的方式读取ADC0809的转换结果。
3.2 脉冲量的测量程序设计
本设计中采用一种新的脉冲量的频率测量方法,也是在单位时间内计数。2路脉冲量由单片机的两个外部中断读入。脉冲量的下降沿到来就出发外部中断,同时要启动定时器开始计时,在外部中断中要对输入的脉冲进行计数,直到定时1s的时间到,则关闭外部中断和定时器,然后读取数据即可得到所测脉冲的频率值。
设定的定时时间为1s,这么长的时间,只有由T0先定时100ms,之后再软件定时10次,这样由硬件定时和软件定时结合完成1s的定时。其软件设计流程图如下图4-3。程序设计中,jishu用来表示在定时时间内所测的外部脉冲的个数; tf用来表示定时时间到;A表示1s定时时间内T0中断的次数,用来软件计数;flag用来标志第一个脉冲下降沿的到来,第一个脉冲下降沿到来时启动定时器并计数,而后触发中断时则只计数脉冲个数。所有的变量都设置成全局变量,变量jishu、tf和flag初值都设置成0,A的初值设置为5。具体的软件设计流程分为主程序流程图、定时器中断流程图和外部中断流程图3部分,如下图所示。
下图中只画出了一路(由/INT0输入)脉冲量采集的程序设计流程图,另一路(由/INT1输入)软件设计流程图中只要把变量tf换成tf1,jishu换成jishu1,flag换成flag1,图中是把外部中断程序写到/INT0的中断中,另一路则把外部中断程序写到/INT1的中断中即可。除了以上变化之外,另一路脉冲测量的软件设计中其他的初始化设置及软件设计过程都和下图一样。
30