DS18B20温度控制lcd1602显示程序

发布者:梦中的额吉最新更新时间:2018-01-08 来源: eefocus关键字:DS18B20  温度控制  lcd1602显示 手机看文章 扫描二维码
随时随地手机看文章

* ;* DS18B20的管脚定义:1、GND   2、DQ   3、VCC                              * 
;温度显示用四位,当温度>=100度时,第四位才显示。                                * 
;检测 DS18B20 状态:                                                            * 
;DS18B20正常显示:DS18B20  OK  TEMP:  25.8℃ ← 显示实际温                      * 
;DS18B20不正常显示:DS18B20  ERROR  TEMP: ----℃  ← 显示----               * 
;一、查看温度报警值:                                                           * 
;K1 → 进入查看温度报警值状态。                                                 * 
;LCD 1602 显示: LOOK ALERT CODE  TH:028℃ TL:18℃ TH:028  高位报警值           * 
;TL:18   低位报警值   K3 → 退出查看温度报警值状态。                            * 
;二、设定温度报警值:                                                           * 
;K2 → 进入设定温度报警值状态?                                                  * 
;LCD 1602 显示:RESET ALERT CODE  TH:028℃ TL:18℃                              * 
;K1 : 设定值加(UP)、减(DOWN)方式选择键(默认为减少)K2 : TH值设定键             * 
;K3 : TL值设定键 K4 : 确定键 (退出设定状态)                                   *  
; K2 或 K3 以减(DOWN)方式设定,当设定数值减到“0”时自动转换为加(UP)方          * 
; K2 或 K3 以加(UP)方式设定,当设定数值 TH=120、TL=99 时,设定数值均变为“0”   * 
;K4 → 确定并退出设定温度报警值状态。                                           * 
;将设定的温度报警值自动存入 DS18B20 的 EEROM 中,可永久保存。                   * 
;每次开机时自动从 DS18B20 的 EEROM 读出温度报警值。                             * 
;三、报警状态的显示:                                                           * 
;1、当实际温度大于 TH 的设定值时,                                              * 
;  LCD1602 显示: DS18B20  OK TEMP:  88.8℃ > H 关闭继电器,蜂鸣器响,表示超温  * 
;2、当实际温度小于 TL 的设定值时,LCD1602 显示:                                * 
;   DS18B20  OK TEMP:  18.8℃ < L蜂鸣器响,表示加热部分出现故障。               * 
;3、当实际温度小于 TH 的设定值时,继电器吸合,开始加热。                        * 
;  加热标记为“!”                                                              * 
;*   资源: 继电器p1.0 喇叭p3.7  18b20 p3.3    按键k1-k4 p1.4-p1.7   1602液晶   * 

          TEMP_ZH   DATA  24H     ;实时温度值存放单元 
          TEMPL     DATA  25H     ; 
          TEMPH     DATA  26H     ; 
          TEMP_TH   DATA  27H     ;高温报警值存放单元 
          TEMP_TL   DATA  28H     ;低温报警值存放单元 
          TEMPHC    DATA  29H     ; 
          TEMPLC    DATA  2AH 

          K1     EQU  P1.4 
          K2     EQU  P1.5 
          K3     EQU  P1.6 
          K4     EQU  P1.7 

          BEEP   EQU  P3.7 
          RELAY  EQU  P1.0 
          LCD_X     EQU  2FH      ;LCD 地址变量 
          LCD_RS    EQU  P2.0 
          LCD_RW    EQU  P2.1 
          LCD_EN    EQU  P2.2 
          flag1     equ  20H.0    ;DS18B20是否存在标记 
          KEY_UD    EQU  20H.1    ;设定 KEY 的UP与DOWN 标记 
          date_line equ p3.3 
;===================================================== 
           ORG  0000H 
           JMP  MAIN 

MAIN:     MOV  SP,#60H 
          MOV  A,#00H 
          MOV  R0,#20H       ;将 20H-2FH 单元清零 
          MOV  R1,#10H 
CLEAR:    MOV  @R0,A 
          INC  R0 
          DJNZ  R1,CLEAR 

          CALL  SET_LCD 
          CALL  RE_18B20 

start:    CALL  RESET          ;18B20复位子程序 
          JNB   FLAG1,START1   ;DS1820不存在 
          CALL  MENU_OK 
          CALL  READ_E2 
          CALL  TEMP_BJ        ;显示温度标记 
          JMP   START2 
START1:   CALL  MENU_ERROR 
          CALL  TEMP_BJ        ;显示温度标记 
          JMP  $ 

