打印

我们老师要编书,非要让我用51的汇编写个DS18B20温度采集!

[复制链接]
5656|34
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wdliming|  楼主 | 2012-6-14 11:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 wdliming 于 2012-6-15 12:49 编辑

如题!之前编了个C语言的,现在说出版方要求再用汇编来实现,感觉现在的教材真是有点。。呵呵,我都基本不看汇编了,而且感觉汇编迟早是要淘汰的,就像过去的A和B语言,不都被C语言替代了?汇编,感觉太难了,现成的代码都看不懂,一会一个跳转,有点晕。。各位网友有啥看法啊,畅所欲言啊!
介于网友的讨论,我下了一个汇编代码,改了几个引脚之后,可以再板子(和TX-1的板子兼容)上是运行起来了,可是有些语句不咋理解,希望高手们能否就相关关键语句注释一下啊?谢谢!
;******************************************************
;功能:DS18B20读写,用1602显示
;晶振频率:12MHz
;*********端口定义*****************
            IBUS BIT P2.2   ;18B20总线端口
            TMB BIT 20H     ;TM卡检测标志
            RED0 EQU 50H    ;存储区首址
            CRC EQU 5FH     ;校验码存储单元
            TEMC EQU 5EH
            TEMH EQU 29H    ;存储温度的高8位
            TEML EQU 28H    ;存储温度的低8位
            TEMX EQU 5BH
;********************************         
;显示器的端口定义         
            RSPIN BIT P3.5
            RWPIN BIT P3.6
            EPIN BIT P3.4
;*********************************         
            DY BIT 20H
            DIP0 EQU 60H
            DIP1 EQU 61H
            DIP2 EQU 62H
            DIP3 EQU 63H
            DIP4 EQU 64H
            DIP5 EQU 65H
            DIP6 EQU 66H
            DIP7 EQU 67H
            DIP8 EQU 68H
            DIP9 EQU 69H
            DIPA EQU 6AH
            DIPB EQU 6BH
            DIPC EQU 6CH
            DIPD EQU 6DH
            DIPE EQU 6EH
            DIPF EQU 6FH
            KG0 EQU 70H
            KG1 EQU 71H
            KG2 EQU 72H
            KG3 EQU 73H
            KG4 EQU 74H
            KG5 EQU 75H
            KG6 EQU 76H
            KG7 EQU 77H
            KG8 EQU 78H
            KG9 EQU 79H
            KGA EQU 7AH
            KGB EQU 7BH
            KGC EQU 7CH
            KGD EQU 7DH
            KGE EQU 7EH
            KGF EQU 7FH
            XPOS EQU 30H
            YPOS EQU 31H

            ORG 0000H
            AJMP MAIN       ;转到主程序区
            ORG 0030H
MAIN:         ACALL LCDCSH
            MOV R0,#50H     ;清存储单元
            MOV R1,#48
LOOP1:       MOV @R0,#0
            INC R0
            DJNZ R1,LOOP1
            MOV R0,#DIP0
            MOV R1,#32
            MOV DPTR,#TAB1
CSL:        MOV A,#0
            MOVC A,@A+DPTR
            MOV @R0,A
            INC DPTR
            INC R0
            DJNZ R1,CSL
            ACALL DIP
DS1820:      LCALL INT        ;调用初始化程序
            JB TMB,DS1820    ;0则程序往下执行
            MOV A,#0CCH      ;送立即数到寄存器A中
            LCALL WRITE      ;调用写子程序
            MOV A,#44H
            LCALL WRITE
            JNB IBUS,$
            LCALL D10MS
            LCALL INT
            MOV A,#0CCH
            LCALL WRITE
            MOV A,#0BEH
            LCALL WRITE
            MOV R0,#TEML
            MOV R1,#2
TEMP:       LCALL READ
            MOV @R0,A
            INC R0
            DJNZ R1,TEMP
            LCALL TEMPDIS
            LCALL DDIP
            LCALL DIP
            LCALL D400MS
            LJMP DS1820
;***************************************
;**************初始化子程序*************
;***************************************
INT:        CLR EA            ;关中断
            CLR IBUS          ;拉底总线
            MOV R2,#0FFH      ;总线保持底电平至少480微秒
            DJNZ R2,$
            SETB IBUS         ;拉高总线为1
            MOV R2,#50H       ;送延时时间
ASK_L:      JNB IBUS,ASK      ;检测总线状态,为0时,说明的应答,则跳转到ASK_L。
                              ;为1则没有器件或没有检测到,
            DJNZ R2,ASK_L     ;时间到?没有则转到ASK_L,继续检测总线状态
            SETB TMB          ;延时时间结束,置标志位TMB为1
ASK_E:      SETB IBUS         ;恢复总线,使总线处于空闲状态
            RET               ;子程序返回
ASK:        CLR TMB           ;标志位清0
            MOV R2,#120
            DJNZ R2,$
            AJMP ASK_E        ;跳转到ASK_E
