一乐电子

一乐电子百科

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

快捷登录

手机号码,快捷登录

搜索
楼主: 山水2000
收起左侧

[其他综合] 请汇编高手帮修改一下,温度显示电路程序。

[复制链接]
 楼主| 发表于 2013-7-8 09:50 | 显示全部楼层
灰灰的丝丁鱼 发表于 2013-7-8 09:41
谬跨了,我也是在学习中;
这个用来测室温,那么是否会到零下?要是不超过零下10℃,负号还是可以显示的, ...

其实不用零下都可以,更不会超过零下10度了(我在广东,最低温度都没有超过零度),不过还是有用的,可以用来测一个冰箱制冷效果,看最低能到多少度。
我试着改改看能不能改,如果我改不了还得请教您了,呵呵
发表于 2013-7-8 09:53 | 显示全部楼层
灰灰的丝丁鱼 发表于 2013-7-7 22:55
从未试过代码模式,拿温度显示子程序来试一下(包含无效0消隐处理);整个改动后的程序增加了两个位标志位 ...


  一。0.1精确度
       18B20默认12位精度,为防止有误,还是有必要初始化。
        MOV    A,#7FH        ;12位精确度
        LCALL  WRITE_1820    ;写入暂存器

  二。负温处理
        
       1.判负温
        读出温度:TEMPL---低温度值存放单元
                  TEMPH---高温度值存放单元
        当TEMPH为零是正温
        当TEMPH大于零是负温
        
       2。负温处理
       求补码-取反加1
         
CONV_TEMP:     MOV  A,TEMPH       ;判高温度值存放单元
               ANL  A,#80H        ;判温度是否为负温(TEMPH和10000000相与)
               JZ   TC1           ;如为零温度是正并转
               CLR  C             ;不是零, 确认是负温,往下   
               MOV  A,TEMPL       ;二进制数求补(双字节)
               CPL  A             ;取反
               ADD  A,#01H        ;加1
               MOV  TEMPL,A       ;更新低温度值存放单元
               MOV  A,TEMPH       ;处理高温度值存放单元
               CPL  A
               ADDC  A,#00H
               MOV  TEMPH,A
               SJMP  TC2

     三。精度处理

             MOV  A,TEMPL            ;取低四位
               ANL  A,#0FH           ;
            以下采用查表方式

     四。参考程序

; 处理温度 BCD 码子程序
CONV_TEMP:     MOV  A,TEMPH       ;判高温度值存放单元
               ANL  A,#80H        ;判温度是否为负温(TEMPH和10000000相与)
               JZ   TC1           ;如为零温度是正并转
               CLR  C             ;不是零, 确认是负温,往下   
               MOV  A,TEMPL       ;二进制数求补(双字节)
               CPL  A             ;取反
               ADD  A,#01H        ;加1
               MOV  TEMPL,A       ;更新低温度值存放单元
               MOV  A,TEMPH       ;处理高温度值存放单元
               CPL  A
               ADDC  A,#00H
               MOV  TEMPH,A
               SJMP  TC2
TC1:           MOV  TEMPHC,#0AH    ;TEMPHC=存十位数 BCD码   
TC2:           MOV  A,TEMPHC   
               SWAP  A
               MOV  TEMPHC,A
               MOV  A,TEMPL
               ANL  A,#0FH              ;乘0.0625
               MOV  DPTR,#DOTTAB
               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   TC3
               ANL  A,#0FH
               SWAP  A
               MOV  R4,A
               MOV  A,TEMPHC            ;TEMPHC HI = 百位数 BCD
               ANL  A,#0FH
               ORL  A,R4
               MOV  TEMPHC,A
TC3:           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
;-------------------------
; 小数部分码表
DOTTAB:
         DB   00H,00H,01H,01H,02H,03H,03H,04H
         DB   05H,05H,06H,06H,07H,08H,08H,09H

评分

参与人数 1一乐金币 +20 收起 理由
山水2000 + 20 赞一个!

查看全部评分

发表于 2013-7-8 10:35 | 显示全部楼层
倪大德 发表于 2013-7-8 09:53
一。0.1精确度
       18B20默认12位精度,为防止有误,还是有必要初始化。
        MOV    A,#7FH ...

