安徽工程大学机电学院毕业设计(论文)
电时,我们对过充点进行温度补偿,补偿方式对于2V(铅酸蓄电池每格的电压)蓄电池,基准温度为25℃,温度每变化1℃,电压补偿3mV[14]。 4.2 子程序流程图
一、8253完成外部计数功能
单片机本身对信号的处理工程并不复杂,完成测控模块的关键在于使用合适的方法和合理的外围芯片处理和输出信号。本例中采用单片机的外围计数芯片,8253作为专用的计数芯片,单片机通过对外围计数芯片的控制,完成PWM信号的输出,在输出控制指令时,由于使用了外部计数器的计数脉冲,单片机只需要向8253等芯片的寄存器中发送控制脉宽的计数值,计数器能自动的根据计数值调节电平的高低变化,从而模拟PWM输出。
开始
定义8253寄存器地址
初始化中断和变量
开外中断和定时器中断
N有中断
Y
定时器0赋初值
8253计数器0=BFU810
8253计数器 1=BUF811
8253计数器 0=BFU812 返回
4-1 外部计数子流程图
采用外部计数器实现计数的具体过程如下:
(1)采用外部的晶振电路产生一定频率的计数脉冲
- 25 -
汪婷婷:基于单片机的太阳能路灯控制器设计
(2)将该频率的计数脉冲作为外部计数器的计数脉冲,而将需要测量的脉宽信号作为外部芯片的门控信号,外部芯片在该门控周期内对计数脉冲进行计数。 8353计数器子程序:
CODE SEGMENT
ASSUME CS: CODE
START: MOV AL, 10H ;设置8253计数器0为工作方式0,二进制计数 MOV DX, 283H
OUT DX, AL ;送方式控制字到控制口 MOV DX, 280H
MOV AL, 0FH ;计数初值为0FH
OUT DX, AL ;送计数初值到计数器0的端口 KKK: IN AL, DX ;读计数器当前计数值 CALL PRINT ;调用显示子程序 MOV AH, 1 ;判断是否有键按下 INT 16H
JZ KKK ;若没有,则转到KKK MOV AH, 4CH ;返回DOS INT 21H
PRINT PROC NEAR ;显示子程序 PUSH DX
AND AL, 0FH ;取低四位
MOV DL,
CMP DL, 9 ;判断是否小于或等于9 JLE NUM ;是(?-?),ASCII码加30H
ADD DL, 7 ;不是(?A?-?F?),ASCII码加37H NUM: ADD DL, 30H
MOV AH, 2 ;显示字符 INT 21H
MOV DL, 0DH ;回车 INT 21H
MOV DL, 0AH ;换行 INT 21H POP DX
RET ;子程序返回 PRINT ENDP CODE ENDS
END START
二、温度传感器DS18B20
使用单片机和温度传感器DS18B20完成对温度的检测和补偿,通过AT89C52完成对DS18B20芯片的控制和数据传输。主要完成对DS18B20的调用中断管理、测量温度值得计算及温度值得显示等功能,DS18B20自动的分辨
- 26 -
安徽工程大学机电学院毕业设计(论文)
率可以通过编程进行选择,显示程序的实现是对各温度值的显示,并且允许中断的产生以修正温度值,实现及时的温度测量。其工作的流程图如图
开始
初始化DS18B20
读DS18B20的序列号
Y检测DS18B20存在?
N
发送跳过ROM指令
温度转换
I=1,等待
DS18B20复位
发送DS18B20编码 读取温度数据
4-2 DS18B20的测温程序流程图
DS18B20的测温程序:
TEMPER_L EQU 36H ;存放读出温度低位数据 TEMPER_H EQU 35H ;存放读出温度高位数据 TEMPER_NUM EQU 60H ;存放转换后的温度值 FLAG1 BIT 00H DQ BIT P3.3 ;一线总线控制端口
ORG 0000H LJMP MAIN ORG 0100H MAIN:
MOV SP,#70H
- 27 -
汪婷婷:基于单片机的太阳能路灯控制器设计
LCALL GET_TEMPER ;从DS18B20读出温度数据 LCALL TEMPER_COV ;转换读出的温度数据并保存 SJMP $ ;完成一次数字温度采集
;-------读出转换后的温度值 GET_TEMPER: SETB DQ ; 定时入口 BCD: LCALL INIT_1820 JB FLAG1,S22 LJMP BCD ; 若DS18B20不存在则返回 S22: LCALL DELAY1
MOV A,#0CCH ; 跳过ROM匹配------0CC LCALL WRITE_1820 MOV A,#44H ; 发出温度转换命令 LCALL WRITE_1820 NOP
LCALL DELAY LCALL DELAY
CBA: LCALL INIT_1820 JB FLAG1,ABC LJMP CBA
ABC: LCALL DELAY1
MOV A,#0CCH ; 跳过ROM匹配 LCALL WRITE_1820
MOV A,#0BEH ; 发出读温度命令 LCALL WRITE_1820
LCALL READ_18200 ;READ_1820 RET
;-------读DS18B20的程序,从DS18B20中读出一个字节的数据 READ_1820: MOV R2,#8 RE1: CLR C SETB DQ NOP NOP
CLR DQ NOP NOP NOP
SETB DQ MOV R3,#7 DJNZ R3,$ MOV C,DQ
- 28 -
安徽工程大学机电学院毕业设计(论文)
MOV R3,#23 DJNZ R3,$ RRC A
DJNZ R2,RE1 RET
;-------写DS18B20的程序 WRITE_1820: MOV R2,#8 CLR C
WR1: CLR DQ MOV R3,#6 DJNZ R3,$ RRC A MOV DQ,C MOV R3,#23 DJNZ R3,$ SETB DQ NOP
DJNZ R2,WR1 SETB DQ RET
;-------读DS18B20的程序,从DS18B20中读出两个字节的温度数据 READ_18200:
MOV R4,#2 ; 将温度高位和低位从DS18B20中读出
MOV R1,#36H ; 低位存入36H(TEMPER_L),高位存入35H(TEMPER_H)
RE00: MOV R2,#8 RE01: CLR C SETB DQ NOP NOP
CLR DQ NOP NOP NOP
SETB DQ MOV R3,#7 DJNZ R3,$ MOV C,DQ MOV R3,#23 DJNZ R3,$ RRC A
- 29 -