室温的采集与控制方案

daisylove1   2011-5-30 23:02 楼主
在“室温的采集与控制方案1”中,由于单片机AT89LP2052/4052只有20个引脚,为了对比采集的室温与预置室温的效果,硬件单片机改为STC89C52(STC方便下载程序),仿真效果图如下

源代码如下:

******************************************************

;室温的采集与控制系统,此系统主要分为初始化模块MAIN1,采集温度模块GET_TEMPER,温度转换模块CONVERT
;显示模块DISP1。具体的实现过程为先从GET_TEMPER模块获得室温存储在TEMPL和TEMPH中
;转换模块对他们进行转换之后将小数位,个位,十位,百位分别存储在70H,71H,72H,73H.
;预置的温度存放在地址74H,75H,76H,77H中
;显示模块disp1将小数,个,十,百位送入数码管显示
TMPL  EQU 29H;采集温度的低八位
TMPH  EQU 28H;采集温度的高八位
FLAG1  EQU 38H;DS18B20复位标志,1表示复位成功
DATAIN  BIT P3.7 ;DS18B20数据口DQ

  ORG 00H
  LJMP MAIN1
  ORG 03H
  LJMP ZINT0
  ORG 13H
  LJMP ZINT1
  ORG 30H
MAIN1: SETB IT0
   SETB EA
  SETB EX0
  SETB IT1
  SETB EX1
  SETB P3.6
  SETB P3.2
  SETB P3.3
  MOV 74H,#3
  MOV 75H,#3
  MOV 76H,#4
  MOV 77H,#0
MAIN:  LCALL GET_TEMPER
  LCALL CVTTMP
        LCALL DISP1
  AJMP MAIN
;与DS18B20通信的模块。
;与DS18B20通信的过程为:每次读写之前都要对DS18B20进行复位,复位成功后发送一条ROM指令
;最后发送RAM指令进行读写RAM。复位要求主CPU将数据线下拉500us,DS18B20受到信号后等待
;60us左右,发出60——240us的低脉冲,主CPU收到此信息代表复位成功
INIT_1820: SETB DATAIN
  NOP
  CLR DATAIN
  MOV R1,#3
TSR1:  MOV R0,#107
  DJNZ R0,$
  DJNZ R1,TSR1
  SETB DATAIN
  NOP
  NOP
  NOP
  MOV R0,#25H
TSR2:  JNB DATAIN,TSR3
  DJNZ R0,TSR2
  CLR FLAG1
  SJMP TSR7
TSR3:  SETB FLAG1 ;复位成功
  CLR P1.7   ;???
  MOV R0,#117   ;等待60-240的低脉冲
TSR6:  DJNZ R0,$
TSR7:  SETB DATAIN
  RET
  
GET_TEMPER: SETB DATAIN
  LCALL INIT_1820
  JB FLAG1,TSS2
  NOP
  RET

TSS2:  MOV A,#0CCH
  LCALL WRITE_1820
  MOV A,#44H
  LCALL WRITE_1820
  ACALL DISP1
  LCALL INIT_1820 ;每次通信前都需要初始化???
  MOV A,#0CCH
  LCALL WRITE_1820
  MOV A,#0BEH
  LCALL WRITE_1820
  LCALL READ_1820
  RET
;R2R3只是做循环计数器,累加器A是传递进来的送到DATAIN的数据
WRITE_1820: MOV R2,#8
  CLR C
WR1:  CLR DATAIN
  MOV R3,#6
  DJNZ R3,$
  RRC A
  MOV DATAIN,C
  MOV R3,#23
  DJNZ R3,$
  SETB DATAIN
  NOP
  DJNZ R2,WR1
  SETB DATAIN
  RET
;读取的数据存放在28H29H中,R4=2是采集两次数据,R2=8是每次采集8位,R3做延时参数
READ_1820: MOV R4,#2
  MOV R1,#29H
RE00:  MOV R2,#8
RE01:  CLR C
  SETB DATAIN
  NOP
  NOP
  CLR DATAIN
  NOP
  NOP
  NOP
  SETB DATAIN
  MOV R3,#9
RE10:  DJNZ R3,RE10
  MOV C,DATAIN
  MOV R3,#23
RE20:  DJNZ R3,RE20
  RRC A
  DJNZ R2,RE01
  MOV @R1,A
  DEC R1
  DJNZ R4,RE00
  RET
;温度转换模块,由于DS18B20采集的数据只是一一对应的关系,而且要将小数位,个位,十位,百位分开存储
;以便送入显示。具体的转换算法为;DS18B20采取12位转换模式,精度为0.0625即1/16,所以低四位转换后为小数位
;高四位为符号位,中间八位即为整数位,整数位/100即为百位,剩下的余数/10即为十位,最后的余数即为个位
CVTTMP:  MOV A,TMPH
  ANL A,#80H    ;查看符号位
  JZ TMPC1
  CLR C
  MOV A,TMPL
  CPL A
  ADD A,#1
  MOV TMPL,A
  MOV A,TMPH
  CPL A
  ADDC A,#0
  MOV TMPH,A
  MOV 73H,#0BH
  SJMP TMPC11