START2: 
          CALL  RESET 
          JNB  FLAG1,START1    ;DS1820不存在 
          MOV   A,#0CCH        ; 跳过ROM匹配 
          CALL  WRITE 
          MOV   A,#44H         ; 发出温度转换命令 
          CALL  WRITE 
          CALL  RESET 
          MOV   A,#0CCH        ; 跳过ROM匹配 
          CALL  WRITE 
          MOV   A,#0BEH        ; 发出读温度命令 
          CALL  WRITE 
          CALL  READ 
          call CONVTEMP 
          Call DISPBCD 
          CALL CONV 
          CALL TEMP_COMP 
          CALL  PROC_KEY       ; 键扫描 

      SJMP    START2 
;----------------------------------------------------- 
PROC_KEY: 
     JB  K1,PROC_K1          ; 按键K1处理 
         CALL  BEEP_BL 
         JNB  K1,$ 
         MOV  DPTR,#M_ALAX1 
         MOV  A,#1 
         CALL  LCD_PRINT 
         CALL  LOOK_ALARM 
         JB  K3,$ 
         CALL  BEEP_BL 
         JMP  PROC_K2 
PROC_K1:              ; 按键K2处理 
         JB  K2,PROC_END 
         CALL  BEEP_BL 
         JNB  K2,$ 
         MOV   DPTR,#RESET_A1 
         MOV   A,#1 
         CALL  LCD_PRINT 
         CALL  SET_ALARM 
         CALL  RE_18B20           ;将设定的TH,TL值写入DS18B20内 
         CALL  WRITE_E2 
PROC_K2: 
         CALL  MENU_OK 
         CALL  TEMP_BJ 
PROC_END: 
         RET 
;============================================ 
;设定报警值 TH、TL 
;============================================ 
SET_ALARM: 
         ;CALL  RESET_ALARM 
         CALL  LOOK_ALARM 
AS0: 
         JB   K1,AS00 
         CALL  BEEP_BL 
         JNB  K1,$ 
         CPL  20H.1            ;UP/DOWN 标记 
AS00:    JB  20H.1,ASZ01       ;20H.1=1,UP 
         JMP  ASJ01            ;20H.1=0,DOWN 

ASZ01:   JB  K2,ASZ02          ;TH值调整(增加) 
         CALL  BEEP_BL 
         INC  TEMP_TH 
         MOV  A,TEMP_TH 
         CJNE  A,#120,ASZ011 
         MOV  TEMP_TH,#0 
ASZ011:  CALL  LOOK_ALARM 
         MOV  R5,#10 
         CALL  DELAY 
         JMP  ASZ01 

ASZ02:   JB  K3,ASZ03          ;TL值调整(增加) 
         CALL  BEEP_BL 
         INC  TEMP_TL 
         MOV  A,TEMP_TL 
         CJNE  A,#99,ASZ021 
         MOV  TEMP_TL,#00H 
ASZ021:  CALL  LOOK_ALARM    ; 
         MOV  R5,#10 
         CALL  DELAY 
         JMP  ASZ02 
ASZ03:   JB  K4,AS0          ;确定调整 OK 
         CALL  BEEP_BL 
         JNB  K4,$ 
         RET 

ASJ01: 
         JB  K2,ASJ02          ;TH值调整 (减少) 
         CALL  BEEP_BL 
         DEC   TEMP_TH 
         MOV  A,TEMP_TH 
         CJNE  A,#0FFH,ASJ011 
         JMP  ASJ022 
ASJ011:  CALL  LOOK_ALARM 
         MOV  R5,#10 
         CALL  DELAY 
         JMP  AS0 

ASJ02:   JB  K3,ASJ03         ;TL值调整(减少) 
         CALL  BEEP_BL 
         DEC  TEMP_TL 
         MOV  A,TEMP_TL 
         CJNE  A,#0FFH,ASJ021 
         JMP  ASJ022 
ASJ021:  CALL  LOOK_ALARM    ; 
         MOV  R5,#10 
         CALL  DELAY 
         JMP  AS0 
ASJ022:  CPL  20H.1 
         JMP  ASZ01 
ASJ03:   JMP  ASZ03 
         RET 


RESET_ALARM: 
          MOV  DPTR,#RESET_A1  ;指针指到显示信息区 
          MOV  A,#1            ;显示在第一行 
          CALL  LCD_PRINT 
          RET 
RESET_A1: 
     DB  "RESET ALERT CODE" 
