毕业设计-无人监守点滴自动监控系统的设计 下载本文

3.3.2 通信接口电路

通信接口电路即适配芯片连接电路其连接方法如图14所示:

图14通信接口电路

适配芯片各引脚连接情况如下:

(1)CAN收发器TJA1050引脚连接情况:CANL为低电平CAN总线,CANH为高电平CAN总线,TXD为发送数据输入引脚,RXD为接收数据输入引脚。

(2)CAN协议控制器MCP2510各引脚的连接情况:TX0RS为通用数字输入或发送缓冲器(TXB0)请求发送引脚,TX1BF为接收缓冲器,RXB1的通用数字输出或中断引脚TXCAN引脚与CAN总线的发送输出引脚(TXD)连接,RXCAN引脚与CAN总线的接收输入引脚(RXD)连接。

TJA1050具有高速模式和静音模式两种工作模式,通过引脚“8”的得取来选择模式。若引脚“8”接地则进入高速模式;若引脚“8”没有接地则进入静音模式;若引脚“8”不连接,则默认高速模式。

4 系统软件设计

系统软件设计是基于单片机硬件进行的。软件设计是系统的主要组成部分,软件的好坏将直接影响到系统的性能指标。无人坚守点滴自动监控系统的设计采用模块化结构的方式,模块化编程是分别对各模块程序进行编写、编译,最后通过主程序将各模片相互调用的软件设计方法。本系统包含从站软件设计和主站软件设计,主站程序主要是对从从站各程序模块的协调管理。 4.1 从站软件系统总体设计

从站软件设计是对从站各模块进行嵌入式程序编译,本系统中需要进行程序

12

编译的模块主要有:(1)主控模块即初始化模块;(2)键盘控制模块;(3)点滴速控制模块;(4)电机控制模块;(5)报警模块;(6)主从通信模块。 4.2 从站各模块软件设计

从站系统程序由一个主控程序模块和若干个子程序模块组成,其中主控程序模块为软件系统的核心,其作用是管理协调各子模块,使之按照总体设计流程工作。

4.2.1 主控模块

主控模块是从站软件系统的核心,其主要负责调度各子模块程序。工作时,首先对串口部分和数据缓冲区进行初始化,然后调用各子模块程序来协调各子模块工作。系统初始化有两方面的工作内容:

(1)串口初始化,即让串口工作处方式“1”。通过定时器T1来设定波特率的溢出率值为1200bit/s,串口处于接收的状态。此时把定时器T1的初始值设定为248(0E8),MUC外围电路使用的晶振频率为11.0592MHz。

(2)外部中断“0”的设臵,串口数据通信通过中断来进行实现数据的发送与接收,所以初始化程序还需设定串口的中断方式。在从站系统中,当有液滴滴下时,液滴检测电路就会捕捉到一个电信号,将捕捉的电信号送到A/D转换电路中对其整形,最后产生一个数字脉冲信号,将脉冲信号送至单片机内部处理使之产生一个外部中断“0”。系统进行中断计数时,必须开启外部中断“0”和R4寄存器。同时,还需将外部中断“0”设臵为电平触发模式。串口初始化程序部分源码如下:

#include #include #include “tdp.h”

#ifdef evalboard //采用硬件目标板时需要使用以下外部函数 extern void DNPUT(unsigned char aa, unsigned char bb); extern void DISPLY(unsigned char data *cc) ;

static unsigned char data dg[ ]={ 0, 0, 10, 0, 0, 10, 0, 0 }; #end if void main (void)

{ unsigned i; for (i=0; i<1000; i++); //延时,等待系统上电稳定 timer0_initialize (); //定时器0初始化 com_initialize (); //串行口初始化 #ifdef evalboard //采用硬件目标板时

DINPUT (0X0A, 0X07); //需要对板上MAX7219初始化

13

DNPUT (0X0B, 0X07); DINPUT (0X09, 0X0FF); DINPUT (0X0c, 0X01);

DISPLY (dg); //板上LCD显示00-00-00 #end if

timer0_wait (TIMER0_TICKS_PER_ SEC / 10); clock_init ();

com _ puts (“TDP Vl.0\\r\\n”); while (1) { const char *cmd; cmdb_init (); cmdb_prompt ();

for (cmd=NULL; cmd==NULL; cmd=cmdb_ scan ()) { clock _ update (); }

cmd_proc (cmd); } }

4.2.2 键盘控制模块

键盘扫描采用行列式矩阵接口,子程序采用中断方式进行行列扫描,以获得键值输入。由于键盘抖动会对结果造成影响,因此必须消除。程序流程图如图15所示,键盘扫描程序和防抖子程序如下:

(1)键盘扫描程序: byte key_scan(void) { byte ktrnp, key; key=0;

key_ 4x4_line_output(); key_ 4x4_ row_input(); key_4x4_get_row(ktmp);

while ( (ktrnp&0x0f)==0x0f) key_4x4_get_row(ktmp); delay_ms(10);

key_4x4_get_row (ktmp); if ( (ktmp&0x0f)!=0x0f) {

key= (ktmp&0x0)

14

key_4x4_row_o key_4x4_line_in delay_ms(10); key_4x4_get_lin if ((ktmp&0xf0)! {while( (ktmp key_4x4_lin key_4x4_ro key+=(ktm for (ktmp=0; {if (key==k return(0xff) }

else return(0xff) }

else return(0xff); }

(2)防抖子程序: #include #include sbit P34=0xB4; sbit P35=0xB5;

unsigned char get_char(void); //函数说明 void delay (void); main() {

unsigned char keybuf[16], count; //键盘缓冲区和读键计数变量 SCON=0; //将串行口设臵成工作方式0 ES=0; //禁止串口中断 EA=0; count=0;

while(count<16) keybuf[count++]=get_ char(); //读入16个按键的键值 }

unsigned char get _ char(void){

//定义表示列号、键序号和待发送数据的变量column, key _ code和mask unsigned char key_ code, column=0, mask=0x00;

15