温度低于该设定的恒定温度2℃时,单片机发出控制命令信号,继电器动作吸合,外部加热电阻开始加热。当温度超过设定的恒温值2℃时,单片机发出命令信号,继电器断开,加热电阻停止加热;制冷过程采用自然冷却。
3.5 串口通信程序
串行通信的信息传输在一个方向上只占用1根线。在1根通信线上既传输数
据又传输联络控制信息是串行通信的特点。因此,串行通信有着一系列通信协议和规程。
3.5.1 串行通信协议
通信协议是对数据传输方式的规定,通信双方必须遵从统一的通信协议。 AT89C51串口与各智能模块的通讯按各自定义的通讯协议进行通讯,其过程如下: 1) 首先使所有从机的SM2位置,以使其处于只接收地址帧的状态。
2) 控制卡先发一地址信息,其中8位为地址,第9位为地址/数据信息的标志
位,该位置1表示该帧位地址信息。
3) 从机接收到地址帧后,各自将接收到的地址与从本机的地址比较。对于地址
相符的从机,使SM2=0,以接收主机随后发来的所有信息;对于地址不相符的从机,使SM2=1,继续执行采集和其他任务。
4) 当从机发送数据结束后,发送一帧校验和,并置第9位(TB8)为1,作为从
机数据传送的结束标志。
5) 控制卡接收数据时先判断数据结束标志(RB8),若RB8=1,且校验和正确,则
回送正确信号00H,此信号可令该从机复位,重新采集数据,等待地址帧。若校验和出错,则送0FFH,令该机重发数据,如果重发5次还不行,则认为失败,转其它地址。若接收帧RB8=0,则将原数据送到缓冲区,并准备接收下帧信息。
6) 从接收到的复位命令后回到监听地址状态(SM2=1)。
3.5.2 串行通信格式
异步串行通信遵守以下格式:如图3-5所示 ←——传输方向 - 31 -
1 0 1/0 1/0 1/0 1/0 数据位 1/0 1/0 1/0 1/0 1/0 1 起始位︱ 空号︱ ︱校验位︱停止位 图3-5 异步串行通信格式
逻辑0为串行异步通信的起始位,当接收设备监测到这个逻辑低电平时,就开始准备数据位接收信号。起始位的作用就是同步设备。
当接收设备接收到起始位后,接着就会接收到数据位。数据位的个数可以是5位、6位、7位或8位,由通信双方约定。数据发送时,低位在前,高位在后。
数据发送完以后,可以发送奇偶校验位。奇偶校验用于有限差错检测,通信双方约定一致的奇偶校验方式。如果选择偶效验逻辑1的数据位个数与逻辑1的奇偶位个数之和必须是偶数;如果选择奇校验,逻辑1的数据位个数与逻辑1的奇偶为个数之和必须是奇数。
在奇偶校验位或数据位(无奇偶校验位时)之后发送的是停止位。停止位是一个数据的结束标志,可以是1位、1.5位或2位的低电平。接收设备接收到停止位后,通信线便恢复到逻辑1的空闲状态。
字符帧格式是在数据位前面加1位用“0”作为标志的起始位,在数据位后
面加上1位奇/偶校验位和用“1”作为标志的停止位(1位或1.5位或2位)。 “0”和“1”这两种标志也分别称为传号和空号。发送器在发送1个字符之前,先发送起始位,而在字符发送完之后,再发送奇/偶校验位、停止位。当接收器检测到起始位时,便确定1个字符的传输到来,于是开始接收字符,并进行规定的奇/偶校验位和停止位检测,1个字符接收完成。
在字符帧格式的起始位和奇/偶校验位、停止位之间,是相应的字符信息,称为数据位。数据位通常由7位ASCII码组成,数据位传输是由低位向高位依次进行的。因此,传输1个字符,必须以完整的字符帧格式(10位或10.5位或11位)格式依序传输。
传输开始后,接收设备不断地检测传输线,在一系列的“1”(称为空闲位)之后检测到一个“0”信息位,就确认1个字符开始传输了,于是以位时间为间隔移位接收所规定的数据位和奇/偶校验位,最后是规定长度的停止位“1”。接收方把数据位拼装成1位字符,并进行奇/偶校验和停止位检测,只有既无校验
- 32 -
位错,亦无停止位错的接收才算正确的。1个字符接收完毕后,接收设备又继续检测传输线,监视“0”信号的到来和下一个字符传输的开始,如此反复。
3.5.3流程图
串口通信过程采用中断方式,SBUF是串行口数据缓冲器,是一个可以直接寻址的专用寄存器。在物理上,一个作为发送缓冲器,一个作为接收缓冲器。两个缓冲器共用一个口地址99H,由读写信号区分,CPU写SBUF时为发送缓冲器,读SBUF时为接收缓冲器。单片机响应串口中断申请,根据控制字执行相应的读写操作。串口中断过程如图3-6所示:
串口中断 关中断
控制字转移 读SBUF
调读函数 调写函数 控制“读” 控制“写”
结 束 开中断 图3-6 串口中断流程图
3.6 系统源程序
=======================各存储器地址定义=================================
ADPORT EQU 0FEFBH;AD转换口地址
- 33 -
LEDBUF EQU 30H; 将送显示的八段码存储器 TEMP EQU 40H; 置缓冲区首地址 LOWLIMIT EQU 30; 最低设定温度 HIGHLIMIT EQU 70; 最高设定温度 LOWTEMP EQU 0; 温度下限 HIGHTEMP EQU 100;温度上限
SETTEMP EQU 50H;设定温度值存储器 CURTEMP EQU 51H;当前实际温度存储器 ADRAM EQU 60H;AD转换后数字量存储器 DIN BIT 0B0H;串行通信口 CLK BIT 0BIH;触发源
=======================程序开始部分====================================
ORG 0000H;程序首地址 LJMP START ;跳到主程序
LEDLAB: DB 3FH,06H,5BH,4FH,66H,6DH;要显示温度值对应的八段码表 DB 7DH,07H,7FH,6FH
===========================显示子程序================================== DISPLAYLED:
PUSH ACC;保护现场 PUSH DPH PUSH DPL
MOV R0,#LEDBUF;
MOV R1,#TEMP;送缓冲区首址
MOV R2,#2;显示位数计数
DL0:
MOV DPTR,#LEDLAB;指向字形段码表首址 MOV A, @R0;取要显示的数据 MOVC A,@A+DPTR;查表取字形段码 MOV @R1,A
MOV P1,A;由P1口送LED显示 DP1:
JNB TI,DL1;等待发送完一帧 CLR TI;清发送中断标志
DEC R0;指向下一个显示单元 DJNZ R2,DL0;2位未显示重复 POP DPL;恢复现场 POP DPH POP ACC
======================延时子程序======================================= DELAY: MOV R6,#100 DELAYLOOP:
MOV R5,#248
- 34 -
DJNZ R5,$
DJNZ R6,DELAYLOOP RET
===================温度计算与处理子程序================================= READTEMP:
ACALL READAD
MOV ADRAM,A;存由READAD子程序得来的A/D转换数字量 MOV B,#(HIGHTEMP-LOWTEMP);执行相关计算 MUL AB
MOV A,B;取高八位相当于除以256 ADD A,#LOWTEMP
MOV CURTEMP,A;保存求得的温度 RET DISPLAYRESULT:
CALL READTEMP
MOV A,ADRAM;A/D转换的数字量送A PDC:
MOV A,CURTEMP;取当前温度 LJMP GOON GOON:
MOV B,#10;转换为相应的十进制的八段码的偏移量 DIV AB
MOV LEDBUF+1,A MOV A,B
MOV LEDBUF+2,A RET
=====================读A/D口子程序==================================== READAD:
MOV DPTR,#ADPORT CLR A
MOVX @DPTR,A; 使P0为高阻抗,并使ADC0804开始转换,
WR=0
WAIT: JB P3.2,WAIT; 检测ADC0804的INTR=0?,是则转换完
成
MOVX A,@DPTR; 将转换好的数据载入累加器 CPL A ; 将累加器的值反相 MOV P1,A ; 输出至P1显示 CALL DELAY ; 延时50毫秒 RET
==========================主程序======================================
- 35 -