;***************************************
;**************写数据子程序*************
;***************************************
WRITE:      MOV R3,#8         ;送位数
WRI_L:      CLR IBUS          ;拉底总线为0
            RRC A             ;A中数据右移一位
            MOV R2,#5
            DJNZ R2,$
            MOV IBUS,C        ;数据送到总线
            MOV R2,#40        ;延时80微秒,以完成一个写时序
            DJNZ R2,$
            SETB IBUS         ;拉高总线为1;恢复总线状态,
            NOP               ;使总线处于空闲状态
            DJNZ R3,WRI_L     ;是否写完一个字节?否则转到WRI_L传送下一个字节
            SETB IBUS         ;恢复总线空闲状态
            NOP
            RET               ;子程序返回
;***************************************
;**************读数据子程序*************
;***************************************
READ:       MOV R2,#8;数据一共有8位
RE01:       CLR C
            SETB IBUS
            NOP
            NOP
            CLR IBUS
            NOP
            NOP
            NOP
            SETB IBUS
            MOV R3,#5
RE10:         DJNZ R3,RE10
            MOV C,IBUS
            MOV R3,#23
RE20:         DJNZ R3,RE20
            RRC A
            DJNZ R2,RE01
            RET                ;子程序返回
;************延时子程序***************
D1MS:        MOV R2,#2
D1S:        MOV R3,#0FFH
            DJNZ R3,$
            DJNZ R2,D1S
            RET
D10MS:      MOV R2,#20
DMS:         MOV R3,#0FFH
            DJNZ R3,$
            DJNZ R2,DMS
            RET
D5MS:         MOV R5,#0AH
DL:           MOV R6,#0FFH
            DJNZ R6,$
            DJNZ R5,DL
            RET
D400MS:     MOV     R6,#10            ;延时子程序(400MS)
DL4_PA:     MOV     R2,#100
DL4_PB:     MOV     R5,#100
            DJNZ    R5,$
            DJNZ    R2,DL4_PB
            DJNZ    R6,DL4_PA
            RET
D100MS:     MOV R2,#60
DMSS:       MOV R3,#0FFH
            DJNZ R3,$
            DJNZ R2,DMSS
            RET
TEMPDIS:      MOV A,TEML
            MOV C,48H
            RRC A
            MOV C,49H
            RRC A
            MOV C,4AH
            RRC A
            MOV C,4BH
            JNC TEMN0
            MOV TEMC,#17
            RRC A
            CPL A
            AJMP RRCA
TEMN0:        MOV TEMC,#16
            RRC A
RRCA:         MOV TEML,A
            JNC NET
            MOV TEMX,#5
            AJMP TEME
NET:          MOV TEMX,#0
TEME:         RET
DDIP:         MOV DPTR,#TAB
            MOV A,TEML
            MOV B,#100
            DIV AB
            MOVC A,@A+DPTR
            MOV KG4,A
            MOV A,B
            MOV B,#10
            DIV AB
            MOVC A,@A+DPTR
            MOV KG6,A
            MOV A,B
            MOVC A,@A+DPTR
            MOV KG7,A
            MOV A,TEMC
            MOVC A,@A+DPTR
            MOV KG4,A
            MOV A,TEMX
            MOVC A,@A+DPTR
            MOV KG9,A
            RET
;********************显示编码**************
TAB:     DB '0','1','2','3','4','5','6','7','8','9'
        DB 'A','B','C','D','E','F','+','-','.'
TAB1:   DB "Temperature Test"
        DB "    +000.0/C    "
;******************************************
;****************显示子程序*****************
DIP:          MOV XPOS,#0
            MOV YPOS,#0
            MOV 34H,#DIP0
LEE1:         MOV R0,34H
            ACALL LCDWRI
            INC 34H
            INC XPOS
            MOV A,XPOS
            CJNE A,#16,LEE1
            MOV XPOS,#0
            INC YPOS
            MOV A,YPOS
            CJNE A,#2,LEE1
            MOV YPOS,#0
            MOV XPOS,#0
            MOV 34H,#DIP0
            RET
LCDWRI:       ACALL LCDPOS
            MOV A,@R0
            ACALL LCDWRD
            RET
LCDWRD:       ACALL WAIT
            SETB RSPIN
            CLR RWPIN
            MOV P0,A
            SETB EPIN
            NOP
            CLR EPIN
            RET
LCDPOS:       ANL XPOS,#0FH
            ANL YPOS,#01H
            MOV A,YPOS
            CJNE A,#0,ERT
            MOV A,XPOS
            AJMP ERT0
ERT:          MOV A,XPOS
            ORL A,#40H
ERT0:         ORL A,#80H
            ACALL LCDWC
            RET
LCDCSH:       CALL D5MS
            CALL D5MS
            CALL D5MS
            MOV A,#38H
            ACALL LCDWCN
            CALL D5MS
            MOV A,#38H
            ACALL LCDWCN
            CALL D5MS
            MOV A,#38H
            ACALL LCDWCN
            MOV A,#38H
            ACALL LCDWC
            MOV A,#08H
            ACALL LCDWC
            MOV A,#01H
            ACALL LCDWC
            MOV A,#06H
            ACALL LCDWC
            MOV A,#0CH
            ACALL LCDWC
            RET
