农药残留毒性检测仪控制系统的软件设计.docx
- 文档编号:5716351
- 上传时间:2022-12-31
- 格式:DOCX
- 页数:38
- 大小:207.97KB
农药残留毒性检测仪控制系统的软件设计.docx
《农药残留毒性检测仪控制系统的软件设计.docx》由会员分享,可在线阅读,更多相关《农药残留毒性检测仪控制系统的软件设计.docx(38页珍藏版)》请在冰豆网上搜索。
农药残留毒性检测仪控制系统的软件设计
1引言
农药残留毒性快速检测仪是利用单片机的优越性能与其广阔的应用空间为核心。
特别是随着集成电路技术的发展,单片微型计算机的功能也不断增强,许多高性能的新型机种不断涌现出来。
单片机以其功能强、体积小、可靠性高、造价低和开发周期短等优点成为自动化和各个测控领域中广泛应用的器件,尤其是在日常生活中发挥的作用也越来越大。
使利用单片机及其他外围芯片实现的智能检测系统越来越受人们的青睐,且是一种发展趋势。
农药残留毒性快速检测仪的研究是以人们的实际需要为基础的,针对人们的需求和市场上的该类产品的操作繁琐、体积大、不准确、速度慢等缺陷而提出的。
在狠抓食品安全的今天,加强对食品中农残的检测,非常必要和及时。
开发这种微型的智能型的农药残毒快速检测分析仪器充分符合我国的基本国情。
它的应用将可以很好的检测食品的农药残留,为人们的饮食安全提供保障。
此课题的研究受到淮安市科技局的重视,是淮安市科技计划项目。
2单片机软件系统
单片机系统是由单片机硬件与软件结合的系统,只有单片机硬件的系统就像没有大脑的人,完成不了任何工作。
而所谓的软件系统,具体的说就是指令系统给予了单片机设计思想,告诉它该干什么,指令下的好单片机就干得好,因此软件系统的作用诗不可而喻的。
2.1AT89系列单片机常用的编程语言
从应用的角度来看,AT89系列单片机常用的编程语言主要有四种:
汇编、PL/M、C51和Basic。
AT89单片机的汇编语言非常像其它汇编语言,天下的汇编语言都有相同的祖先——机器码,因而非常雷同,AT89指令系统比第一代微处理器的功能增强了一些。
一般而言,汇编语言比较难学、难用的,但如果熟练了就可以直接使用单片机的任一资源,合理安排各个功能部件和单片机内部存储器的使用,从而编写出精简、有效的单片机程序。
PL/M是Intel从8080微处理器开始为其系列产品开发的编程语言。
它很像PASCAL,是一种结构化语言,但它使用关键字去定义结构。
PL/M编译器好像汇编器一样可生成紧凑代码。
PL/M总的来说是“高级汇编语言”,可以详细控制着代码的生成。
但对于AT89系列,PL/M不支持复杂的算术运算、浮点变量而无丰富的库函数支持[1]。
Basic是一种高级语言。
一个新变量名定义之后可以在程序中作变量使用,简单易学,根据解释的行可以找到错误而不是当程序执行完才能显现出来。
Basic由于逐行解释自然很慢,每一行必须在执行时转换成机器代码,需要花费很多时间,不能做到实时性。
BASIC为简化使用变量,所有变量都使用浮点值。
Basic是用于要求编程简单而对于编程效率和运行速度要求不高的场合。
它用于单片机编程的主要优势是语言比较简单,结构不复杂,但由于结构化编程和实时性等问题,事实上应用也不多。
C51是一种主要用于MSC-51单片机系统的标准C语言的变体(所以叫C51),也是高级语言。
它是一种结构化语言,可产生压缩代码。
C语言可以进行许多机器级函数控制而不用汇编语言。
与汇编语言相比,有如下优点:
对单片机的指令系统不要求了解,仅要求对51的存储器结构有初步了解;寄存器分配、不同存储器的寻址及数据类型等细节可由编译器管理;程序有规范的结构,它可分为不同的函数。
这种方式可使程序结构化,将可变的选择与特殊操作组合在一起的能力,改善了程序的可读性、编程及程序调试时间显著缩短,从而提高效率。
C语言提供的库包含许多标准子程序,其具有较强的数据处理,能将已编好的程序可容易地植入新程序,因为它具有方便的模块化编程技术。
C语言作为一种非常方便的语言而得到广泛的支持。
C语言程序本身并不依赖于机器硬件系统,基本上不做修改就可根据单片机的不同而较快地移植过来。
C语言是一种结构化语言。
它层次清晰,便于按模块化方式组织程序,易于调试和维护。
C语言的表现能力和处理能力极强。
它不仅具有丰富的运算符和数据类型,便于实现各类复杂的数据结构。
它还可以直接访问内存的物理地址,进行位(bit)一级的操作。
由于C语言实现了对硬件的编程操作,因此C语言集高级语言和低级语言的功能于一体。
既可用于系统软件的开发,也适合于应用软件的开发。
此外,C语言还具有效率高,可移植性强等特点。
因此广泛地移植到了各类各型计算机上,从而形成了多种版本的C语言[2]。
2.2C语言的优点
对于大多数AT89系列单片机,使用C语言这样的高级语言与使用汇编语言相比具有如下优点[1,2]:
(1)不需要了解处理器的指令集,也不必了解存储器结构。
(2)寄存器分配和寻址方式由编译器进行管理,编程时不需要考虑存储器的寻址和数据类型等细节。
(3)指定操作的变量选择组合提高了程序的可读性。
(4)可使用与人的思维更相近的关键字和操作函数。
(5)与使用汇编语言编程相比,程序的开发和调试时间大大缩短。
(6)C语言中的库文件提供许多标准的例程,例如格式化输出、数据转化和浮点运算等。
(7)通过C语言可实现模块化编程技术,从而可将已编制好的程序加入到新程序中。
(8)C语言可移植性好且非常普及,C语言编译器几乎适用于所有的目标系统,已完成的软件项可以很容易地转化到其他的处理器或环境中。
所有这些并不说明汇编语言就没有立足之地,很多系统特别是实时时钟系统都是用C语言和汇编语言联合编写的。
对时钟要求严格时使用汇编语言是唯一的方法。
除此之外,包括硬件接口的操作都应该用C语言来编写。
C语言的特点就是可以使程序员尽量少的对硬件进行操作,它是一种功能性和结构性很强的语言[1]。
3主要元器件介绍
3.1AT89C55
3.1.1主要特性
·与MCS-51兼容
·20K字节可编程闪烁存储器
·全静态工作:
0Hz-33Hz
·三级程序存储器锁定
·256*8位内部RAM
·32可编程I/O线
·三个16位定时器/计数器
·8个中断源
·可编程串行通道
3.1.2管脚说明
VCC:
供电电压。
GND:
接地。
P0口:
P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。
当P1口的管脚第一次写1时,被定义为高阻输入。
P1口:
P1口是一个内部提供上拉电阻的8位双向I/O口。
P2口:
P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流
P3口:
P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。
P3口也可作为AT89C51的一些特殊功能口,如下表所示:
P3口管脚备选功能
P3.0RXD(串行输入口)
P3.1TXD(串行输出口)
P3.2/INT0(外部中断0)
P3.3/INT1(外部中断1)
P3.4T0(记时器0外部输入)
P3.5T1(记时器1外部输入)
P3.6/WR(外部数据存储器写选通)
P3.7/RD(外部数据存储器读选通)
P3口同时为闪烁编程和编程校验接收一些控制信号。
RST:
复位输入。
当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。
3.2TSL230R可编程光频转换器
3.2.1TSL230的编程设定
1)TSL230的灵敏度设定和调整
传感器使用电子虹膜技术控制其有效的通光口径,以达到控制灵敏度的目的。
传感器的灵敏度有3种级别:
1×、10×和100×,靠两个逻辑输入端S0和S1来控制,其对应情况如表1所示。
2)TSL230的输出频率分频系数设定
传感器有4个可选的分频系数。
输出频率的分频是靠内部的一个可编程计数器对电流/频率转换器输出的基本频率信号进行计数来完成的,计数器的溢出值可设定为2、10、100或是1,该值实际是一个分频系数。
当其为1时,脉冲直接通过,计数器实际不计数。
分频系数靠两个逻辑输入端S2和S3来控制。
3.3128128液晶显示模块
3.3.1模块特点
128128图形点阵式液晶显示器的点阵的大小为128×128,带背光功能。
内置1T6963C液晶显示控制器。
该液晶显示模块具有如下特点。
●可以显示数字、字母、汉字和图形等;
●具有128种5×8点阵的ASCI字符字模库CGROM;
●具有64kb的显示存储器(可被划分为文本显示区、图形显示区、文本属性区和自定义字符库区),并允许MCU随时访问;
●可用图形方式、文本方式以及图形和文本合成方式显示。
3.3.2模块接口引脚功能
128128液晶显示模块与微处理器的接口共有21个引脚,各引脚功能如表1所示。
表1128128模块的引脚功能
管脚号
符号
功能
1
FG
框架地(连接金属铁框)
2
Vss
地(GND)
3
Vdd
电源电压(+5V)
4
Vee
LCD驱动电压(可调)
5
/WR
写数据(低电平时写数据)
6
/RD
读数据(低电平时读数据)
7
/CE
片选信号(低电平有效)
8
C/D
/WR=“L”;C/D=“H”:
写命令,C/D=“L”:
写数据
/WR=“H”;C/D=“H”:
读命令,C/D=“L”:
读数据
9
NC
不连接
10
/RESET
控制复位(模块复位)
11~18
D0~D7
数据线(D0=MSB,D7=LSB)
19
FS
字形选择:
开路或连接到Vdd:
6*8dotsfont
连接到Vss:
8*8dotsfont
20
NC
不连接
3.3.3模块指令集简介
128128液晶显示模块使用了硬件初始化设置,使得其指令功能集中于显示功能的设置上,从而加强了显示能力。
该模块的指令可带一个或两个参数,也可不带参数。
若指令中含有参数,则参数必须在指令之前输入。
在每次数据或指令的写入操作和数据的读取操作之前都要进行状态字检测,只有在不“忙”的状态下,MCU对模块的操作才有效。
其状态位由低位到高位的含义如表2所示。
在MCU写指令或一次读/写数据时,S0和S1要同时有效;当MCU使用自动读/写功能时,S2和S3将取代S0和S1作为忙标志位,此时MCU就要判别它是否有效;S6是考察T6963C屏读或屏拷位;S5和S7表示模块内部的运行状态,一般不用。
表2状态位及其含义
标志
功能
说明
S0
指令读写状态
1:
准备好;0:
忙
S1
数据读写状态
1:
准备好;0:
忙
S2
数据自动读状态
1:
准备好;0:
忙
S3
数据自动写状态
1:
准备好;0:
忙
S4
未用
S5
控制器运行检测可能性
1:
可能;0:
不能
S6
屏读/屏拷贝出错状态
1:
出错;0:
正确
S7
闪烁状态检测
1:
显示;0:
关显示
3.4RS-232芯片
RS-232驱动/接受器选用MAX232,MAX232产品是由德州仪器公司(TI)推出的一
款兼容RS232标准的芯片。
该器件包含2驱动器、2接收器和一个电压发生器电路提供TIA/EIA-232-F电平。
该器件符合TIA/EIA-232-F标准,每一个接收器将TIA/EIA-232-F电平转换成5-VTTL/CMOS电平。
每一个发送器将TTL/CMOS电平转换TIA/EIA-232-F电平。
MAX232包含4个部分:
双路电荷泵DC-DC电压转换器、RS-232驱动器、RS-232接收器,以及接收器与发送器使能控制输入。
4硬件方案概述
基于MCU的农药残留毒性快速检测仪其主要功能是:
首先通过按键来设置光频转换器的工作方式,然后按键开始采集样品的光强,光频转换器将其转换成频率,频率送进单片机进行计频率的处理,然后通过与参照样品进行对照,得出结论,通过按键来进行结果的显示和打印。
整个操作过程液晶显示模块将显示实时的工作状态。
硬件框图见图1。
5系统的软件部分
5.1软件部分的总体设计
本系统由单片机C语言编写而成,采用模块化结构设计。
基于AT89C55单片机的
图1硬件系统原理框图
农药残留毒性快速检测仪要实现的主要功能是:
通过TSL230R可编程光频转换器检测样品发出的光的强度,光频转换器将采集到的光强转换成频率,光频转换器对采集到的不同的光强有不同的频率输出,单片机T1对频率进行计数,同时T0负责定时,单
片机将采集到的频率存储。
当所有样品检测结束后,由操作者控制对照,显示,打印
图2程序主流程图
等操作,完成检测全过程。
本系统模块包含:
光频转换器模块、键盘模块、液晶显示模块,串行通信模块和打印机模块。
主程序流程图如图2所示:
(流程图说明:
当单片机上电复位后,首先对其电路中所需要的资源进行初始化。
程序的主干是键盘扫描程序,当一个子程序执行完之后,回到键盘扫描程序,通过键盘扫描来确定下一步执行什么操作。
该系统包括界面初始化,检测,对照,显示和打
印的过程都是通过键盘操作来控制的。
另外系统还预留了一部分按键为以后的功能扩展所使用。
)
5.2方案各模块的软件设计
5.2.1矩阵式键盘扫描控制模块
矩阵式键盘扫描电路是通过程序扫描的方式实现各按键的功能。
1)接口电路设计
扫描键盘的电路结构如图所示;键盘的行线连接到的单片机的P2.0—P2.3,列线连接到的P1.4—P1.7,可通过如下程序判断哪一键被按下。
按键图示图5。
2)程序设计
扫描法实际是先使行线全输出高电平,列线输出低电平,然后判断行线状态,若行线输出为高电平则表示无键按下;若行线不全为高电平表示有键按下,然后依次使列线为低电平,再判断行线,当行线全为高电平时,表示被按下的键不在本列;当行线不全为高电平时,表示被按下的键在本列,把此时的行线状态与列线状态和在一
图3按键图
起即为被按下的键的位置。
a.检测出是否有键按下。
方法是行输出全为1,列线输出全为低电平,然后读的行的状态,若为全1,则无键闭合,否则表示有键闭合。
b.有键闭合后,调用10—20ms延时子程序消除按键抖动的影响。
c.确认键已闭合后,接着判断为哪一个键闭合。
方法是对键盘进行扫描,即依次给每一条行线送0,其余各列都为1,并检测每次扫描的状态。
每当扫描输出一列为0时,相继读入行线状态。
若全1,表示这列上没有键闭合。
若不全为1,表示为0的这列上有键闭合。
确定闭合键的位置后,就可以计算出键值,即产生键码。
键盘程序流程图见图4:
在本系统中设定按键的功能如下:
1号键,2号键,3号键,4号键,5号键:
是用来对TSL230R光频转换器进行设置的,分别对应频率放大100倍,10倍,1倍,0.1倍,0.01倍;
6号键,7号键,8号键,9号键,10号键,16号键:
分别是开始(初始界面显示),检测,对照,显示,打印,返回键;
11号键,12号键,13号键,14号键,15号键:
保留键。
程序:
//----------------------函数声明,变量定义----------------------
#include
#include
sbitC=P1^4;
sbitD=P1^5;
sbitE=P1^6;
sbitF=P1^7;
sbitG=P2^0;
sbitH=P2^1;
sbitM=P2^2;
sbitN=P2^3;
unsignedcharkey_code;
//----------------------变量声明-------------------------
bitjudge_hitkey();//判断是否有键按下,有返回1,无返回0
unsignedcharscan_key();//键值识别
voidkey_manage(unsignedcharkeycode);//键盘转散
voiddelay(unsignedintN);//延时程序
bitjudge_hitkey();//判断是否有键按下,有返回1,无返回0
unsignedcharscan_key();//键值识别
voidkey_manage(unsignedcharkeycode);//键盘转散
voiddelay(unsignedintN);//延时程序
voidmanage_key1(void);//按键1~16的处理程序
…
voidmanage_key16(void);
图4键盘程序流程图
//……………….每个按键对应一个处理程序
//------------------------------------------------------------------------------
//函数名称:
program_SCANkey
//函数功能:
程序扫描键盘,
//有键按下完成按键处理,无键按下直接返回
//------------------------------------------------------------------------------
voidprogram_SCANkey()
{
unsignedcharkey_code;
if(judge_hitkey())
{
delay(1000);
if(judge_hitkey())
{
key_code=scan_key();
while(judge_hitkey());
key_manage(key_code);
}
}
}
//------------------------------------------------------------------------------
//函数名称:
judge_hitkey
//函数功能:
判断是否有键按下键盘,
//有返回1,无返回0
//------------------------------------------------------------------------------
bitjudge_hitkey()
{
unsignedcharkeycode,scancode;
C=D=E=F=0;
G=H=M=N=1;
scancode=P2&0x0f;
keycode=scancode;
if(keycode==0x0f)
return(0);
else
return
(1);
}
//------------------------------------------------------------------------------
//函数名称:
delay
//入口参数:
N
//函数功能:
延时子程序
//------------------------------------------------------------------------------
voiddelay(unsignedintN)
{
inti;
for(i=0;i } //------------------------------------------------------------------------------ //函数名称: scan_key //函数功能: 有键按下时判断键值 //------------------------------------------------------------------------------ unsignedcharscan_key() { unsignedcharkey,keycode,scancode,scancode1; scancode=P1&0x0f; P1=0xe0+scancode; while((P1&0xf0+P2&0x0f)! =0xff) { key=(P1&0xf0)+(P2&0x0f); keycode=key; if((keycode&0x0f)! =0x0f) break; scancode1=((P1|0x0f)<<1)|0x0f; P1=scancode1&0xf0+scancode; } return(keycode); } //------------------------------------------------------------------------------ //函数名称: key_manage //入口参数: keycode扫描键盘返回的键值(高4位代表列,低4位代表行) //函数功能: 键盘转散 //------------------------------------------------------------------------------ voidkey_manage(unsignedcharkey_code) { switch(key_code) { case0xee: manage_key1();break; … case0x77: manage_key16();break; //default; } } voidmanage_key1() { } … 5.2.2单片机对TSL230R的控制 本系统控制可编程光频转换器,调节频率的采集精度。 单片机通过按键的识别来对S0,S1,S2,S3的控制,从而来控制芯片的放大倍数。 程序: voidmanage_key1()//100倍 { S0=1; S1=1; S2=0; S3=0; } voidmanage_key2()//10倍 { S0=0; S1=1; S2=0; S3=0; } voidmanage_key3()//1倍 { S0=1; S1=0; S2=0; S3=0; } voidmanage_key4()//0.1倍 { S0=1; S1=0; S2=0; S3=1; } voidmanage_key5()//0.01倍 { S0=1; S1=0; S2=1; S3=1; } 程序说明: S0,S1,S2,S3分别对应着P1.0,P1.1,P1.2,P1.3口。 在检测光强的过程中,光频转换器将一直保持同一工作状态,保证每个样品的检测都是在同一标准下进行的。 5.2.3单片机频率采集的软件设计 利用AT89C55单片机的T0、T1的定时计数器功能,来完成对输入的信号进行频率计数,计数的频率结果通过8位动态数码管显示出来。 要求能够对0-250KHz的信号频率进行准确计数,计数误差不超过±1Hz。 1)定时/计数器T0和T1的工作方式设置,T1是工作在计数状态下,对输入的频率信号进行计数,但对工作在计数状态下的T1,最大计数值为fOSC/24,由于fOSC=12MHz,因此: T1的最大计数频率为250KHz。 对于频率的概念就是在一秒只数脉冲的个数,即为频率值。 所以T0工作在定时状态下,每定时1秒中到,就停止T1的计数,而从T1的计数单元中读取计数的数值,然后进行数据处理。 2)T0工作在定时状态下,最大定时时间为65ms,达不到1秒的定时,所以采用定时50ms,共定时20次,即可完成1秒的定时功能。 程序: //---------------------------函数声明,变量定义------------------------- #include unsignedcharT1count; un
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 农药 残留 毒性 检测 控制系统 软件设计