以前做了一个设计,抽到的题目是智能温度控制器,要求是汇编语言实现,
并且要在开发板上进行实物验证。
(本代码已在实验室验证,一定可行)
具体程序代码、内容、要求等都在word里面。
该系统在超过设定的温度上限或者低于其下限的时候会亮灯报警。
此设计为原创设计。
仿真图如图所示。
希望大家多多鼓励。谢谢。
设计任务: 采用DS18B20温度传感器和AT89S52单片机及显示电路完成环境温度的实时显示。
⒈ 数字温度计的总体方案设计
⑴系统总体结构
数字温度计的系统框图。
⑵芯片选择
⑶DS18B20主要性能指标
⒉硬件电路设计
⑴AT89S52单片机最小系统
⑵DS18B20与AT89S52单片机接口电路设计
⑶显示电路与AT89S52单片机接口电路设计
⒊软件设计
⑴主程序框图
⑵DS18B20温度采集程序框图
⑶显示程序框图
⒋调试与测试结果分析
⑴实验系统连线图
⑵程序调试
⑶实验结果分析
⒌程序清单和系统原理图
附录:单片机程序及设计电路(有比较详细的中文注释)
DQ BIT P1.0 ;DS18B20数据位
FLAG1 BIT 00H ;DS18B20是否存在的标志位
SIGN BIT 01H ;符号位
MSB EQU 30H ;转换数据高位字节
LSB EQU 31H ;转换数据低位字节
INTEG EQU 32H ;转换数据整数部分
DECIM EQU 33H ;转换数据小数部分
SEG_S EQU 34H ;符号位段码
SEG_I3 EQU 35H ;整数部分的百位段码
SEG_I2 EQU 36H ;整数部分的十位段码
SEG_I1 EQU 37H ;整数部分的个位段码
SEG_D1 EQU 38H ;小数部分的段码
ORG 0000H
MAIN: CLR P1.1 ;正常运行指示灯亮
LCALL INIT_1820 ;DS18B20初始化
LCALL GET_TEMPER ;读取转换数据
LCALL COMPARE ;判断是否超出设定温度范围
LCALL DATA_PROC ;数据处理
LCALL SEG_GEN ;生成显示码
LCALL DISPLAY ;数码显示
SJMP MAIN
;DS18B20复位初始化子程序(单总线)
INIT_1820: SETB DQ
NOP
CLR DQ ;主机发出延时复位低脉冲
MOV R1,#3
TSR1: MOV R0,#107
DJNZ R0,$
DJNZ R1,TSR1 ;延时651微秒
SETB DQ ;拉高数据线
NOP
NOP
NOP ;延时3微秒
MOV R0,#25H
TSR2: JNB DQ,TSR3 ;等待DS18B20回应
DJNZ R0,TSR2 ;延时并检测应答信号,148微秒
LJMP TSR4
TSR3: SETB FLAG1 ;置标志位,表示DS1820存在
LJMP TSR5
TSR4: CLR FLAG1 ;清标志位,表示DS1820不存在
LJMP TSR6
TSR5: MOV R0,#117
DJNZ R0,$ ;时序要求延时一段时间,234微秒
TSR6: SETB DQ
RET
;读出转换后的温度值
GET_TEMPER:
SETB DQ
LCALL INIT_1820 ;先复位DS18B20
JB FLAG1,TSS2
RET ;判断DS1820是否存在
TSS2: MOV A,#0CCH ;跳过ROM匹配
LCALL WRITE_1820
MOV A,#44H ;发出温度转换命令
LCALL WRITE_1820
LCALL DELAY ;等待AD转换结束,12位转换需750微秒
LCALL INIT_1820 ;准备读温度前先复位
MOV A,#0CCH ;跳过ROM匹配
LCALL WRITE_1820
MOV A,#0BEH ;发出读温度命令
LCALL WRITE_1820
LCALL READ_18200 ;将读出的温度数据保存到35H/36H
RET
;写DS18B20的子程序(有具体的时序要求)
WRITE_1820:MOV R2,#8 ;一共8位数据
CLR C
WR1: CLR DQ
MOV R3,#6
DJNZ R3,$
RRC A
MOV DQ,C
MOV R3,#23
DJNZ R3,$
SETB DQ
NOP ;两个写周期至少需要1微秒的恢复时间
DJNZ R2,WR1
SETB DQ
RET
; 读DS18B20的程序,从DS18B20中读出两个字节的温度数据
READ_18200:MOV R4,#2 ;将温度高位和低位从DS18B20中读出
MOV R1,#31H ;低位存入31H,高位存入30H
RE00: MOV R2,#8 ;数据一共有8位
RE01: CLR C
SETB DQ
NOP
NOP
CLR DQ
NOP
NOP
NOP
SETB DQ
MOV R3,#9
RE10: DJNZ R3,RE10
MOV C,DQ
MOV R3,#23
DJNZ R3,$
RRC A
DJNZ R2,RE01
MOV @R1,A
DEC R1
DJNZ R4,RE00
RET
;数据处理子程序,判断正负,并分离转换值的整数和小数部分
;符号位为SIGN,0为正,1为负
;整数部分存放在INTEG(32H)中,小数部分存放在DECIM(33H)中
;先判断转换数据的正负
DATA_PROC: CLR C ;清零进位位
CLR SIGN ;清零符号位
MOV A,MSB ;将DS18B20转换数据的高位字节给8位累加器
RLC A ;将累加器A带进位的左移,把MSB的最高位给C
JC NEG ;判断符号位,C=1说明为负数,跳转到NEG
LJMP PROC ;C=0说明为正数,跳转到PROC
;下面对负数进行取补码
NEG: CLR C ;清零进位位
SETB SIGN ;将符号位置1,表示负数
MOV A,LSB ;将DS18B20转换数据的低位字节给8位累加器
CPL A ;累加器A的8位取反
ADD A,#1 ;取反后加1
MOV LSB,A ;再将取反后的补码给LSB
MOV A,MSB ;同理将MSB进行取补码
CPL A
ADDC A,#0 ;此处应注意LSB是否向MSB进位
MOV MSB,A
;下面分离转换值的整数和小数部分
;DS18B20为转换数据为16位,其中,高字节的高5位为温度符号位,
;高字节的低3位+低字节的高4位为温度的整数部分,低字节的低4位为温度的小数部分
PROC: MOV A,LSB
ANL A,#0FH ;保留低字节的低4位
MOV DECIM,A ;将小数部分存储在DECIM
MOV A,MSB
SWAP A ;累加器A中高低4位互换
ANL A,#0F0H ;保留高字节的低4位
MOV INTEG,A
MOV A,LSB
SWAP A
ANL A,#0FH ;保留低字节的高4位
MOV R0,INTEG
ORL A,R0 ;高字节的低4位加上低字节的高4位
MOV INTEG,A ;得到的整数部分存储在INTEG
RET
;下面对设置温度上限与下限,超过范围将点亮报警灯
COMPARE: PUSH ACC
CLR C
MOV A, #28 ;设置温度上限
SUBB A,INTEG ;温度上限减去整数部分
JC Z1 ;若超过温度上限,则跳转到Z1
MOV A,#26 ;设置温度下限
SUBB A,INTEG ;温度下限减去整数部分
JNC Z1 ;若低于温度下限,则跳转到Z1
CLR C
SETB P1.2 ;若在上下限之间,则不点亮报警灯
POP ACC
RET
Z1: CLR C
CLR P1.2 ;点亮报警灯
POP ACC
RET
;生成显示码子程序
;符号位段码存放在SEG_S中,整数段码存放在SEG_I3到SEG_I1中
;小数部分段码存放在SEG_D1中
SEG_GEN: MOV DPTR,#TABLE ;将0到9的数码段的段首地址给DPTR
JB SIGN,S_NEG ;判断符号位,若为负数,跳转至S_NEG
MOV SEG_S,#0FFH ;若为正数,则符号位数码段都不亮
SJMP S_INT
S_NEG: MOV SEG_S,#0BFH ;若为负数,则符号位数码段显示“-”
S_INT: MOV A,INTEG
MOV B,#100
DIV AB ;A除以B,商放在A中,商即为整数部分的百位数
MOVC A,@A+DPTR ;将百位数的段码给A
MOV SEG_I3,A ;得到百位数段码,存储在SEG_I3
;下面同理得到十位数的段码
MOV A,B
MOV B,#10
DIV AB
MOVC A,@A+DPTR
MOV SEG_I2,A
MOV A,B
MOVC A,@A+DPTR
ANL A,#7FH ;加上小数点
MOV SEG_I1,A ;得到十位数的段码
;下面通过散转程序得到小数的段码
MOV DPTR,#SWITCH
MOV A,DECIM
MOV B,DECIM
ADD A,B ;AJMP指令占用2个字节
JMP @A+DPTR ;间接转移指令,根据小数值查表,求段码
SWITCH: AJMP K0
AJMP K1
AJMP K2
AJMP K3
AJMP K4
AJMP K5
AJMP K6
AJMP K7
AJMP K8
AJMP K9
AJMP K10
AJMP K11
AJMP K12
AJMP K13
AJMP K14
AJMP K15
K0: MOV SEG_D1,#0C0H
AJMP RETURN
K1: MOV SEG_D1,#0F9H
AJMP RETURN
K2: MOV SEG_D1,#0F9H
AJMP RETURN
K3: MOV SEG_D1,#0A4H
AJMP RETURN
K4: MOV SEG_D1,#0B0H
AJMP RETURN
K5: MOV SEG_D1,#0B0H
AJMP RETURN
K6: MOV SEG_D1,#99H
AJMP RETURN
K7: MOV SEG_D1,#99H
AJMP RETURN
K8: MOV SEG_D1,#92H
AJMP RETURN
K9: MOV SEG_D1,#82H
AJMP RETURN
K10: MOV SEG_D1,#82H
AJMP RETURN
K11: MOV SEG_D1,#0F8H
AJMP RETURN
K12: MOV SEG_D1,#80H
AJMP RETURN
K13: MOV SEG_D1,#80H
AJMP RETURN
K14: MOV SEG_D1,#90H
AJMP RETURN
K15: MOV SEG_D1,#90H
AJMP RETURN
RETURN: JNB SIGN,RETURN1 ;若为正数则跳转至RETURN1
MOV SEG_I3,#0BFH ;若为负数,则百位数将显示“-”
RETURN1: RET
;显示子程序,首位为符号位,三位整数,1位小数
DISPLAY: MOV SP,#80H
MOV P2,#0FFH
MOV DPTR,#0FF23H ;指向8255的控制字寄存器
MOV A,#81H ;设置8255的PA、PB为输出,PC为输入
MOVX @DPTR,A ;写8255控制字寄存器
XS1: MOV DPTR,#0FF21H ;指向8255的PB口(七段码)
MOV A,SEG_I3 ;百位的七段码
MOVX @DPTR,A ;通过8255的PB口送出七段码
MOV DPTR,#0FF20H ;位选地址(PA)
MOV A,#0DFH ;左边第1个数码管的位选
MOVX @DPTR,A ;点亮选择左边第一个数码管
CALL DELAY ;调用延时子程序
;下面相同原理进行位选数码管
XS2: MOV DPTR,#0FF21H
MOV A,SEG_I2 ;十位的七段码
MOVX @DPTR,A
MOV DPTR,#0FF20H
MOV A,#0EFH ;左边第2个数码管的位选
MOVX @DPTR,A
CALL DELAY
XS3: MOV DPTR,#0FF21H
MOV A,SEG_I1 ;个位的七段码
MOVX @DPTR,A
MOV DPTR,#0FF20H
MOV A,#0F7H ;左边第3个数码管的位选
MOVX @DPTR,A
CALL DELAY
XS4: MOV DPTR,#0FF21H
MOV A,SEG_D1 ;小数的七段码
MOVX @DPTR,A
MOV DPTR,#0FF20H
MOV A,#0FBH ;左边第4个数码管的位选
MOVX @DPTR,A
CALL DELAY
XS5: MOV DPTR,#0FF21H
MOV A,#9CH ;"℃"的小圆圈的七段码
MOVX @DPTR,A
MOV DPTR,#0FF20H
MOV A,#0FDH ;左边第5个数码管的位选
MOVX @DPTR,A
CALL DELAY
XS6: MOV DPTR,#0FF21H
MOV A,#0C6H ;"℃"的“C“的七段码
MOVX @DPTR,A
MOV DPTR,#0FF20H
MOV A,#0FEH ;左边第6个数码管的位选
MOVX @DPTR,A
CALL DELAY
;延时子程序
DELAY:
MOV R1,#5
D2: MOV R2,#120
DJNZ R2,$
DJNZ R1,D2
RET
;0到9数字的数码段段码
TABLE: DB 0C0H,0F9H,0A4H,0B0H,99H
DB 92H,82H,0F8H,80H,90H
END
完整的Word格式文档51黑下载地址:
课设报告.doc
(68.5 KB, 下载次数: 117)
|