;==================================================== 
;实际温度值与标记温度值比较子程序 
;==================================================== 
TEMP_COMP: 
          MOV  A,TEMP_TH        
          SUBB  A,TEMP_ZH       ;减数>被减数,则 
          JC  CHULI1            ;借位标志位C=1,转 
          MOV  A,TEMP_ZH 
          SUBB  A,TEMP_TL       ;减数>被减数,则 
          JC  CHULI2            ;借位标志位C=1,转 
          MOV  DPTR,#BJ5 
          CALL  TEMP_BJ3 
          CLR   RELAY           ;继电器吸合 
          RET 
 CHULI1: 
          MOV  DPTR,#BJ3 
          CALL  TEMP_BJ3 
          SETB  RELAY           ;继电器关闭 
          CALL  BEEP_BL 
          RET 
 CHULI2: 
          MOV  DPTR,#BJ4 
          CALL  TEMP_BJ3 
          CALL  BEEP_BL 
          RET 
;----------------------------------------- 
TEMP_BJ3: 
          MOV  A,#0CEH 
          CALL WCOM 
          MOV  R1,#0 
          MOV  R0,#2 

BBJJ3:    MOV  A,R1 
          MOVC A,@A+DPTR 
          CALL  WDATA 
          INC R1 
          DJNZ  R0,BBJJ3 
          RET 
BJ3: 
      DB  ">H" 
BJ4: 
      DB  "BJ5: 
      DB  " !" 
;================================================== 
;显示温度标记子程序 
;================================================== 
TEMP_BJ: 
          MOV  A,#0CBH 
          CALL WCOM 
          MOV  DPTR,#BJ1  ;指针指到显示消息 
          MOV  R1,#0 
          MOV  R0,#2 

BBJJ1:    MOV  A,R1 
          MOVC A,@A+DPTR 
          CALL  WDATA 
          INC R1 
          DJNZ  R0,BBJJ1 
          RET 
BJ1: 
      DB  00H,"C" 
;================================================= 
MENU_OK: 

          MOV  DPTR,#M_OK1  ;指针指到显示消息 
          MOV  A,#1          ;显示在第一行 
          CALL  LCD_PRINT 
          MOV  DPTR,#M_OK2  ;指针指到显示消息 
          MOV  A,#2          ;显示在第一行 
          CALL  LCD_PRINT 

          RET 
M_OK1: 
    DB   "   DS18B20 OK   ",0 
M_OK2: 
    DB   " TEMP:          ",0 
;----------------------------------------------- 
MENU_ERROR: 
          MOV  DPTR,#M_ERROR1  ;指针指到显示消息1 
          MOV  A,#1          ;显示在第一行 
          CALL  LCD_PRINT 
          MOV  DPTR,#M_ERROR2  ;指针指到显示消息1 
          MOV  A,#2          ;显示在第一行 
          CALL  LCD_PRINT 
          RET 
M_ERROR1: 
    DB   " DS18B20 ERROR  ",0 
M_ERROR2: 
    DB   " TEMP: ----     ",0 
;==================================================== 
reset:  setb date_line 
        nop 
        clr date_line 
        MOV r0,#6bh         ;主机发出延时复位低脉冲 
        MOV r1,#04h 
tsr1:   djnz r0,$ 
        MOV r0,#6bh 
        djnz r1,tsr1 
        setb date_line        ;然后拉高数据线 
        nop 
        nop 
        nop 
        MOV r0,#32h 
tsr2:   jnb date_line,tsr3   ;等待DS18B20回应 
        djnz r0,tsr2 
        jmp tsr4             ; 延时 
tsr3:   setb flag1           ; 置标志位,表示DS1820存在 
        jmp tsr5 
tsr4:   clr flag1            ; 清标志位,表示DS1820不存在 
        jmp tsr7 
tsr5:   MOV r0,#06bh 
tsr6:   djnz r0,$            ; 时序要求延时一段时间 
tsr7:   setb date_line 
        ret 
;======================================================= 
RE_18B20: 
        JB  FLAG1,RE_18B20A 
        RET 
RE_18B20A: 
        CALL  RESET 
        MOV  A,#0CCH       ;跳过ROM匹配 
        LCALL  WRITE 
        MOV  A,#4EH        ;写暂存寄存器 
        LCALL  WRITE 
        MOV  A,TEMP_TH     ;TH(报警上限) 
        LCALL  WRITE 
        MOV  A,TEMP_TL     ;TL(报警下限) 
        LCALL  WRITE 
        MOV  A,#7FH        ;12位精确度 
        LCALL  WRITE 
        RET 
;------------------------------------------------------------ 
WRITE_E2: 
        CALL  RESET 
        MOV  A,#0CCH        ;跳过ROM匹配 
        LCALL  WRITE 
        MOV  A,#48H         ;把暂存器里的温度报警值拷贝到EEROM 
        LCALL  WRITE 
        RET 
;-------------------------------------------------------------- 
READ_E2: 
        CALL  RESET 
        MOV  A,#0CCH        ;跳过ROM匹配 
        LCALL  WRITE 
        MOV  A,#0B8H        ;把EEROM里的温度报警值拷贝回暂存器 
        CALL  WRITE 
        RET 
;-------------------------------------------------------------- 
;将自定义字符写入LCD1602的CGRAM中 
;-------------------------------------------------------------- 
STORE_DATA: 
        MOV  A,#40H 
        CALL  WCOM 
        MOV  R2,#08H 
        MOV  DPTR,#D_DATA 
        MOV  R3,#00H 
S_DATA: 
        MOV  A,R3 
        MOVC  A,@A+DPTR 
        CALL  WDATA      ;写入数据 
        INC  R3 
        DJNZ  R2,S_DATA 
        RET 

D_DATA: 
    DB  0CH,12H,12H,0CH,00H,00H,00H,00H 
;============================================================== 
write:  MOV r2,#8            ;一共8位数据 
        CLR  C 
wr1: 
        clr date_line        ;开始写入DS18B20总线要处于复位(低)状态 
        MOV r3,#07 
        djnz r3,$            ;总线复位保持16微妙以上 
        rrc a                ;把一个字节DATA 分成8个BIT环移给C 
        MOV date_line,c      ;写入一个BIT 
        MOV r3,#3CH 
        djnz r3,$            ;等待100微妙 
        setb date_line       ;重新释放总线 
        nop 
        djnz r2,wr1          ;写入下一个BIT 
        setb date_line 
        ret 
;-------------------------------------------------------------------- 
read:    MOV r4,#4          ; 将温度低位、高位、TH、TL从DS18B20中读出 
         MOV r1,#TEMPL        ; 存入25H、26H、27H、28H 
re00:    MOV r2,#8 
re01:    clr cy 
         setb date_line 
         nop 
         nop 
         clr date_line        ;读前总线保持为低 
         nop 
         nop 
         nop 
         setb date_line       ;开始读总线释放 
         MOV r3,#09           ;延时18微妙 
         djnz r3,$ 
         MOV c,date_line      ;从DS18B20总线读得一个BIT 
         MOV r3,#3CH 
         djnz r3,$            ;等待100微妙 
         rrc a                ;把读得的位值环移给A 
         djnz r2,re01         ;读下一个BIT 
         MOV @r1,a 
         inc r1 
         djnz r4,re00 
         ret 


;***************************************************** 
;  处理温度 BCD 码子程序 
;**************************************************** 
CONVTEMP:      MOV  A,TEMPH       ;判温度是否零下 
               ANL  A,#80H 
               JZ  TEMPC1         ;温度零上转 
               CLR  C 
               MOV  A,TEMPL       ;二进制数求补(双字节) 
               CPL  A             ;取反加1 
               ADD  A,#01H 
               MOV  TEMPL,A 
               MOV  A,TEMPH 
               CPL  A 
               ADDC  A,#00H 
               MOV  TEMPH,A 
               SJMP  TEMPC11 

TEMPC1:        MOV  TEMPHC,#0AH     ;+ 
TEMPC11:       MOV  A,TEMPHC 
               SWAP  A 
               MOV  TEMPHC,A 
               MOV  A,TEMPL 
               ANL  A,#0FH              ;乘0.0625 
               MOV  DPTR,#TEMPDOTTAB 
               MOVC  A,@A+DPTR 
               MOV  TEMPLC,A            ;TEMPLC LOW=小数部分 BCD 

               MOV  A,TEMPL             ;整数部分 
               ANL  A,#0F0H             ;取出高四位 
               SWAP  A 
               MOV  TEMPL,A 
               MOV  A,TEMPH             ;取出低四位 
               ANL  A,#0FH 
               SWAP  A 
               ORL  A,TEMPL             ;重新组合 
               MOV  TEMP_ZH,A 
               LCALL  HEX2BCD1 
               MOV  TEMPL,A 
               ANL  A,#0F0H 
               SWAP  A 
               ORL  A,TEMPHC            ;TEMPHC LOW = 十位数 BCD 
               MOV  TEMPHC,A 
               MOV  A,TEMPL 
               ANL  A,#0FH 
               SWAP  A                  ;TEMPLC HI = 个位数 BCD 
               ORL  A,TEMPLC 
               MOV  TEMPLC,A 
               MOV  A,R4 
               JZ  TEMPC12 
               ANL  A,#0FH 
               SWAP  A 
               MOV  R4,A 
               MOV  A,TEMPHC            ;TEMPHC HI = 百位数 BCD 
               ANL  A,#0FH 
               ORL  A,R4 
               MOV  TEMPHC,A 
TEMPC12:       RET 
;--------------------------------------------------------------- 
HEX2BCD1: 
              MOV  B,#064H          ;十六进制-> BCD 
              DIV  AB               ;B= A % 100 
              MOV  R4,A             ;R7 = 百位数 
              MOV  A,#0AH 
              XCH  A,B 
              DIV  AB               ;B = A % B 
              SWAP  A 
              ORL  A,B 
              RET 
;------------------------------------------------------------- 
;  小数部分码表 
;------------------------------------------------------------- 
TEMPDOTTAB: 
         DB   00H,00H,01H,01H,02H,03H,03H,04H 
         DB   05H,05H,06H,06H,07H,08H,08H,09H 
;===================================================== 
LOOK_ALARM: 

          MOV  DPTR,#M_ALAX2   ;指针指到显示信息区 
          MOV  A,#2            ;显示在第二行 
          CALL  LCD_PRINT 

          MOV  A,#0C6H 
          CALL  TEMP_BJ1 
          MOV  A,TEMP_TH       ;加载TH数据 
          MOV  LCD_X,#3        ;设置位置 
          CALL  SHOW_DIG2H     ;显示数据 

          MOV  A,#0CEH 
          CALL  TEMP_BJ1 
          MOV  A,TEMP_TL       ;加载TL数据 
          MOV  LCD_X,#12       ;设置位置 
          CALL  SHOW_DIG2L     ;显示数据 
          RET 
;-------------------------------------------- 
M_ALAX1: 
     DB   " LOOK ALERT CODE",0 
M_ALAX2: 
     DB   "TH:      TL:    ",0 
;-------------------------------------------- 
TEMP_BJ1: 
          CALL WCOM 
          MOV  DPTR,#BJ2      ;指针指到显示信息区 
          MOV  R1,#0 
          MOV  R0,#2 

BBJJ2:    MOV  A,R1 
          MOVC A,@A+DPTR 
          CALL  WDATA 
          INC R1 
          DJNZ  R0,BBJJ2 
          RET 
BJ2: 
      DB  00H,"C" 

;--------------------------------------------------- 
SHOW_DIG2H:                ;在 LCD 的第二行显示数字 
          MOV  B,#100 
          DIV  AB 
          ADD  A,#30H 
          PUSH  B 
          MOV  B,LCD_X 
          CALL  LCDP2 
          POP  B 
          MOV  A,#0AH 
          XCH  A,B 
          DIV  AB 
          ADD  A,#30H 
          INC  LCD_X 
          PUSH  B 
          MOV  B,LCD_X 
          CALL  LCDP2 
          POP  B 
          INC  LCD_X 
          MOV  A,B 
          MOV  B,LCD_X 
          ADD  A,#30H 
          CALL  LCDP2 
          RET 

SHOW_DIG2L:                ;在 LCD 的第二行显示数字 
          MOV  B,#100 
          DIV  AB 
          MOV  A,#0AH 
          XCH  A,B 
          DIV  AB 
          ADD  A,#30H 
          PUSH  B 
          MOV  B,LCD_X 
          CALL  LCDP2 
          POP  B 
          INC  LCD_X 
          MOV  A,B 
          MOV  B,LCD_X 
          ADD  A,#30H 
          CALL  LCDP2 
          RET 
;------------------------------------------------------------- 
;显示区 BCD 码温度值刷新子程序 
;------------------------------------------------------------- 
DISPBCD: 
              MOV  A,TEMPLC 
              ANL  A,#0FH 
              MOV  70H,A                 ;小数位 
              MOV  A,TEMPLC 
              SWAP  A 
              ANL  A,#0FH 
              MOV  71H,A                 ;个位 
              MOV  A,TEMPHC 
              ANL  A,#0FH 
              MOV  72H,A                 ;十位 
              MOV  A,TEMPHC 
              SWAP  A 
              ANL  A,#0FH 
              MOV  73H,A                 ;百位 
              MOV  A,TEMPHC 
              ANL  A,#0F0H 
              CJNE  A,#010H,DISPBCD0 
              SJMP  DISPBCD2 

DISPBCD0:     MOV  A,TEMPHC 
              ANL  A,#0FH 
              JNZ  DISPBCD2               ;十位数是0 
              MOV  A,TEMPHC 
              SWAP  A 
              ANL  A,#0FH 
              MOV  73H,#0AH               ;符号位不显示 
              MOV  72H,A                  ;十位数显示符号 
DISPBCD2:     RET 

;========================================================== 
; LCD 1602 显示子程序 
;========================================================== 
CONV: 
          MOV  A,73H         ;加载百位数据 
          MOV  LCD_X,#6      ;设置位置 
          CJNE A,#1,CONV1 
          JMP  CONV2 
CONV1:    MOV  A,#" " 
          MOV  B,LCD_X 
          CALL  LCDP2 
          JMP  CONV3 
CONV2:    CALL  SHOW_DIG2    ;显示数据 
CONV3:    INC  LCD_X             ; 
          MOV  a,72h         ;十位 
          CALL  SHOW_DIG2 
          inc  LCD_X 
          MOV  a,71h         ;个位 
          CALL  SHOW_DIG2 
          inc  LCD_X 
          MOV  A,#’.’ 
          MOV  B,LCD_X 
          CALL  LCDP2 
          MOV  A,70h         ;加载小数点位 
          INC  LCD_X         ;设置位置 
          CALL  SHOW_DIG2    ;显示数据 
          RET 
;------------------------------------------------------- 
SHOW_DIG2:                 ;在 LCD 的第二行显示数字 
          ADD  A,#30H 
          MOV  B,LCD_X 
          CALL  LCDP2 
          RET 
;--------------------------------------------------------- 
LCDP2:                    ;在LCD的第二行显示字符 
         PUSH  ACC        ; 
         MOV  A,B         ;设置显示地址 
         ADD  A,#0C0H     ;设置LCD的第二行地址 
         CALL  WCOM       ;写入命令 
         POP  ACC         ;由堆栈取出A 
         CALL  WDATA      ;写入数据 
         RET 
;--------------------------------------------------------- 


SET_LCD:                     ;对 LCD 做初始化设置及测试 
          CLR  LCD_EN 
          CALL  INIT_LCD     ;初始化 LCD 
          CALL  STORE_DATA   ;将自定义字符存入LCD的CGRAM 
          RET 
INIT_LCD:                  ;8位I/O控制 LCD 接口初始化 
          MOV  A,#38H        ;双列显示,字形5*7点阵 
          CALL  WCOM 
          call  delay1 
          MOV  A,#38H 
          CALL  WCOM 
          call  delay1 

          MOV  A,#38H 
          CALL  WCOM 
          call  delay1 
          MOV  A,#0CH        ;开显示,显示光标,光标不闪烁 
          CALL  WCOM 
          call  delay1 
          MOV  A,#01H        ;清除 LCD 显示屏 
          CALL  WCOM 
          call  delay1 
          RET 
;================================================== 
CLR_LINE1:                   ;清除LCD的第一行字符 
          MOV  A,#80H        ;设置 LCD 的第一行地址 
          CALL  WCOM         ; 
          MOV  R0,#24        ;设置计数值 
    C1:   MOV  A,#’ ’        ;载入空格符至LCD 
          CALL  WDATA        ;输出字符至LCD 
          DJNZ  R0,C1        ;计数结束 
          RET 
;================================================== 
LCD_PRINT:       ;在LCD的第一行或第二行显示字符 

          CJNE  A,#1,LINE2  ;判断是否为第一行 
  LINE1:  MOV  A,#80H       ;设置 LCD 的第一行地址 
          CALL  WCOM        ;写入命令 
          CALL  CLR_LINE    ;清除该行字符数据 
          MOV  A,#80H       ;设置 LCD 的第一行地址 
          CALL  WCOM        ;写入命令 
          JMP  FILL 

  LINE2:  MOV  A,#0C0H      ;设置 LCD 的第二行地址 
          CALL  WCOM        ;写入命令 
          CALL  CLR_LINE    ;清除该行字符数据 
          MOV  A,#0C0H      ;设置 LCD 的第二行地址 
          CALL  WCOM 
  FILL:   CLR  A            ;填入字符 
          MOVC  A,@A+DPTR   ;由消息区取出字符 
          CJNE  A,#0,LC1    ;判断是否为结束码 
          RET 
  LC1:    CALL  WDATA       ;写入数据 
          INC  DPTR         ;指针加1 
          JMP  FILL         ;继续填入字符 
          RET 