好资料,谢谢了!
 楼主| 发表于 2013-7-8 15:58 | 显示全部楼层
加了温度C号显示,现在最低温度显示“-9.8C”,为什么不是-9.9呢?怪了,最高温度显示“99.9C”,最高温度正常,室温显示够用了。
-9.9度.jpg
99.9度.jpg
 楼主| 发表于 2013-7-8 16:06 | 显示全部楼层
还有就是看不明这两段代码,功能都一样,前一段比较好理解,后一段就有点难理解,只看到一个“个位”的数据,还有“十位”、“百位”、“千位”看不出在哪。

这代码里很清楚的有个位,十位,百位,千位的数

这代码里很清楚的有个位,十位,百位,千位的数

这代码简单很多,但看不明白,只看到个位的数,其它三位看不出

这代码简单很多,但看不明白,只看到个位的数,其它三位看不出
 楼主| 发表于 2013-7-8 17:06 | 显示全部楼层
经过单步仿真后,好象有一点明白了,还得慢慢消化,呵呵。
单步仿真.jpg
发表于 2013-7-8 21:50 | 显示全部楼层
山水2000 发表于 2013-7-8 15:58
加了温度C号显示,现在最低温度显示“-9.8C”,为什么不是-9.9呢?怪了,最高温度显示“99.9C”,最高温度正 ...

问题出在两点上:1:本该乘以625(即0.0625转成整数计算)的,但为了计算方便,而且也用不到那么高的精度,所以只乘以6,这样乘积一个字节就放得下,要是提高一点,乘以62,则要两个字节才能放得下乘积了(62*10=620,也就是16进制最大只到026CH),你要是确实需要,就用62来计算,加点程序就可以了,见MUL AB语句的详解,不加的话会有两个地方因为不够进位而偏小;
2:貌似负数的小数计算有点问题,似乎会偏小一点点,但是我看补码的方法好像没有错啊,也是因为对精度要求不高,没有去详看程序,在负数状态下最高是到不了0.9的

评分

参与人数 1一乐金币 +10 收起 理由
山水2000 + 10 讲解的很清楚

查看全部评分

发表于 2013-7-8 22:19 | 显示全部楼层
山水2000 发表于 2013-7-8 16:06
还有就是看不明这两段代码,功能都一样,前一段比较好理解,后一段就有点难理解,只看到一个“个位”的数据 ...

这一段,我之前就说你的程序不够简练(我自己写出来也是不够简练),因为前一段的程序是一个位数一段程序,要是数码管有10位,就很长了,而数码显示程序其实是一样的,前一段的程序弄了那么多,其实是被小数点给折腾的,我把小数点的处理放到转换程序那里去了,显示程序就可以简化了;
你看到只有个位的,没有看到其它位的,不过你看看内存定义,显示存储单元是从30H起连续下去的,这就给程序设计带来方便了,我把30H赋值给R1,而@R1一开始的内容就是30H里的内容(间接寻址),到一位显示完后,INC R1,就是把显示地址+1,R1变成31H,返回循环程序,而@R1的内容就变成31H里的内容了,如此循环,直到R2设定的次数到达为止

评分

参与人数 1一乐金币 +10 收起 理由
山水2000 + 10 讲的很清楚,已经完全理解了。

查看全部评分

发表于 2013-7-9 00:46 | 显示全部楼层
山水2000 发表于 2013-7-8 17:06
经过单步仿真后,好象有一点明白了,还得慢慢消化,呵呵。

对了,你这些寄存器什么的是从哪里弄出来的,我找不到啊
 楼主| 发表于 2013-7-9 10:24 | 显示全部楼层
本帖最后由 山水2000 于 2013-7-9 10:27 编辑
灰灰的丝丁鱼 发表于 2013-7-8 22:19
这一段,我之前就说你的程序不够简练(我自己写出来也是不够简练),因为前一段的程序是一个位数一段程序 ...


看你一说,完全明白了,谢谢了,下面我上几个图说明一下怎样打开那几个寄存什么的,还有原程序窗口。
001.jpg
002.jpg
003.jpg

本版积分规则

QQ|一淘宝店|手机版|商店|电子DIY套件|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2024-5-13 02:03 , Processed in 0.058339 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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