TMPC1:  MOV 73H,#0AH
TMPC11:  MOV A,TMPL
  ANL A,#0FH
  MOV DPTR,#TMPTAB
  MOVC A,@A+DPTR
  MOV 70H,A

  MOV A,TMPL
  ANL A,#0F0H
  SWAP A
  MOV TMPL,A
  MOV A,TMPH
  ANL A,#0FH
  SWAP A
  ORL A,TMPL
H2BCD:  MOV B,#100
  DIV AB
  JZ B2BCD1
  MOV 73H,A
B2BCD1:  MOV A,#10
  XCH A,B
  DIV AB
  MOV 72H,A
  MOV 71H,B
TMPC12:  NOP
DISBCD:  MOV A,73H
  ANL A,#0FH
  CJNE A,#1,DISBCD0
  SJMP DISBCD1
DISBCD0: MOV A,72H
  ANL A,#0FH
  JNZ DISBCD1
  MOV A,73H
  MOV 72H,A
  ;MOV 72H,#0AH
  MOV 73H,#0AH
DISBCD1: RET
TMPTAB:  DB 0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9
;显示模块,显示70H71H72H73H中的实际温度及74H75H76H77H中的预置温度
DISP1:  MOV R1,#70H
  MOV R0,#74H
  MOV R5,#0FEH
 ; MOV P0,#00H
PLAY:  
  MOV P2,#00H
   
  MOV A,R5
  MOV P0,A
  MOV A,@R1
  MOV DPTR,#TAB
  MOVC A,@A+DPTR
  MOV P2,A
  ;LCALL DL1MS
  MOV A,@R0
  MOVC A,@A+DPTR
  MOV P1,A
  MOV A,R5
  JB ACC.1,LOOP1
  SETB P2.7 ;设置实际温度显示的小数点
  ;SETB P1.7 ;设置预置温度显示的小数点
LOOP1:  LCALL DL1MS
  INC R1
  INC R0
  MOV A,R5
  JNB ACC.3,ENDOUT  ;百位显示之后结束显示
  RL A
  MOV R5,A
  MOV A,73H
  CJNE A,#1,DD2
  SJMP LEDH
;完成实际温度与预制温度的比较,主要是为了控制加热的发光二极管及蜂鸣器
DD2:  MOV A,72H
  CJNE A,#0AH,DD3
  MOV 72H,#0
DD3:  MOV A,76H
  CJNE A,72H,DDH
  SJMP DDL
DDH:  JNC PLAY1
  SJMP LEDH
DDL:  MOV A,75H
  CJNE A,71H,DDL1
  SJMP LEDH
DDL1:  JNC PLAY1
LEDH:  CLR P3.6
  CLR P3.4
  SJMP PLAY
PLAY1:  SETB P3.6
  SETB P3.4
  SJMP PLAY

ENDOUT:  MOV P0,#0FFH
  MOV P2,#00H
  RET

TAB:  DB 3FH,06H,5BH,4FH,66H     
  DB 6DH,7DH,07H,7FH,6FH,00H,40H
;延时子程序 
DL1MS:  MOV R6,#50
DL1:  MOV R7,#100
  DJNZ R7,$
  DJNZ R6,DL1
  RET
;外部中断,预置温度的设置时通过中断实现的,每按一次键,相应的位数做模为9的加法,实现对温度的设置
ZINT0:  PUSH ACC
  INC 75H
  MOV A,75H
  CJNE A,#10,ZINT01
  MOV 75H,#0
ZINT01:  POP ACC
  RETI

ZINT1:  PUSH ACC
  INC 76H
  MOV A,76H
  CJNE A,#10,ZINT11
  MOV 76H,#0
ZINT11:  POP ACC
  RETI

ZZZ1:  MOV DPTR,#TAB
  MOVC A,@A+DPTR
  MOV P1,A
  RETI
  END

回复评论 (6)

谢谢分享
点赞  2011-5-31 09:08

我也做过一个这个东西,是帮别人做的毕设,用C写的程序,拿出来分享一下!

这个是我的仿真效果图

未命名.jpg

点赞  2011-5-31 09:30

回复 板凳 jishuaihu 的帖子

呵呵,我本来打算再用c实现一遍的,巧的是这也是我帮别人做的毕业设计
点赞  2011-5-31 12:06

回复 沙发 fish001 的帖子

不客气,多学习交流,呵呵
点赞  2011-5-31 12:09
好东西
点赞  2011-7-26 13:32
顶一下,不错不错....
点赞  2011-7-26 21:07
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复