51/AVR单片机技术驿站!  <在线翻译>     便利工具    特色网址   无弹窗、无插件的绿色站点...  英才招聘   学历查询  喜欢>>收藏我站 

当前位置:首页 > 单片机源码 > 详细内容
1602_LCDAT89S52_18B20实现的温度报警时间可调显示程序
发布时间:2009/5/19  阅读次数:6507  字体大小: 【】 【】【


MOV P1,#11000000B;先显示----              ----    不能显示空格的,,否则之后显示数据时又要重新清屏,所以分开两次写吧
LCALL ENABLE
MOV DPTR,#STRII_1
MOV R1,#0
MOV R0,#2
LCALL DISPLAY
/***************/
MOV P1,#11000010B;再由第二行第四列开始显示STOPWATCH 的时,占两位后是:号
MOV DPTR,#LED_DATA;这方法可一位一位的显示
MOV R1,WATCH_H_H//已经是压缩型BCD码了,,但还不是ASCII码
MOV R0,#1
LCALL DISPLAY


MOV DPTR,#LED_DATA
MOV R1,WATCH_H_L //已经是压缩型BCD码了,,但还不是ASCII码
MOV R0,#1
LCALL DISPLAY

MOV DPTR,#MAO
MOV R1,#0
MOV R0,#1
LCALL DISPLAY

MOV DPTR,#LED_DATA
MOV R1,WATCH_M_H //已经是压缩型BCD码了,,但还不是ASCII码
MOV R0,#1
LCALL DISPLAY

MOV DPTR,#LED_DATA
MOV R1,WATCH_M_L //已经是压缩型BCD码了,,但还不是ASCII码
MOV R0,#1
LCALL DISPLAY

MOV DPTR,#MAO
MOV R1,#0
MOV R0,#1
LCALL DISPLAY

MOV DPTR,#LED_DATA
MOV R1,WATCH_S_H //已经是压缩型BCD码了,,但还不是ASCII码
MOV R0,#1
LCALL DISPLAY

MOV DPTR,#LED_DATA
MOV R1,WATCH_S_L //已经是压缩型BCD码了,,但还不是ASCII码
MOV R0,#1
LCALL DISPLAY

MOV DPTR,#MAO
MOV R1,#0
MOV R0,#1
LCALL DISPLAY

MOV DPTR,#LED_DATA
MOV R1,WATCH_MS_H //已经是压缩型BCD码了,,但还不是ASCII码
MOV R0,#1
LCALL DISPLAY

MOV DPTR,#LED_DATA
MOV R1,WATCH_MS_L //已经是压缩型BCD码了,,但还不是ASCII码
MOV R0,#1
LCALL DISPLAY



MOV P1,#11001101B;先显示----              ----    不能显示空格的,,否则之后显示数据时又要重新清屏,所以分开两次写吧
LCALL ENABLE
MOV DPTR,#STRII_1
MOV R1,#0
MOV R0,#3
LCALL DISPLAY
CLR TR2
LJMP STOPWATCH_CONTROL



;---------选择加 或    减     两个按键
KEY_SELECT:
JNB KEY_SET,K_SET;第二次按下P0.3则等它放开后使01H取反,,,表示对低限设置
JNB KEY_UP,K_UP
JNB KEY_DOWN,K_DOWN
AJMP KEY_SELECT
DELAY:MOV R3,#2
D1:MOV R4,#125
D2:MOV R5,#248
DJNZ R5,$
DJNZ R4,D2
DJNZ R3,D1
DJNZ R2,DELAY
RET


K_SET:
LCALL DELAY_2MS
LCALL delay_2ms
LCALL delay_2ms
JB KEY_SET,KEY_SELECT


MOV R5,#250
KSET_LOOP:
JB KEY_SET,KEY_CPL
LCALL DELAY_2MS
LCALL DELAY_2MS
DJNZ R5,KSET_LOOP
AJMP EXT_KEY


K_UP:
LCALL DELAY_2MS
LCALL delay_2ms
JB KEY_UP,KEY_SELECT
JNB    01H,K_UP_LOW

K_UP_HIGH:
JNB KEY_UP,$
MOV A,2AH
ADD A,#1
MOV 2AH,A
JMP K_UP_DOWN_END

K_UP_LOW:
JNB KEY_UP,$
MOV A,2BH
ADD A,#1
MOV 2BH,A
JMP K_UP_DOWN_END

;*********************

K_DOWN:
LCALL DELAY_2MS
JB KEY_DOWN,KEY_SELECT
JNB    01H,K_DOWN_LOW

K_DOWN_HIGH:
JNB KEY_DOWN,$
MOV A,2AH
DEC A
MOV 2AH,A
JMP K_UP_DOWN_END

K_DOWN_LOW:
JNB KEY_DOWN,$
MOV A,2BH
DEC A
MOV 2BH,A

K_UP_DOWN_END:

MOV A,2AH
MOV B,#10
DIV AB
MOV 40H,B ;高温限值个位
MOV B,#10
DIV AB
MOV 41H,B;十位
MOV 42H,A;百位
;----------------------------
MOV A,2BH
MOV B,#10
DIV AB
MOV 43H,B ;低温限值位个位
MOV B,#10
DIV AB
MOV 44H,B ;十位
MOV 45H,A ;百位

AJMP KEY_IN


KEY_CPL:
CPL 01H
AJMP KEY_IN




EXT_KEY:
MOV P1,#00000001B ;清屏并光标复位
LCALL ENABLE;调用写入命令子程序
LCALL DISPLAY_SAVE

LCALL RESET
LCALL SKIP_ROM
MOV A,#4EH
LCALL WRITE
MOV A,2AH ;2A数据送高温限值寄存器.
LCALL WRITE
MOV A,2BH ;2B数据送低温限什寄存器.
LCALL WRITE

LCALL RESET
LCALL SKIP_ROM
MOV A,#48H ;将高低温限值寄存器数据送18B20-EPROM保存.
LCALL WRITE
A_END:

RET
;***************18b20指令子程序**********************
READ_TEMP:    ;读1820内部温度子程序.
         LCALL RESET
         JB 70h,EXT1
         LCALL SKIP_ROM
         LCALL TEMP_CONV ;温度AD变换
         LCALL DELAY_600MS    ;时........
         LCALL RESET
         LCALL SKIP_ROM
         LCALL TEMP_GET ;发取温度的命令
         LCALL READ ;接收...
                EXT1:
         RET

SKIP_ROM:;跳过ROM检测
      MOV A,#0CCH ;#0CCH为跳过rom命令
      LCALL WRITE
      RET

RELCALL_EPROM:;重调Eprom的值到18B20的暂存RAM中去,,这样一上电18B20中RAM就有数据了
      MOV A,#0B8H;在重调之前有配置或设定好下上限温度值吗?看看按键程序处有什么?
      LCALL WRITE
      RET


TEMP_CONV:
      MOV A,#44H ;AD变换
               LCALL WRITE
               RET

TEMP_GET:
      MOV A ,#0BEH;读18b20命令
      LCALL WRITE
      RET


;****************************18B20基本时序子程序*********************************
RESET:    ;初始化子程序      同时也检测18B20是否存在,,,
     SETB P0.0
     NOP
     CLR P0.0      ;拉低
     MOV R3,#150 ; *4=600US
     LCALL DELAY_BY_R3
     SETB P0.0      ;拉高
     MOV R3,#15    ; 60US
     LCALL DELAY_BY_R3
     MOV R3,#60 ;4个周期*60=240US内检测
A1: JNB P0.0,A2 ;检测到低平信号
      DJNZ R3,A1 ;如果没有应答的低电平信号,返回A1重新检测,超时后下一行,
      SETB 70h ;DS1820不存在.
      JMP A3
A2: CLR 70h
      MOV R3,120;240US;等恢复时间2*120=240us
      DJNZ R3, $
A3:
     RET
;------------------------

WRITE:
      MOV R2,#8;一个字节为8位
      CLR C ;C位清0 C位用来放A的一位数据,用移位的方法放入C
B1: SETB P0.0
               NOP
      CLR P0.0
               MOV R3,#4 ;16US
               LCALL DELAY_BY_R3
               RRC A              ;把A中的数送入C
               MOV P0.0,C     ;把C送入总线
      MOV R3,#12      ;48US(一位数据的发送:60us<tx<120us)
               LCALL DELAY_BY_R3
               SETB P0.0    ;拉高1us结束一位
               NOP
               DJNZ R2,B1
               RET

READ:
MOV R1,#9 ;接收4个字节数据依次是1.低位 2.高位. 3.高限 4.低限
MOV R0,#TEMPHEAD;低位放28H;高位放29h (1. 28H,2. 29H 3. 2AH 4. 2BH )
MOV B,#00H
READTEMP2CALL READDS1820
MOV @R0,A
INC R0
READTEMP21CALL CRC8CAL
DJNZ R1,READTEMP2
MOV A,B
JNZ READTEMPOUT
MOV A,TEMPHEAD
MOV TMP_L,A
MOV A,TEMPHEAD+1
MOV TMP_H,A
MOV            A,TEMPHEAD+2
MOV 2AH,A
MOV A,TEMPHEAD+3
MOV 2BH,A
READTEMPOUT:RET

CRC8CALUSH ACC
              MOV R7,#08H
CRCLOOP1:XRL A,B
               RRC A
                           MOV A,B
                           JNC CRCLOOP2
                           XRL A,#18H
CRCLOOP2:RRC A
               MOV B,A
                           POP ACC
                           RR A
                           PUSH ACC
                           DJNZ R7,CRCLOOP1
                           POP ACC
                           RET


READDS1820:
MOV R2,#8;一字节数据8位
C11: CLR C ;清除C
SETB P0.0
NOP
NOP
CLR P0.0 ;拉低.
NOP ;1us秒后拉高?
NOP
NOP
SETB P0.0
MOV R6,#07H
DJNZ R6,$
MOV C,P0.0 ;读出18b20的数据
RRC    A ;移入A
MOV R6,#3CH
DJNZ R6,$
SETB P0.0
DJNZ R2,C11 ;一个字节收完
MOV R6,#3CH
DJNZ R6,$
RET
;*********************************************************************************



;*****************LCD_控制命令***************
DISPLAY: MOV A,R1
MOVC A,@A+DPTR
MOV P1,A
LCALL WRITE_DATA_TO_LCD
INC R1
DJNZ R0,DISPLAY
RET


WRITE_NOT_CHECK_BUSY:
SETB E
NOP
NOP
CLR RS ;写入控制命令的子程序
CLR RW
CLR E
RET


ENABLE:            ;只要先将命令数据或地址先送P1,再调用ENABLE就可以写入哦
SETB E
NOP
NOP
CLR RS ;写入控制命令的子程序
CLR RW
CLR E
LCALL TEST_BUSY
SETB E
RET


TEST_BUSY:
SETB E
NOP
NOP
MOV P1,#0FFH ;判断液晶显示器是否忙的子程序
CLR RS
SETB RW
CLR E
NOP
SETB E
JB P1.7,TEST_BUSY ;如果P1.7为高电平表示忙就循环等待
RET


WRITE_DATA_TO_LCD:
SETB E
NOP
NOP
SETB RS ;RS=1
CLR RW ;RW=0 ;准备写入数据
CLR E ;E=0 ;执行显示命令
LCALL TEST_BUSY ;判断液晶模块是否忙?
SETB E ;E=1 ;显示完成,程序停车
RET
;***************************数据转换***************************
我要评论
  • 匿名发表
  • [添加到收藏夹]
  • 发表评论:(匿名发表无需登录,已登录用户可直接发表。) 登录状态:未登录
最新评论
  • 评论人:[BOBO] 时间: [2011/10/27 16:29:40] IP:[222.89.65.20*]
  • 太厉害了,一定得更加努力。。。。

网站导航 管理登陆 ┊ 免责声明 问题反馈  友链说明
本站部分内容来自网络共享资源,如有冒犯您的权利请来信告之删除或纠正!
不得对本站进行复制、盗链或镜像,转载内容须获得同意或授权;欢迎友情链接、站务合作!

    我要报警 Alexa
 mcusy_cn#126.com (请把#改成@) 交流:522422171
本站学习交流群:138..158(高级群1-)、77930286(高级群2)、61804809(群3)
Copyright© MCUSY All Rights Reserved
本站网警备案号: WZ36040002485
  ICP备案证书号:粤ICP备09034963号