找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4524|回复: 1
打印 上一主题 下一主题
收起左侧

18b20温度 带上限程序 温度上限调节 LCD1602液晶显示

[复制链接]
跳转到指定楼层
楼主
ID:105323 发表于 2016-2-22 01:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
;在前一篇:http://www.51hei.com/bbs/dpj-44013-1.html 的基础上,有增加几个按键,.P0.0 进入温度调节 P0.1十位位温度调节     P0.2 个位温度调节 P0.3退出温度调节
不足之处:1.温度只能在30度到40度之间调节
                  2.没有增加软件去抖动




  1. ORG 0000H
  2. ;单片机内存分配申明!
  3. TEMPER_L EQU 29H;用于保存读出温度的低8位
  4. TEMPER_H EQU 28H;用于保存读出温度的高8位
  5. FLAG1       EQU 38H;是否检测到DS18B20标志位
  6. a_bit       equ 20h ;数码管个位数存放内存位置
  7. b_bit       equ 21h ;数码管十位数存放内存位置
  8. c_bit       equ 22h ;按键个位内存地址
  9. d_bit       equ 23h     ;按键个位内存地址
  10. e_bit       equ 24h
  11. RS EQU P3.7;确定具体硬件的连接方式
  12. RW EQU P3.6 ;确定具体硬件的连接方式
  13. E EQU P3.5 ;确定具体硬件的连接方式
  14.           MOV A,29H
  15.           MOV C,40H;将28H中的最低位移入C
  16.           RRC A
  17.           MOV C,41H
  18.           RRC A
  19.           MOV C,42H
  20.           RRC A
  21.           MOV C,43H
  22.           RRC A
  23.           MOV 29H,A
  24.           clr c
  25.           setb p3.0;zhelikais从这里开始是我填加的温度控制
  26.           acall key
  27.           CJNE A,e_bit,FIT
  28.           SETB P3.0
  29.           AJMP DISLED
  30.       FIT:CPL C
  31.           MOV P3.0,C;jiesu到这里结束
  32. DISLED:LCALL DISPLAY;调用数码管显示子程序
  33.           AJMP MAIN
  34. ;DS18B20复位初始化子程序
  35. INIT_1820:SETB P2.2
  36.              NOP
  37.              CLR P2.2;主机发出延时537微秒的复位低脉冲
  38.              MOV R1,#3
  39.         TSR1:MOV R0,#107
  40.              DJNZ R0,$
  41.              DJNZ R1,TSR1
  42.              SETB P2.2;然后拉高数据线
  43.              NOP
  44.              NOP
  45.              NOP
  46.              MOV R0,#25H
  47.         TSR2:JNB P2.2,TSR3;等待DS18B20回应
  48.              DJNZ R0,TSR2
  49.              LJMP TSR4 ; 延时
  50.         TSR3:SETB FLAG1 ; 置标志位,表示DS1820存在
  51.              CLR P1.7;检查到DS18B20就点亮P1.7LED,与传感器通信成功
  52.              LJMP TSR5
  53.         TSR4:CLR FLAG1 ; 清标志位,表示DS1820不存在
  54.              CLR P1.1;未检查到DS18B20就点亮P1.1LED,与传感器通信失败
  55.              LJMP TSR7
  56.         TSR5:MOV R0,#117
  57.         TSR6:DJNZ R0,TSR6 ; 时序要求延时一段时间
  58.         TSR7:SETB P2.2
  59.              RET
  60. ;读出转换后的温度值的子程序
  61. GET_TEMPER:SETB P2.2
  62.               LCALL INIT_1820;先复位DS18B20
  63.               JB FLAG1,TSS2
  64.               CLR P1.2
  65.               RET ; 判断DS1820是否存在?若DS18B20不存在则返回
  66.          TSS2:CLR P1.3;DS18B20已经被检测到!
  67.               MOV A,#0CCH ; 跳过ROM匹配
  68.               LCALL WRITE_1820
  69.               MOV A,#44H ; 发出温度转换命令
  70.               LCALL WRITE_1820
  71.               LCALL DISPLAY;这里通过调用显示子程序实现延时一段时间,等待AD转换结束,12位的话750微秒
  72.               LCALL INIT_1820;准备读温度前先复位
  73.               MOV A,#0CCH ; 跳过ROM匹配
  74.               LCALL WRITE_1820
  75.               MOV A,#0BEH ; 发出读温度命令
  76.               LCALL WRITE_1820
  77.               LCALL READ_18200; 将读出的温度数据保存到35H/36H
  78.               CLR P1.4
  79.               RET
  80. ;写DS18B20的子程序(有具体的时序要求)
  81. WRITE_1820:MOV R2,#8;一共8位数据
  82.               CLR C
  83.           WR1:CLR P2.2
  84.               MOV R3,#6
  85.               DJNZ R3,$
  86.               RRC A
  87.               MOV P2.2,C
  88.               MOV R3,#23
  89.               DJNZ R3,$
  90.               SETB P2.2
  91.               NOP
  92.               DJNZ R2,WR1
  93.               SETB P2.2
  94.               RET
  95. ; 读DS18B20的程序,从DS18B20中读出两个字节的温度数据
  96. READ_18200:MOV R4,#2 ; 将温度高位和低位从DS18B20中读出
  97.               MOV R1,#29H ; 低位存入29H(TEMPER_L),高位存入28H(TEMPER_H)
  98.          RE00:MOV R2,#8;数据一共有8位
  99.          RE01:CLR C
  100.               SETB P2.2
  101.               NOP
  102.               NOP
  103.               CLR P2.2
  104.               NOP
  105.               NOP
  106.               NOP
  107.               SETB P2.2
  108.               MOV R3,#9
  109.          RE10:DJNZ R3,RE10
  110.               MOV C,P2.2
  111.               MOV R3,#23
  112.          RE20:DJNZ R3,RE20
  113.               RRC A
  114.               DJNZ R2,RE01
  115.               MOV @R1,A
  116.               DEC R1
  117.               DJNZ R4,RE00
  118.               RET
  119. ;键盘扫描程序
  120. key:       nop
  121.            mov r2,#00h
  122.            mov r3,#00h
  123.            jb p0.0,sss
  124. mai:       jnb p0.1,key1
  125.            jnb p0.2,key2
  126.            jnb p0.3,sss
  127.            ljmp mai
  128. sss:       LJMP fff
  129. key1:      mov r2,#0ffh
  130. q1:        jnb p0.1,$
  131.            inc r2
  132.            mov a,r2
  133.            cjne r2,#0ah,q2
  134.            ljmp key1
  135. q2:        mov a,r2
  136.            swap a
  137.            add a,r3
  138.            subb a,#12h
  139.            mov e_bit,a           
  140.            mov a,r2
  141.            add a,#30h
  142.            mov c_bit,a
  143.            acall display0
  144. q3:
  145.            jnb p0.1,q1
  146.            jnb p0.2,key2
  147.            jnb p0.3,sss
  148.            ljmp q3
  149. key2:      mov r3,#0ffh
  150. q4:        jnb p0.2,$
  151.            inc r3
  152.            mov a,r3
  153.            cjne r3,#0ah,q5
  154.            ljmp key1
  155. q5:        mov a,r2
  156.            swap a
  157.            add a,r3
  158.            subb a,#12h
  159.            mov e_bit,a      
  160.            mov a,r3
  161.            add a,#30h
  162.            mov d_bit,a
  163.            acall display0
  164. q6:
  165.            jnb p0.1,q1
  166.            jnb p0.2,q4
  167.            jnb p0.3,sss
  168.            ljmp q6
  169.         display0:
  170.         acall DL100MS
  171.         acall DL100MS
  172.      
  173.         MOV P1,#00000001B; ;清屏并光标复位
  174.         ACALL ENABLE;调用写入命令子程序
  175.         MOV P1,#00111000B ;;设置显示模式:8位2行5x7点阵
  176.         ACALL ENABLE ;调用写入命令子程序
  177.         MOV P1,#00001111B ;;显示器开、光标开、光标允许闪烁
  178.         ACALL ENABLE ;调用写入命令子程序
  179.         MOV P1,#00000110B ;;文字不动,光标自动右移
  180.         ACALL ENABLE ;调用写入命令子程序
  181.         MOV P1,#0C0H ;;写入显示起始地址(第二行第一个位置)
  182.         ACALL ENABLE ;调用写入命令子程序
  183.         MOV P1,c_bit ;;字母A的代码
  184.         SETB RS; ;RS=1
  185.         CLR RW; ;RW=0 ;准备写入数据
  186.         CLR E; ;E=0 ;执行显示命令
  187.         ACALL DELAY ;判断液晶模块是否忙?
  188.         SETB E ;;E=1 ;显示完成,程序停车
  189.         MOV P1,#0C1H ;;写入显示起始地址(第二行第一个位置)
  190.         ACALL ENABLE ;调用写入命令子程序
  191.         MOV P1,d_bit ;;字母A的代码
  192.         SETB RS; ;RS=1
  193.         CLR RW; ;RW=0 ;准备写入数据
  194.         CLR E; ;E=0 ;执行显示命令
  195.         ACALL DELAY ;判断液晶模块是否忙?
  196.         SETB E ;;E=1 ;显示完成,程序停车
  197.         ret
  198. fff: ret
  199. ;显示子程序
  200. display: acall DL100MS
  201.             acall DL100MS
  202.             mov a,29H;将29H中的十六进制数转换成10进制
  203.             mov b,#10 ;10进制/10=10进制
  204.             div ab
  205.             mov b_bit,a ;十位在a
  206.             mov a_bit,b ;个位在b
  207.             add a,#00110000b
  208.             mov b_bit,a
  209.             mov a,b
  210.             add a,#00110000b
  211.             mov a_bit,a
  212.             MOV P1,#00000001B; ;清屏并光标复位
  213.             ACALL ENABLE;调用写入命令子程序
  214.             MOV P1,#00111000B ;;设置显示模式:8位2行5x7点阵
  215.             ACALL ENABLE ;调用写入命令子程序
  216.             MOV P1,#00001111B ;;显示器开、光标开、光标允许闪烁
  217.             ACALL ENABLE ;调用写入命令子程序
  218.             MOV P1,#00000110B ;;文字不动,光标自动右移
  219.             ACALL ENABLE ;调用写入命令子程序
  220.             MOV P1,#80H ;;写入显示起始地址(第二行第一个位置)
  221.             ACALL ENABLE ;调用写入命令子程序
  222.             MOV P1,b_bit ;;A十位送出去

  223.             SETB RS; ;RS=1
  224.             CLR RW; ;RW=0 ;准备写入数据
  225.             CLR E; ;E=0 ;执行显示命令
  226.             ACALL DELAY ;判断液晶模块是否忙?
  227.             SETB E ;;E=1 ;显示完成,程序停车

  228.             MOV P1,#00000110B ;;文字不动,光标自动右移
  229.             ACALL ENABLE ;调用写入命令子程序
  230.             MOV P1,#81H ;;写入显示起始地址(第二行第2个位置)
  231.             ACALL ENABLE ;调用写入命令子程序
  232.             MOV P1,a_bit;;字母A的代码

  233.             SETB RS; ;RS=1
  234.             CLR RW; ;RW=0 ;准备写入数据
  235.             CLR E; ;E=0 ;执行显示命令
  236.             ACALL DELAY ;判断液晶模块是否忙?
  237.             SETB E ;;E=1 ;显示完成,程序停车
  238.         MOV P1,#00000110B ;;文字不动,光标自动右移
  239.         ACALL ENABLE ;调用写入命令子程序
  240.         MOV P1,#0C0H ;;写入显示起始地址(第二行第一个位置)
  241.         ACALL ENABLE ;调用写入命令子程序
  242.         MOV P1,c_bit ;;字母A的代码
  243.         SETB RS; ;RS=1
  244.         CLR RW; ;RW=0 ;准备写入数据
  245.         CLR E; ;E=0 ;执行显示命令
  246.         ACALL DELAY ;判断液晶模块是否忙?
  247.         SETB E ;;E=1 ;显示完成,程序停车
  248.         MOV P1,#0C1H ;;写入显示起始地址(第二行第一个位置)
  249.         ACALL ENABLE ;调用写入命令子程序
  250.         MOV P1,d_bit ;;字母A的代码
  251.         SETB RS; ;RS=1
  252.         CLR RW; ;RW=0 ;准备写入数据
  253.         CLR E; ;E=0 ;执行显示命令
  254.         ACALL DELAY ;判断液晶模块是否忙?
  255.         SETB E ;;E=1 ;显示完成,程序停车
  256.         ret
  257.             ENABLE:
  258.             CLR RS; ;写入控制命令的子程序
  259.             CLR RW
  260.             CLR E
  261.             ACALL DELAY
  262.             SETB E
  263.             RET
  264.       DELAY:
  265.             MOV P1,#0FFH ;;判断液晶显示器是否忙的子程序
  266.             CLR RS
  267.             SETB RW
  268.             CLR E
  269.             NOP
  270.             SETB E
  271.             JB P1.7,DELAY; ;如果P1.7为高电平表示忙就循环等待
  272.             RET
  273. DL100MS:      MOV R7,#02H
  274. DL1:          MOV R6,#0C8H
  275. DL2:          MOV R5,#0FAH
  276.               DJNZ R5,$
  277.               DJNZ R6,DL2
  278.               DJNZ R7,DL1
  279.               RET

  280.             end
复制代码








分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:106483 发表于 2016-2-27 01:08 来自触屏版 | 只看该作者
怎麼下載?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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