;========================================= 
CLR_LINE:                  ;清除该行 LCD 的字符 
          MOV  R0,#24 
   CL1:   MOV  A,#’ ’ 
          CALL  WDATA 
          DJNZ  R0,CL1 
          RET 
   DE:    MOV  R7,#250 
          DJNZ  R7,$ 
          RET 
;============================================ 
WCOM:                     ;以8位控制方式将命令写至LCD 
          MOV  P0,A       ;写入命令 
          CLR LCD_RS      ;RS=L,RW=L,D0-D7=指令码,E=高脉冲 
          CLR LCD_RW 
          SETB LCD_EN 
          ACALL DELAY1         
          CLR LCD_EN 
          RET 
;============================================= 
WDATA:                    ;以8位控制方式将数据写至LCD 
          MOV  P0,A       ;写入数据 
          SETB  LCD_RS         
          CLR  LCD_RW 
          SETB  LCD_EN         
          CALL  DE 
          CLR  LCD_EN 
          CALL  DE 
          RET 
;============================================= 
;PRINT A CHAR ON LINE 1 
;A=ASC DATA, B=LINE X POS 
;============================================== 
LCDP1:                    ;在LCD的第一行显示字符 
         PUSH  ACC        ; 
         MOV  A,B         ;设置显示地址 
         ADD  A,#80H      ;设置LCD的第一行地址 
         CALL  WCOM       ;写入命令 
         POP  ACC         ;由堆栈取出A 
         CALL  WDATA      ;写入数据 
         RET 

;============================================== 
BEEP_BL: 
         MOV  R6,#100 
 BL2:    CALL  DEX1 
         CPL  BEEP 
         DJNZ  R6,BL2 
         MOV  R5,#10 
         CALL  DELAY 
         RET 
 DEX1:   MOV  R7,#180 
 DE2:    NOP 
         DJNZ  R7,DE2 
         RET 
DELAY:                    ;(R5)*延时10MS 
         MOV  R6,#50 
 DL1:    MOV  R7,#100 
         DJNZ  R7,$ 
         DJNZ  R6,DL1 
         DJNZ  R5,DELAY 
         RET 

DELAY1:                    ;延时5MS 
         MOV  R6,#25 
 DL2:    MOV  R7,#100 
         DJNZ  R7,$ 
         DJNZ  R6,DL2 
         RET 
;================================================ 
         END 

关键字:DS18B20  温度控制  lcd1602显示 引用地址:DS18B20温度控制lcd1602显示程序

上一篇:时钟芯片DS1302 8位数码管显示
下一篇:基于AT89S52 和K9F6408U0A 的语音数字系统设计

推荐阅读最新更新时间:2024-03-16 15:51