LCDWC:        ACALL WAIT
LCDWCN:       CLR RSPIN
            CLR RWPIN
            MOV p0,A
            SETB EPIN
            NOP
            CLR EPIN
            RET
WAIT:         PUSH ACC
            MOV p0,#0FFH
            CLR RSPIN
            SETB RWPIN
            SETB EPIN
WAIT1:        NOP
            JB p0.7,WAIT1
            CLR EPIN
            POP ACC
            RET
            END

相关帖子

沙发
ayb_ice| | 2012-6-14 11:45 | 只看该作者
装个proteus软件就什么都有了

使用特权

评论回复
板凳
寂寞西瓜| | 2012-6-14 12:04 | 只看该作者
教材和实用上,有时候是有差别,但是有时候的确需要暂时不考虑实用,而尽量贴近原理,才适合教学
所以,现在教材都分理论篇和实践篇,但很遗憾,能写好和区分好的,并不多
比如串口,理论篇讲串口收发,在main函数里,侧重的是串口的配置和工作原理,而实践篇里,串口应该用中断收发,这才符合工程要求。如果一味贴近实际,直接讲串口的中断收发,那学生可能就晕了,胡子眉毛一把抓,没有侧重点。
所以我个人还是理解用汇编的,毕竟c语言也要被编译成汇编再变成机器语言才能真正地被执行。
你虽然不直接用汇编,但是编译器会做这个工作。c语言毕竟会丢失一些硬件上的细节。

使用特权

评论回复
评分
参与人数 1威望 +2 收起 理由
McuPlayer + 2
地板
寂寞西瓜| | 2012-6-14 12:06 | 只看该作者
18b20我也了解过一点,对时序要求比较高,这个时候,汇编的优势就体现了
正在写教材,说的这些算是提供给大家一点思路吧。

使用特权

评论回复
5
autopccopy| | 2012-6-14 12:27 | 只看该作者
网上搜出来一堆堆... :)

例如:http://www.****ducst/datasheet/stc/STC-USER-CODE/**-DS18B20.rar

使用特权

评论回复
6
原野之狼| | 2012-6-14 12:43 | 只看该作者
写吧  玩玩汇编也不错呀  以后你要搞系统移植的时候就知道这东西管用了

使用特权

评论回复
7
panchaoran| | 2012-6-14 16:13 | 只看该作者
问题是 你的老师出书 关你什么事呢 为什么是你写?

使用特权

评论回复
8
wukunshan| | 2012-6-14 16:36 | 只看该作者
你就告诉你的老师呀,现在这种简单的代码网上很多,没必要自己浪费时间去写了。这里有DS18B20经典C代码:http://wushifuc51.21ic.org

使用特权

评论回复
9
coody| | 2012-6-14 16:54 | 只看该作者
老湿他不会自己写么?

使用特权

评论回复
10
cool_coder| | 2012-6-14 17:02 | 只看该作者
其实也不太麻烦:如果程序不大,把编译器生成的汇编码稍改即可。

使用特权

评论回复
11
wukunshan| | 2012-6-14 17:11 | 只看该作者
再告诉你的老师,汇编过时了,现在是单片机C语言年代。书里都是汇编代码,书卖不出去的。

使用特权

评论回复
12
wdliming|  楼主 | 2012-6-14 17:33 | 只看该作者
呵呵!研究生嘛。。。老师就像是老板。。还是要感谢提供代码的网友!!

使用特权

评论回复
13
wdliming|  楼主 | 2012-6-14 17:36 | 只看该作者
这的有同感!在系统启动的时候会用汇编,这样可以喝硬件底层接触,上面的就是和C语言打交道了。。有时候改一个汇编我都不知道从哪里下手。。。相对C语言就好多了!

使用特权

评论回复
14
wdliming|  楼主 | 2012-6-14 17:38 | 只看该作者
3楼的说的对,在arm里,启动代码都会是一些汇编的,这些有时候都由编译器和者软件公司写好的,我们只负责修修改改的,上面应用这块还是会用C语言来实现,有时候在汇编里增加一些功能都不知道从哪里下手!读起来也费劲,而C语言就好多了。。这是我目前的体验!

使用特权

评论回复
15
wdliming|  楼主 | 2012-6-14 17:40 | 只看该作者
8# wukunshan
你提供的网站不错诶!!谢谢了!

使用特权

评论回复
16
zhaofy521| | 2012-6-14 17:41 | 只看该作者
写写也健康:lol

使用特权

评论回复
17
wdliming|  楼主 | 2012-6-14 17:41 | 只看该作者
6# 原野之狼
这在arm+linux里会用到。。。同感,不过大的程序不会用汇编的。

使用特权

评论回复
18
BaiWfg2| | 2012-6-14 19:33 | 只看该作者
老师写书与你写汇编,,神么关系?

使用特权

评论回复
19
figo20042005| | 2012-6-14 20:07 | 只看该作者
现在单片机的书泛滥了,还是写那老一套不行了。应该写写怎么自动生成代码。绝对大卖

使用特权

评论回复
20
dong_abc| | 2012-6-14 20:39 | 只看该作者
写写汇编吧,迟早还是要捡起来的。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:我的未来不是梦

76

主题

913

帖子

4

粉丝