长治学院学士学位论文
数学模型并不适应于下位机端。在下位机端需要建立另一套数学模型,将底端压力乘某个常量,得到一个大概的液位高度值,显示到下位机的数码管上。
(2).A/D转换部分
本系统要对两个模拟压力量进行监测,如果使用传统的8位并行A/D转换器件,光数据口就会占据16个I/O口,对于一个只有4组8位I/O口的单片机来说,这种硬件上的开销实在比较大。所以我在设计过程中选择了同样能实现两路模拟量检测,且对硬件资源开销极小的PCF8591。
PCF8591是一个单片集成、单独供电、低功耗、8-bit CMOS数据获取器件。PCF8591具有4个模拟输入、1个模拟输出和1个串行I2C总线接口。PCF8591的3个地址引脚A0, A1和A2可用于硬件地址编程,允许在同个I2C总线上接入8个PCF8591器件,而无需额外的硬件。在PCF8591器件上输入输出的地址、控制和数据信号都是通过双线双向I2C总线以串行的方式进行传输。
PCF8591的功能包括多路模拟输入、内置跟踪保持、8-bit模数转换和8-bit数模转换。PCF8591的最大转化速率由I2C总线的最大速率决定。
要用PCF8591监测两个压力模拟量,首先得确定PCF8591在I2C总线上的地址,其次要确定控制字节。
PCF8591采用典型的I2C总线接口寻址方法,即总线地址由器件地址、引脚地址和方向位共同组成。飞利浦公司规定A/D器件地址为1001,引脚A2 A1 A0由用户硬件编程,在本系统中这三个引脚全部接地,也就是个说A2 A1 A0分别为0 0 0。所以在I2C系统中最多可以接23=8个A/D器件。总线地址的最后一位为方向位,当主控器件对A/D器件进行读操作时为1,进行写操作时为0。
总线操作时,由器件地址、引脚地址、方向位组成的从地址为主控器发送的一个字节。这时总线上的I2C设备会根据自己的地址来判断主控器是否在“呼叫”自己。若收到的地址和自己的地址和自己的地址相匹配,就要做好接收数据的准备了。
主控器发送的第二个字节是控制字节,控制字节用于控制器件实现各种功能,如模拟信号由哪几个通道输入等。控制字节存放于控制寄存器中的格式如图3.2所示:
图3.2 控制寄存器格式
其中:D0 D1两位是A/D通道编号:00通道0, 01通道1, 10通道2,11通道3;在本系统中利用A/D通道0和A/D通道1。
D2 是自动增益位,有效值是1。当这一位置位时,A/D通道0转换完成后,芯片自动会去转换A/D通道1的值,依次循环类推。
D3 是保留位。
D4 D5 是模拟量输入选择:00四路单独输入,01三路差分输入,10为单端与差分配合输入,11为模拟输出允许有效。我们在这里选择单独输入。
D6 是A/D D/A选择位,A/D转换时选择0,D/A转换是选择1 。 D7 也是保留位.
由此可知,当单片机要监测某一个压力值时,它的工作流程如下:
(1)单片机向I2C上发出一个8位的设备地址,这时的D0位(读写位)为0,通知被控器件将要向其执行写操作,并等待应答;
(2)收到应答后,发送控制字节,写入被控器件的控制寄存器,等待应答; (3)收到应答后,再发送一个8位的设备地址,这时的D0(读写位)为1,通知被控器件将要读取它发送的数据,等待应答;
(4)收到应答后,把总线的控制权交给被控器件,读取它发送到总线上的数据。 将这个过程结合到本系统中,PCF8591的器件地址为1001,引脚地址为000,写操作时方向位为0,即0x90,读操作时方向位为1,即0x91。读取通道0时,控制字节为0000 0000,读取通道1时,控制字节为0000 0001。操作的C程序代码:
ISendByte(0x90,0x00); //ISendByte是数据发送函数
p1=IRcvByte(0x91); //AD0 模数转换0,将值赋给p1
这个函数的作用是发送器件地址0x90和控制字0x00(A/D通道0)读取A/D通道0的值 ,具体的实现过程参照附录中的源代码部分。
到此,我们就顺利的读取到了想要的压力值,但我们不免会有疑问:数据究竟是如何在总线上传输的?这个问题将在下一个小节:I2C总线驱动部分中介绍到。 (3) I2C总线驱动部分
I2C总线设备是飞利浦公司推出的串行总线设备,它与传统的并行总线设备相比较,具有结构简单、可维护性好,易于实现扩展、易于模块化标准设计,可靠性高等优点。但是STC89C516RD+单片机内部没有集成I2C总线设备模块,所以外围的I2C总线设备要实现与单片机的通信时,必须要用软件程序模拟出一个I2C总线设备的时序电路.这无疑增大了系统的开销,也增大了开发难度。可是用I2C总线传输数据只需占用主控器件的两个引脚,就能传输8个外围器件的数据,相当节省硬件资源.所以综合利弊,本系统采用I2C总线设备来传输压力值数据.
它的工作原理如下:
I2C总线设备由一条数据总线SDA和一条时钟总线SCL与中控器件相连,I2C总线进行数据传送时,时钟信号为高电平期间,数据线上的数据必须保持稳定,只有在时钟线上的信号为低电平期间,且高电平状态维持一定的时间(一般为5微秒)以后,数据线上的高电平或低电平状态才允许变化(如图3.3)。
如图3.3 时钟与数据变化规律
SCL线为高电平期间,SDA线由高电平向低电平的变化(下降沿)表示起始信号,SCL线为高电平期间,SDA线由低电平向高电平的变化(上升沿)表示终止信号(如图3.4)。
10
长治学院学士学位论文
如图3.4 起始信号与终止信号
在传送数据时,要求每一个字节必须保证是8位长度。数据传送时,先传送最高位(MSB),每一个被传送的字节后面都必须跟随一位应答位(即一帧共有9位)。如果一段时间内没有收到从机的应答信号,则自动认为从机已正确接收到数据,如图3.5。
图3.5 应答与非应答信号
所有I2C总线设备的驱动方法都是一致的,它只是提供传输数据的一种机制,也就是说驱动程序只提供用两条数据线实现通信的一种方法。这种方法的实现步骤在互联网和相关书籍中有大量详细的介绍,在此不做更详细的说明,具体的实现方法也可以参考附录的程序代码部分。
在本系统中我们更为关心的是用I2C总线来传递什么数据,这些数据有什么意义,这就是一种操作I2C总线的策略,它与机制完全不相同,可由用户自己来设定,从而让I2C总线上的不同设备实现不同的功能。在本系统中,这种策略体现在对A/D转换芯片PCF8591 的操作上,详细内容在上文中介绍到了。
长治学院学士学位论文
3.2 温度检测模块
对储油罐温度的监测是靠温度传感器DS18B20来完成的,DS18B20数字温度计是DALLAS公司生产的1-Wire,即单总线器件,具有线路简单,体积小的特点。因此用它来组成一个测温系统,具有线路简单,在一根通信线上可以挂很多这样的数字温度计,十分方便。
DS18B20温度差传感器是一个数字传感器,这就省去了A/D转换的麻烦,在硬件电路上只有一根数据线,占用硬件资源很少,硬件上的节约同样需要软件来补偿,这就注定了操作DS18B20的繁琐性。
通常情况下我们采用的是TO-92封装的DS18B20,如图3.6。
图3.6 DS18B20封装
由于DS18B20采用的是1-Wire总线协议方式,即在一根数据线实现数据的双向传输,而对51单片机来说,跟I2C总线设备一样,硬件上并不支持单总线协议,因此,我们必须采用软件的方法来模拟单总线的协议时序来完成对DS18B20芯片的访问。
DS18B20是在一根I/O线上读写数据,因此,对读写的数据位有着严格的时序要求。DS18B20有严格的通信协议来保证各位数据传输的正确性和完整性。该协议定义了几种信号的时序:初始化时序、读时序、写时序,如图3.7-3.9所示。所有时序都是将主机作为主设备,单总线器件作为从设备。而每一次命令和数据的传输都是从主机主动启动写时序开始,如果要求单总线器件回送数据,在进行写命令后,主机需启动读时序完成数据接收。数据和命令的传输都是低位在先。
图3.7 DS18B20的复位时序
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库储油罐实时监测系统的设计与实现 - 图文(3)在线全文阅读。
相关推荐: