基于单片机多路温度采集系统.docx
《基于单片机多路温度采集系统.docx》由会员分享,可在线阅读,更多相关《基于单片机多路温度采集系统.docx(23页珍藏版)》请在冰豆网上搜索。
基于单片机多路温度采集系统
目录
第1节前言……………………………………………………………………………1
1.1多路温度采集系统概述…………………………………………………………1
1.2本设计任务和主要内容………………………………………………………1
第2节系统总体设计…………………………………………………………………2
2.1系统概述………………………………………………………………………2
2.2系统工作原理…………………………………………………………………2
第3节系统的硬件设计………………………………………………………………3
3.1CPU的选用……………………………………………………………………3
3.2ADC0809………………………………………………………………………4
3.2.1ADC0809的内部逻辑结构………………………………………………4
3.2.2引脚结构…………………………………………………………………5
第4节软件编辑思路及流程……………………………………………………………6
4.1软件编辑思路…………………………………………………………………6
4.2具体软件编程…………………………………………………………………6
第5节结束语…………………………………………………………………………18
参考文献…………………………………………………………………………………19
基于单片机的多路温度采集系统
第1节前言
本课题要设计一种多路温度采集检测系统,采用目前低价位但技术十分成熟的AT89C52单片机作为内核,选用电位器代替热敏电阻为输入元件,利用ADC0809转换信号,送到显示器(8个LED数码管)循环显示所测的四路温度数值,并根据现场工业需要,设置了一定范围的报警值,报警优先显示,利用按键消除报警。
可用按键查看某一路的温度值,查看时采集不中断。
软件算法上采用了直接拟合的方法(通过电压-温度关系来计算温度值),符合课题要求。
本课题构成的多路温度系统具有结构简单、价格低廉、测量精度高、量程宽的特点,在很多场合具有一定的适用性。
关键词:
AT89单片机、温度采集、显示、报警
1.1多路温度采集系统概述
温度采集在工业中的应用越来越广泛,而且要求也越来越高,我们结合本学期所学的《单片机原理与应用技术》课程,利用实验室已有的AT89系列单片机,作一个简易的可多路检测温度并能在超出范围时报警的系统。
该系统用AT89S52单片机作为内核,利用ADC0809转换芯片辅助,以八个电位器作为模拟温度输入信号,一个5路8位数码管作为显示设备。
可单独循环显示每一路的温度值,并且有键盘控制显示每路的温度值,这样可以满足在工业需要。
1.2本设计任务和主要内容
设计应解决下列各主要问题:
1、8路温度值(可用0~5V电压值模拟0-100℃)的数据采集,经A/D转换后送入单片机;
2、8个键盘、8个LED数码管显示电路,用于循环显示每一路的温度值(显示精确到小数点后一位),通过按键还可以选择任意一路显示。
3、设温度值的正常范围,若当前温度值超过此范围,则LED闪烁报警;
4、通过按键解除报警。
第2节系统总体设计
2.1系统概述
根据设计要求的性能指标,本系统不仅要满足一定精度的温度采集的基本功能,而且由于测量的路数为8路,还存在多路信号的循环显示问题,还要考虑温度超限报警输出的功能,同时系统还具有显示当前各路的测量温度值的功能和键盘选择显示路数的功能。
2.2系统工作原理
根据本课题的设计目标以及硬件的特点,本系统的结构原理图如下图2-1所示:
图2-1 系统结构原理图
图2-2系统原理图
第3节系统的硬件设计
一个温度采集系统,包括被采集信息的采集、转换、显示等环节,在本多路温度采集系统中,包括A/D转换电路的设计,CPU的选型以及包括显示电路,存储器、报警电路、电源电路等设计。
3.1CPU的选用
目前,生产单片机的厂商有很多,尤其是近年来微电子技术、计算机技术的飞速发展,比较著名的有Intel、Philips、Microchip、Motorola、Zilog、Atmel等半导体企业。
在上述著名的半导体企业产品中,尤其在工业测控场合,运用较多的为Intel公司的MCS-51系列,Microchip公司的PIC系列,如果作单路温度测量,恐怕要选择该系列的CPU,但由于本系统涉及的是多路,各路报警的输出信号需要单独输出,而且考虑信号调理电路的切换等还需要不少的控制线,因此该系列的少引脚特点就不适合本设计的需要,因此,本设计还是选用了ATMEL最新的8位单片机AT89S52作为本系统的CPU。
下面简单地介绍一下89S52。
功能特性描述:
AT89S52是一种低功耗、高性能CMOS8位微控制器,具有8K在系统可编程Flash存储器。
使用Atmel公司高密度易失性存储器技术制造,与工业 80S52产品指令和引脚完全兼容。
片上Flash允许程序存储器在系统可编程,亦适于常规编程器。
在单芯片上,拥有灵巧的8位CPU和在系统可编程Flash,使得AT89S52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。
89S52具有以下标准功能:
8k字节Flash,256字节RAM,32位I/O口线,看门狗定时器,2个数据指针,三个16位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路。
另外,AT89S52可降至 0Hz静态逻辑操作,支持2种软件可选择节电模式。
空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。
掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。
图3-1 89C52的引脚
3.2ADC0809
ADC0809是把采集的模拟量转换成数字量并传送到89C52中。
它是带有8位A/D转换器、8路多路开关以及微处理机兼容的控制逻辑的CMOS组件并且还是逐次逼近式A/D转换器,可以和单片机直接接口。
3.2.1 ADC0809的内部逻辑结构
图3-2 ADC0809的内部逻辑结构
由图3-2可知,ADC0809由一个8路模拟开关、一个地址锁存与译码器、一个A/D转换器和一个三态输出锁存器组成。
多路开关可选通8个模拟通道,允许8路模拟量分时输入,共用A/D转换器进行转换。
三态输出锁器用于锁存A/D转换完的数字量,当OE端为高电平时,才可以从三态输出锁存器取走转换完的数据。
3.2.2引脚结构
图3-4ADC0809的引脚
第4节软件编辑思路及流程
4.1软件编辑思路
软件编辑思路:
数字显示----算法----一路采集----一路采集转换及显示---八路采集转换及显示----键盘小子程序----八路循环采集且键盘控制------八路循环采集且键盘控制和报警。
4.2具体软件编程
ORG0000H
AJMPMAIN;
BUF EQU 40H;显示缓冲区
MOTATA EQU 50H;AD0809数据存放于此
WH EQU 48H;温度上限数据存放区
WL EQU 58H;温度下限数据存放区
BUFF1S EQU38H;
BUFF1MS EQU 39H;
BUFF5S EQU 3AH;
INNAL EQU 3CH;
ALARMBUF EQU33H
BUFFH EQU31H;八路LED报警信号红灯
BUFFL EQU 32H;八路LED报警信号绿灯
BACK EQU 34H;利用与BUF地址的重复修改路数
CHANNEL EQU 35H
TEMPBUF EQU 36H
READ_AD BIT 30H;是否要读写AD0809的标志位
DISPIN BIT 31H;
SETWARNBIT 32H
SOLIDISP BIT 33H
ENTER BIT P1.2
SETH BIT 35H
SETL BIT 36H
SETIN BIT P1.3
ABYTEIN BIT p1.1
ORG0003H
AJMPINT_0;
ORG000BH
LJMPINT_T0
ORG0100H
MAIN:
MOV SP, #70H ;设置堆栈位置
SETB READ_AD ;初始化标志位
SETB EA ;开总中断
CLR SETWARN ;清除温度设置标志位
SETB SETIN ;当其为0时表示要进行通道数采集
LCALL INITWARN ;初始化温度上下限
LCALL INIT_2 ;初始化2#工作寄存器区
;主循环,启动ADC0809,从第一个通道开始读取
LOOP:
JNB READ_AD,DIS ;若不读AD0809,则调显示,次标志位也表示1s延时结束
;延时已完毕,则计算要显示的温度路数及温度值送缓冲区
LCALL WARN ;报警
CLR READ_AD ;清楚标志位
LCALL READ ;读取一次AD0809
LCALL DLY1MS ;此处加1ms的延时,否则数码管会因中断的存在而产生闪动
LCALL ADJUST ;调整显示
;在此完成键盘检测及显示任务
DIS:
LCALL DISPLAY;
LCALL KEYCHK ;调键盘检测子程序
CJNE A,#0FFH,AKEY ;若有键按下,则跳转
LJMP LOOP ;若没有则循环
AKEY:
LCALL KEYFUNC;
CJNE A,#0FFH,CALLRPD ;验证按下的键是否为数字键,若是则处理输入
LJMP LOOP ;不为数字键则返回循环
CALLRPD:
LCALL KEYRPD;
SJMP LOOP;
;*********初始化2#工作寄存器区************
INIT_2:
PUSH PSW ;初始化2号工作寄存器区
SETB RS1;
CLR RS0 ;选择2号工作寄存器区
MOV R2,#00H ;存放要显示的路数
CLR DISPIN ;初始化路显示标志位;
MOV R0,#MOTATA ;R0充当指向MOTATA的指针
POP PSW;
RET;
;*******调整指针*********
PADJUST:
ONADJUST:
DJNZ R2,INADJUST;
RET;返回
INADJUST:
INC R0;
SJMP ONADJUST;
;*************计算并调整显示缓存区的数据*******
ADJUST:
PUSH PSW;保护
SETB RS1;
CLR RS0 ;选择2号工作寄存器区
CJNE R2,#08H,NE08;
GE08:
MOV R2,#00H;
MOV R0,#MOTATA;
SJMPLESS08;
NE08:
JNCGE08;
LESS08:
JB SETWARN, DISPWARN ;若在设定温度,则也不调整显示
JB SOLIDISP, ADJEND ;若为固定显示,则跳过调整
JB DISPIN,DLY_5S ;若有键盘值输入,则延时5秒来暂时固定显示
INC R0 ;调整R0,使其指向下一个要显示的温度值地址
INC R2 ;调整R2
mov channel,r2;
SJMP ADJEND;
DLY_5S:
DJNZ BUFF5S,ADJEND;
CLR DISPIN;
LJMP ADJEND
DISPWARN:
JB SETH,DISHIGH ;若在调整上限值则跳转到上限温度显示
JB SETL,DISLOW ;若在调整下限值则跳转到下限温度显示
SJMP ADJEND ;若不在调整则显示输入路数的当前检测温度值
DISLOW:
MOV R0,#WL ;将指针调整到温度上限存放区
SJMP ADAPT ;跳转到指针调整处
DISHIGH:
MOV R0,#WH ;将指针调整到温度下限存放区
ADAPT:
MOV R2,CHANNEL ;调整R2的值为通道数
LCALL PADJUST ;指针指向R2
ADJEND:
LCALL LOADTEMP ;将当前指针指向数据放到缓冲区
POP PSW;
RET;
;****************将当前指针指向数据放到缓冲区********
LOADTEMP:
LCALL COMPUTE ;调用COMPUTE得到要显示的当前温度值
MOV R1,#BUF;
MOV A,channel;
MOV @R1,A ;将路数送入显示缓冲区
INC R1 ;调整到要显示温度值的缓冲区
JB SETH,DISPH ;若设定温度上限,则显示H
JB SETL,DISPL ;若设定温度下限,则显示L
Mov a,#10h ;消隐
SJMP DISP2
DISPH:
MOV A,#11H
SJMP DISP2
DISPL:
MOV A,#12H
DISP2:
mov @r1,a;
INC R1;
MOV A,R5;
ANL A,#0FH;
MOV @R1,A ;最低位
INC R1;
MOV A,R5;
ANL A,#0F0H;
SWAPA;
MOV @R1,A ;次低位,应当在此处添加小数点
INC R1;
MOV A,R4;
ANL A,#0FH;
MOV @R1,A ;次高位
INC R1;
MOV A,R4;
ANL A,#0F0H;
SWAP A;
MOV @R1,A ;最高位
RET;
;*************读取一次0809的内容***********
READ:
MOV R6,#08H ;用中断的方式读取一次AD0809
MOV R0,#MOTATA ;0号工作寄存器区
MOV DPTR,#0FFFEH ;A0作为地址
MOV A,#00H ;表示先检测第一个通道
MOV INNAL,A ;将检测的路数保存
MOVX @DPTR,A ;开启ADC0809
SETB EX0 ;开外部中断0
RET ;若已读取完毕,则返回
;**********************显示子程序************
;要显示的数据入口为BUF(6位);1号工作寄存器区
DISPLAY:
PUSH PSW ;压栈保护
SETB RS0;
CLR RS1 ;切换工作寄存器区到1
MOV R0,#BUF
MOV R7,#06H
MOV R1,#01H
NEXTDIS:
MOV A,@R0
MOV DPTR,#TABLE
MOVC A,@A+DPTR;取段码
CJNE R7,#03H,NODIP;显示小数点
ANL A,#07FH
NODIP:
MOV DPTR,#0FFDCH
MOVX @DPTR,A ;送段码
MOV DPTR,#0FFDDH
MOV A,R1
MOVX @DPTR,A ;送位码
RL A
MOV R1,A
LCALL DLY1MS
INC R0 ;调整显示
DJNZ R7,NEXTDIS;
POP PSW;
RET
;**************************延时1ms****************************
DLY1MS:
MOV BUFF1MS,#0F9H
DJNZ BUFF1MS,$
RET
;*************************按键检查子程序********************
KEYCHK:
MOV A,#00H ;查看是否有键按下
MOV DPTR,#0FFDDH
MOVX @DPTR,A
MOV DPTR,#0FFDEH
MOVX A,@DPTR
CPL A
ANL A,#0FH
JNZ TEST ;若有键按下则检测,无则返回。
MOV A,#0FFH
RET
TEST:
LCALL KEYTEST
MOV BACK,A
LCALL DISPLAY
LCALL KEYTEST
CJNE A,BACK,NOKEYD
WAIT:
LCALL DISPLAY;
MOV A,#00H ;等待键抬起
MOV DPTR,#0FFDDH
MOVX @DPTR,A
MOV DPTR,#0FFDEH
MOVX A,@DPTR
CPL A
ANL A,#0FH
JNZ WAIT ;若键未抬起,则继续等待
MOV A,BACK;将检测到的键值送给A
SJMP CHKEND
NOKEYD:
MOVA,#0FFH
CHKEND:
RET
;**********************按键检测子程序********************
KEYTEST:
MOV R0,#0FEH
MOV R1,#00H
MOV R2,#08H
NEXTL:
MOV A,R0
MOV DPTR,#0FFDDH
MOVX @DPTR,A
MOV DPTR,#0FFDEH
MOVX A,@DPTR
CPL A
ANL A,#0FH
JNZ KEYDWN ;看按下的键是否在当前列
DJNZ R2,GOSCAN ;看是否扫描完毕,若没有则调整继续扫描
SJMP TSTEND ;若扫描完毕,则返回。
GOSCAN:
MOV A,R0
RL A
MOV R0,A
INC R1
SJMP NEXTL
KEYDWN:
MOV R3,#00H
LL0:
RRC A
JC LL1
INC R3
SJMP LL0
LL1:
MOV A,R3
MOV B,A
MOV A,#8
MUL AB
ADD A,R1 ;A中返回的为按下的键的代码
R