单片机试验两点间温度控制
1. 实验任务 用可调电阻调节电压值作为模拟温度的输入量,当温度低于30℃时,发出长嘀报警声和光报警,当温度高于60℃时,发出短嘀报警声和光报警。测量的温度范围在0-99℃。 2.电路原理图 图4.29.1 3. 系统板上硬件连线 a) 把“单片机系统”区域中的P1.0-P1.7与“动态数码显示”区域中的ABCDEFGH端口用8芯排线连接。 b) 把“单片机系统”区域中的P2.0-P2.7与“动态数码显示”区域中的S1S2S3S4S5S6S7S8端口用8芯排线连接。 c) 把“单片机系统”区域中的P3.0与“模数转换模块”区域中的ST端子用导线相连接。 d) 把“单片机系统”区域中的
[单片机]
单片机试验两点间<font color='red'>温度控制</font>
简单的DS18B20温度测试
DS18B20是目前比较常用的一种温度测试芯片。其具有微型化、低功耗、高性能、抗干扰强等优点。同时可以直接将温度转化为数字信号提供给处理器。详细的资料请参见芯片的资料说明。 本实验是一个简单的温度检测实验。单片机将检测到的温度用数码管显示。程序如下: ================================================================================================= #include reg52.h #define uchar unsigned char #define uint unsigned int int a,b,c,tem
[单片机]
【51单片机快速入门指南】6.3.1:使用1-WIRE搜索算法搜索单总线上所有DS18B20的ID
普中51-单核-A2 STC89C52 Keil uVision V5.29.0.0 PK51 Prof.Developers Kit Version:9.60.0.0 移植自1-WIRE搜索算法 串口部分见【51单片机快速入门指南】3.3:USART 串口通信 DS18B20驱动程序见【51单片机快速入门指南】6.3:DS18B20 单总线数字温度计的多路读取 源码 OWSearch.c #include DS18B20.h #include stdio.h // TMEX API TEST BUILD DECLARATIONS // long session_handle; // END
[单片机]
【51单片机快速入门指南】6.3.1:使用1-WIRE搜索算法搜索单总线上所有<font color='red'>DS18B20</font>的ID
51单片机多路测温报警系统(AT89C51、多个DS18B20LCD1602
一、简介 此系统主要由AT89C51、多个DS18B20温度模块和LCD1602组成。 大致的原理是多个DS18B20按顺序采集温度到的数据传送给AT89C51的P2.7,最后通过LCD1602显示当前的实时温度,按键可以设置上下限温度,根据温度判断是否需要报警。 二、运行效果图 模拟仿真运行 三、部分代码 /*想要更多项目私wo!!!*/ #include reg52.h #include intrins.h unsigned int iTempDataH; unsigned int SetTemp = 30; int SetTemp1 = 1; int num = 0; //ÅжÏæָÁî void
[单片机]
51单片机多路测温报警系统(AT89C51、多个<font color='red'>DS18B20</font>、<font color='red'>LCD1602</font>)
汽车空调温度控制系统设计
    前言:     本文是从物联网的角度出发提出一种以GSM 无线网络为基础, 通过温度传感器, 将用户手机、汽车空调组合成一个小型物联网的应用设计。现代汽车中的空调一般是利用手工进行控制的,空调只有等到司机进入驾驶室才能开启或关闭,这就使得在炎热的夏天或寒冷的冬天, 刚进入车内时由于空调没有开启,人会感觉到异常的燥热或寒冷,因此设计和制造出能监控车内温度并根据监测到的温度情况来进行提前远程控制开启车内空调系统的设备便提到人们日常生活的议事日程上来,本设计就是为满足这一要求而提出来的。     1 系统的组成和工作原理     系统是由两大部分组成, 一部分是由STC89C52RC单片机为中心的温度采集
[单片机]
完美实现STM32单总线挂多个DS18B20
一般常见的STM32的关于DS18B20的例程都是检测一个传感器,代码一般都是跳过ROM检测,直接获取温度值。这种写法并不适用于单总线上挂载多个DS18B20的情况,Sandeepin的这个代码就是针对这种情况完善的单总线挂多个DS18B20检测,实现获取每个DS18B20的ID和温度。 主要的DS18B20时序代码没变,增加了搜索ROM函数,获取温度时先匹配ID。 核心代码如下: DS18B20.c文件代码: #include DS18B20.h #include Delay.h #include stdio.h // printf用 #define DS18B20_GPIO_NUM
[单片机]
完美实现STM32单总线挂多个<font color='red'>DS18B20</font>
单片机DS18B20温度计C语言程序
//功能:有负温度显示,高精度格度可以显示-9.99C到99.99C // 带有报警装置 // 当温度为正时,显示十位 个位 十分位 百分位 // 当温度为负时,显示负号 十位 个位 十分位 // 缺点是上下限报警数值不能改变 //注明:数码管是CC 共阴型 //读取温度 sbit DQ = P3^0; //定义通信端口 bit fg=1; //晶振12MHz void delay_18B20(unsigned int i) { while(i--); } //初始化函数 bit Init_DS18B20(void) { unsigned char x=0; D
[单片机]
热电阻在烟叶初烤炕房温度控制中的应用
一、前言 烟叶初烤过程中,烤房内温度的准确测量和有效控制是烘烤的核心和烟叶质量的根本保证。目前,广大烟区已广泛推广烟叶初烤的“三段式烘烤工艺”,并且大多数炕房已加装热风循环装置,而使用的温度测量器具却是酒精的或煤油的玻璃管温度计(烟区称之为火表),控制方法采用人工启闭回风门(用于排湿,控制湿球温度)、火门或鼓风机(控制火炉火势,间接控制干球温度)。测量不准、使用不便的温度计,被动的控制方法等成为制约烟叶烘烤质量提高的瓶径问题。以温度控制工艺为例,用热电阻Cu50作为传感器,以单片机为核心的控制仪解决了这一问题,基本实现烤烟过程中温度的自动控制。 二、温度控制要求 1、技术要求:有效测控范围:20℃至80℃;温度测量精度:±0
[传感器]
热电阻在烟叶初烤炕房<font color='red'>温度控制</font>中的应用
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved