找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5122|回复: 0
收起左侧

单片机+lcd1602显示温度汇编语言程序-精确到0.0625度

[复制链接]
ID:263238 发表于 2017-12-18 17:26 | 显示全部楼层 |阅读模式

单片机汇编源程序如下:
  1. ;这是关于单个DS18B20的测温程序,数据脚为P3.3,晶振是11.059MHZ
  2. ;温度传感器18B20采用器件默认的12位转化,最大转化时间要750毫秒
  3. ;用1602液晶屏显示,显示温度从00到99度,精确到0.0625度
  4. ;内存分配声明
  5. TEMPER_L EQU 29H;用于保存读出温度的低字节
  6. TEMPER_H EQU 28H;用于保存读出温度的高字节
  7. T_DF EQU 27H ;FORMAT后的小数部分(decimal fraction),半字节的温度小数(存在低四位)
  8. T_INTEGER EQU 26H ;FORMAT后的整数部分(integer),将两字节的温度整合成1字节
  9. FLAG1 BIT 50H;位地址50H是字节2AH的最低位,用作是否检测到DS18B20的标志位

  10. A_BIT EQU 20h ;液晶十位数存放内存位置
  11. B_BIT EQU 21h ;液晶个位数存放内存位置
  12. C_BIT EQU 22H ;个位小数
  13. D_BIT EQU 23H ;十位小数
  14. E_BIT EQU 24H ;百位小数
  15. F_BIT EQU 25H ;千位小数


  16. RS BIT P2.0 ;这3位是液晶屏的控制信号,连接方式由具体硬件而定
  17. RW BIT P2.1
  18. E  BIT P2.2

  19. ORG 0000H
  20.             LJMP MAIN
  21. ORG 0100H
  22. MAIN:   
  23.            LCALL   INIT_RS232
  24.            CLR P1.3
  25.            LCALL T_CONVERSION;调用读温度子程序
  26.            LCALL T_FORMAT;将读出的2字节温度格式化
  27.            LCALL DISPLAY;调用液晶显示子程序
  28.            LCALL D1S;延时1秒后再测
  29.            LJMP MAIN

  30. ;--------------DS18B20的温度转换子程序,具体时序请参考资料-------------------
  31. T_CONVERSION:        LCALL INIT_1820;先复位DS18B20
  32.                      JB FLAG1,T_C0
  33.                      RET ; 判断DS1820是否存在  若DS18B20不存在则返回

  34. T_C0:                MOV A,#0CCH ; 跳过ROM匹配
  35.                      LCALL WRITE_1820
  36.                      MOV A,#44H ; 发出温度转换命令
  37.                      LCALL WRITE_1820
  38.                      LCALL D1S   ;这里等待AD转换结束,12位的话要延时750m秒
  39.                      LCALL INIT_1820;准备读温度前先复位
  40.                      MOV A,#0CCH ; 跳过ROM匹配
  41.                      LCALL WRITE_1820
  42.                      MOV A,#0BEH ; 发出读温度命令
  43.                      LCALL WRITE_1820
  44.                      LCALL READ_1820; 将读出的温度数据保存到28H(TEMPER_H)和29H(TEMPER_L)处
  45.                      RET

  46. ;------DS18B20复位初始化程序-----------------------------------------
  47. INIT_1820:   SETB P3.3
  48.                    NOP
  49.                    CLR P3.3
  50.                    MOV R0,#2 ;主机发出延时500微秒的复位低脉冲
  51. INIT0:         MOV R1,#250
  52.                    DJNZ R1,$
  53.                    DJNZ R0,INIT0

  54.                    SETB P3.3;然后拉高数据线
  55.                    NOP

  56.                    MOV R0, #15
  57. INIT1:         JNB P3.3, INIT3;延时60us等待DS18B20回应
  58.                    DJNZ R0, INIT1
  59.                    LJMP INIT4 ; 超时而没有响应
  60. INIT3:         SETB FLAG1 ; 置标志位,表示DS1820存在
  61.                    LJMP INIT5
  62. INIT4:         CLR FLAG1 ; 清标志位,表示DS1820不存在
  63.                    LJMP INIT6
  64. INIT5:         MOV R0, #120
  65.                    DJNZ R0, $ ; 延时240us
  66. INIT6:         SETB P3.3
  67.                    RET

  68. ;---------写DS18B20的子程序(有具体的时序要求)-------------------------------------
  69. WRITE_1820:   MOV R2,#8;一共8位数据
  70. WR0:              CLR P3.3
  71.                      MOV R3,#6
  72.                      DJNZ R3,$
  73.                      RRC A
  74.                      MOV P3.3,C
  75.                      MOV R3,#20
  76.                      DJNZ R3,$
  77.                      SETB P3.3
  78.                      NOP
  79.                      NOP
  80.                      DJNZ R2,WR0
  81.                      SETB P3.3
  82.                      RET

  83. ;------读DS18B20的程序,从DS18B20中读出两个字节的温度数据--------------------------
  84. READ_1820:      MOV R4,#2 ; 将温度高位和低位从DS18B20中读出
  85.                 MOV R1,#TEMPER_L ; 低位存入29H(TEMPER_L)
  86. RE0:            MOV R2,#8
  87. RE1:            SETB P3.3
  88.                    NOP
  89.                    NOP
  90.                    CLR P3.3
  91.                    NOP
  92.                    NOP
  93.                    SETB P3.3
  94.                    MOV R3,#5
  95.                    DJNZ R3, $
  96.                    MOV C,P3.3
  97.                    MOV R3,#20
  98.                    DJNZ R3, $
  99.                    RRC A
  100.                    DJNZ R2,RE1
  101.                    MOV @R1,A
  102.                    DEC R1            ; 高位存入28H(TEMPER_H)
  103.                    DJNZ R4,RE0
  104.                    RET

  105. ;-----整合读出的两字节温度(关于DS18B20读出的2字节温度格式请参考资料)----------
  106. T_FORMAT:         MOV A, #0FH
  107.                   ANL A, TEMPER_L
  108.                   MOV T_DF, A           ;获得小数部分(4位)

  109.                   MOV A, TEMPER_L
  110.                   SWAP A
  111.                   MOV TEMPER_L, A

  112.                   MOV A, TEMPER_H
  113.                   SWAP A
  114.                   MOV R0, #TEMPER_L
  115.                   XCHD A, @R0

  116.                   MOV T_INTEGER, A       ;获得整数部分(1字节)
  117.                   RET

  118. ;-------液晶显示的子程序(显示前先格式转换)---------------------------------------
  119. DISPLAY:             mov a, T_INTEGER
  120.                      mov b,#10
  121.                      div ab
  122.                      mov A_BIT,a ;十位存在A_BIT
  123.                                               mov B_BIT,b ;个位存在B_BIT
  124.                      MOV A, T_DF
  125.                      MOV R0, #C_BIT
  126.                     MOV R2, #4
  127.                        D0: MOV B, #10
  128.                      MUL AB
  129.                      MOV B, #16
  130.                      DIV AB
  131.                      MOV @R0, A      ;从个位小数C_BIT,到十位D_BIT,百位E_BIT,千位F_BIT
  132.                      INC R0
  133.                      MOV A, B
  134.                      DJNZ R2, D0
  135.                      ;----二进制到ASCII码转换--------------
  136.                      MOV A, #30H
  137.                      ORL A_BIT, A
  138.                      ORL B_BIT, A
  139.                      ORL C_BIT, A
  140.                      ORL D_BIT, A
  141.                      ORL E_BIT, A
  142.                      ORL F_BIT, A
  143.                      ;-------------------------------------
  144.                      LCALL INITIAL
  145.                      MOV A, #10000000B                ; LINE1: DB 'Now is:',00H
  146.                      LCALL   WRITE_INSTRUCTION
  147.                      MOV   DPTR, #LINE1
  148.                      LCALL   PR_STRING
  149.                      MOV A, A_BIT
  150.                      LCALL TX_CHAR
  151.                      LCALL   WRITE_LCDDATA
  152.                      MOV A, B_BIT
  153.                                LCALL TX_CHAR
  154.                      LCALL   WRITE_LCDDATA
  155.                      MOV A, #2EH
  156.                      LCALL TX_CHAR;'.'字符
  157.                      LCALL   WRITE_LCDDATA
  158.                      MOV A, C_BIT
  159.                                LCALL TX_CHAR
  160.                      LCALL   WRITE_LCDDATA
  161.                      MOV A, D_BIT
  162.                                LCALL TX_CHAR
  163.                      LCALL   WRITE_LCDDATA
  164.                      MOV A, E_BIT
  165.                                LCALL TX_CHAR
  166.                      LCALL   WRITE_LCDDATA
  167.                      MOV A, F_BIT
  168.                                LCALL TX_CHAR
  169.                      LCALL   WRITE_LCDDATA
  170.                      MOV A, #0DFH                        ;下面两个是摄氏度的数字符号
  171.                                LCALL TX_CHAR
  172.                      LCALL   WRITE_LCDDATA
  173.                      MOV A, #43H
  174.                                LCALL TX_CHAR
  175.                      LCALL   WRITE_LCDDATA
  176.                      MOV A, #0AH
  177.                                LCALL TX_CHAR
  178.                      
  179.                      mov a, #11000000B                 ; LINE2: DB 'WANG XUE MIN!',00H
  180.                      Lcall write_instruction
  181.                      MOV   DPTR, #LINE2
  182.                      LCALL   PR_STRING
  183.                      RET

  184. ;---液晶屏初始化,具体请参考资料-------------------------------------------------
  185. initial:         MOV   A, #01H
  186.                        LCALL WRITE_INSTRUCTION
  187.                        MOV   A, #38H
  188.                        LCALL WRITE_instruction
  189.                        MOV   A, #0FH
  190.                        LCALL WRITE_instruction
  191.                        MOV   A, #06H
  192.                        LCALL WRITE_instruction
  193.                        RET

  194. ;----写液晶指令的子程序------------------------------------------
  195. WRITE_instruction: MOV P0, A
  196.                                CLR RS ;写入控制命令
  197.                                CLR RW
  198.                                CLR E
  199.                                LCALL DELAY
  200.                                SETB E
  201.                                RET

  202. ;----写液晶数据的子程序---------------------------------------------
  203. write_lcddata:   MOV P0, A
  204.                           SETB RS ;写入数据
  205.                           CLR RW
  206.                           CLR E
  207.                           LCALL DELAY ;判断液晶模块是否忙  
  208.                           SETB E
  209.                           RET

  210. ;-----写行字符的子程序---------------------------------------------------------------
  211. PR_STRING:   CLR    A
  212.                    MOVC   A, @A+DPTR
  213.                    JZ      END_PR
  214.                    LCALL WRITE_LCDDATA
  215.                    INC    DPTR
  216.                    LJMP   PR_STRING
  217. END_PR:       RET

  218. ;----查看液晶忙碌信号的子程序---------------------------------------------------------
  219. DELAY:   MOV P0,#0FFH ;判断液晶显示器是否忙的子程序
  220.              CLR RS
  221.              SETB RW
  222.              CLR E
  223.              NOP
  224.              SETB E
  225.              JB P0.7,DELAY ;如果P1.7为高电平表示忙就循环等待
  226. ……………………

  227. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
95060445lcd1602-18B20.rar (15.69 KB, 下载次数: 72)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表