找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机汇编语言数字温度计设计

[复制链接]
跳转到指定楼层
楼主
设计要求:
数字温度计
设计一个具有特定功能的数字温度计。该数字温度计上电或按键复位后能自动显示系统提示符“P.”,进入准备工作状态。测量温度范围0℃~99℃,测量精度小数点后两位,可以通过开始和结束键控制数字温度计的工作状态。
下面是我的仿真图和汇编程序,但是我的程序只能精确到小数点后一位(0.1),而且不能显示系统提示符“P.”
程序如下:











  1. ;================================================================
  2. ;DS18B20温度计
  3. ;采用4位LED共阳显示器显示测温值,显示精度0.1℃,测温范围-55~+125℃
  4. ;用AT89C51单片机,12MHz晶振
  5. ;============================常数定义=============================
  6. TIMEL EQU  0E0H         ;20ms,定时器0时间常数
  7. TIMEH EQU  0B1H
  8. TEMPHEAD   EQU  36H
  9. ;==========================工作内存定义============================
  10. BITST     DATA  20H
  11. TIME1SOK    BIT   BITST.1
  12. TEMPONEOK BIT   BITST.2
  13. TEMPL    DATA  26H
  14. TEMPH    DATA  27H
  15. TEMPHC    DATA  28H
  16. TEMPLC    DATA  29H
  17. ;============================= 引脚定义===========================
  18. TEMPDIN    BIT   P3.7
  19. ;============================= 中断向量区=========================
  20. ORG     0000H
  21. LJMP    START
  22. ORG    00BH
  23. LJMP    T0IT
  24. ;=============================系统初始化==========================
  25. ORG 100H
  26. START:   MOV SP,#60H
  27. CLSMEM:  MOV  R0,#20H
  28. MOV  R1,#60H
  29. CLSMEM1: MOV  @R0,#00H
  30. INC  R0
  31. DJNZ  R1,CLSMEM1
  32. MOV  TMOD,#00100001B   ;定时器0工作方式1(16BIT)
  33. MOV TH0,#TIMEL
  34. MOV  TL0,#TIMEH        ;20ms
  35. SJMP INIT
  36. ERROR: NOP
  37. LJMP  START
  38. NOP
  39. INIT: NOP
  40. SETB  ET0
  41. SETB  TR0
  42. SETB EA
  43. MOV  PSW,#00H
  44. CLR  TEMPONEOK
  45. LJMP  MAIN
  46. ;====================== 定时器0中断服务程序=======================
  47. T0IT: PUSH  PSW
  48. MOV  PSW,#10H
  49. MOV  TH0,#TIMEH
  50. MOV  TL0,#TIMEL
  51. INC  R7
  52. CJNE  R7,#32H,T0IT1
  53. MOV  R7,#00H
  54. SETB  TIME1SOK    ;1s定时到标志
  55. T0IT1: POP  PSW
  56. RETI
  57. ;============================= 主程序=============================
  58. MAIN: LCALL  DISP1   ;调用显示子程序
  59. JNB  TIME1SOK,MAIN
  60. CLR  TIME1SOK  ;测温每1s一次
  61. JNB  TEMPONEOK,MAIN2 ;上电时先温度转换一次
  62. LCALL  READTEMP1 ;读出温度值子程序
  63. LCALL  CONVTEMP  ;温度BCD码计算处理子程序
  64. LCALL  DISPBCD   ;显示区BCD码温度值刷新子程序
  65. LCALL  DISP1      ;消闪烁,显示一次
  66. MAIN2:  LCALL READTEMP   ;温度转换开始
  67. SETB  TEMPONEOK
  68. LJMP  MAIN
  69. ;============================= 子程序区===========================
  70. ;RESET DS18B20
  71. ;================================================================
  72. INITDS1820:SETB  TEMPDIN
  73. NOP
  74. NOP
  75. CLR  TEMPDIN
  76. MOV  R6,#0A0H   ;DELAY 480us
  77. DJNZ  R6,$
  78. MOV  R6,#0A0H
  79. DJNZ  R6,$
  80. SETB  TEMPDIN
  81. MOV  R6,#32H     ;DELAY 70us
  82. DJNZ  R6,$
  83. MOV R6,#3CH
  84. LOOP1820: MOV  C,TEMPDIN
  85. JC  INITDS1820OUT
  86. DJNZ  R6,LOOP1820
  87. MOV  R6,#064H
  88. DJNZ  R6,$
  89. SJMP  INITDS1820
  90. RET
  91. INITDS1820OUT: SETB  TEMPDIN
  92. RET
  93. ;====== 读DS18B20的程序,从DS18B20中读出一个字节的数据=============
  94. READDS1820: MOV  R7,#08H
  95. SETB  TEMPDIN
  96. NOP
  97. NOP
  98. READDS1820LOOP: CLR  TEMPDIN
  99. NOP
  100. NOP
  101. NOP
  102. SETB  TEMPDIN
  103. MOV  R6,#07H    ;DELAY 15us
  104. DJNZ  R6,$
  105. MOV  C,TEMPDIN
  106. MOV  R6,#3CH   ;DELAY 120us
  107. DJNZ  R6,$
  108. RRC  A
  109. SETB  TEMPDIN
  110. DJNZ  R7,READDS1820LOOP
  111. MOV  R6,#3CH   ;DELAY 120 us
  112. DJNZ  R6,$
  113. RET
  114. ;======== 写DS18B20的程序,从DS18B20中写一个字节的数据=============
  115. WRITEDS1820: MOV  R7,#08H
  116. SETB  TEMPDIN
  117. NOP
  118. NOP
  119. WRITEDS1820LOP: CLR  TEMPDIN
  120. MOV  R6,#07H    ;DELAY 15us
  121. DJNZ  R6,$
  122. RRC  A
  123. MOV  TEMPDIN,C
  124. MOV  R6,#34H    ;DELAY 104us
  125. DJNZ  R6,$
  126. SETB  TEMPDIN
  127. DJNZ  R7,WRITEDS1820LOP
  128. RET
  129. ;========================= READ TEMP ===========================
  130. READTEMP: LCALL  INITDS1820
  131. MOV  A,#0CCH
  132. LCALL  WRITEDS1820   ;SKIP ROM
  133. MOV  R6,#34H        ;DELAY 104us
  134. DJNZ  R6,$
  135. MOV  A,#44H
  136. LCALL  WRITEDS1820   ;START CONVERSION
  137. MOV  R6,#34H         ;DELAY 104
  138. DJNZ  R6,$
  139. RET
  140. READTEMP1: LCALL INITDS1820
  141. MOV  A,#0CCH
  142. LCALL  WRITEDS1820 ;SKIP ROM
  143. MOV  R6,#34H    ;DELAY 104us
  144. DJNZ  R6,$
  145. MOV  A,#0BEH
  146. LCALL  WRITEDS1820  ;SCRATCHPAD
  147. MOV  R6,#34H        ;DELAY 104us
  148. DJNZ  R6,$
  149. MOV  R5,#09H
  150. MOV  R0,#TEMPHEAD
  151. MOV  B,#00H
  152. READTEMP2: LCALL  READDS1820
  153. MOV  @R0,A
  154. INC  R0
  155. READTEMP21: LCALL  CRC8CAL
  156. DJNZ  R5,READTEMP2
  157. MOV  A,B
  158. JNZ  READTEMPOUT
  159. MOV  A,TEMPHEAD+0
  160. MOV  TEMPL,A
  161. MOV  A,TEMPHEAD+1
  162. MOV  TEMPH,A
  163. READTEMPOUT: RET
  164. ;================== 处理温度BCD码子程序==========================
  165. CONVTEMP: MOV  A,TEMPH
  166. ANL  A,#80H
  167. JZ   TEMPC1
  168. CLR  C
  169. MOV  A,TEMPL
  170. CPL  A
  171. ADD  A,#01H
  172. MOV  TEMPL,A
  173. MOV  A,TEMPH   ;-
  174. CPL  A
  175. ADDC  A,#00H
  176. MOV  TEMPH,A    ;TEMPHC HI=符号位
  177. MOV  TEMPHC,#0BH
  178. SJMP  TEMPC11
  179. TEMPC1: MOV  TEMPHC,#0AH  ;+
  180. TEMPC11: MOV  A,TEMPHC
  181. SWAP  A
  182. MOV  TEMPHC,A
  183. MOV  A,TEMPL
  184. ANL  A,#0FH     ;乘0.0625
  185. MOV  DPTR,#TEMPDOTTAB
  186. MOVC  A,@A+DPTR
  187. MOV  TEMPLC,A   ;TEMPLC LOW=小数部分BCD
  188. MOV  A,TEMPL     ;整数部分
  189. ANL  A,#0F0H
  190. SWAP  A
  191. MOV  TEMPL,A
  192. MOV  A,TEMPH
  193. ANL  A,#0FH
  194. SWAP  A
  195. ORL  A,TEMPL
  196. LCALL  HEX2BCD1
  197. MOV  TEMPL,A
  198. ANL  A,#0F0H
  199. SWAP  A
  200. ORL  A,TEMPHC    ;TEMPHC LOW=十位数BCD
  201. MOV  TEMPHC,A
  202. MOV  A,TEMPL
  203. ANL  A,#0FH
  204. SWAP  A          ;TEMPLC HI=个位数BCD
  205. ORL  A,TEMPLC
  206. MOV  TEMPLC,A
  207. MOV  A,R7
  208. JZ  TEMPC12
  209. ANL  A,#0FH
  210. SWAP  A
  211. MOV  R7,A
  212. MOV  A,TEMPHC    ;TEMPLC HI=百位数BCD
  213. ANL  A,#0FH
  214. ORL  A,R7
  215. MOV  TEMPHC,A
  216. TEMPC12: RET
  217. ;========================= 小数部分码表===========================
  218. TEMPDOTTAB: DB  00H,01H,01H,02H,03H,03H,04H,04H,05H,06H
  219. DB  06H,07H,08H,08H,09H,09H
  220. ;====================== 显示区BCD码温度值刷新子程序===============
  221. DISPBCD: MOV  A,TEMPLC
  222. ANL  A,#0FH
  223. MOV  70H,A
  224. MOV  A,TEMPLC
  225. SWAP  A
  226. ANL  A,#0FH
  227. MOV  71H,A
  228. MOV  A,TEMPHC
  229. ANL  A,#0FH
  230. MOV  72H,A
  231. MOV  A,TEMPHC
  232. SWAP A
  233. ANL  A,#0FH
  234. MOV  73H,A
  235. MOV  A,TEMPHC
  236. ANL  A,#0F0H
  237. CJNE  A,#010H,DISPBCD0
  238. SJMP  DISPBCD2
  239. DISPBCD0: MOV  A,TEMPHC
  240. ANL  A,#0FH
  241. JNZ  DISPBCD2 ;十位数是0
  242. MOV  A,TEMPHC
  243. SWAP  A
  244. ANL  A,#0FH
  245. MOV  73H,#0AH ;符号位不显示
  246. MOV  72H,A ;十位数显示符号
  247. DISPBCD2: RET
  248. ;======================= 显示子程序===============================
  249. ;显示数据在70H~73H单元内,用4位LED共阳数码管显示,P1口输出段码数据,
  250. ;P3口做扫描控制,每个LED数码管亮1ms时间再逐位循环。
  251. DISP1: MOV  R1,#70H ;指向显示数据首址
  252. MOV  R5,#0FEH ;扫描控制字初值
  253. PLAY: MOV  P0,#0FFH
  254. MOV  A,R5 ;扫描字放入A
  255. MOV  P3,A ;从P3口输出
  256. MOV  A,@R1 ;取显示数据到A
  257. MOV  DPTR,#TAB ;取段码表地址
  258. MOVC  A,@A+DPTR ;查显示数据对应段码
  259. MOV  P0,A ;段码放入P0口
  260. MOV  A,R5
  261. JB  ACC.1,LOOP5 ;小数点处理
  262. CLR  P0.7
  263. LOOP5: LCALL  DL1MS ;显示1ms
  264. INC  R1 ;指向下一地址
  265. MOV  A,R5 ;扫描控制字放入A
  266. JNB  ACC.3,ENDOUT ;ACC.3=0时一次显示结束
  267. RL  A ;A中数据循环左移
  268. MOV R5,A ;放回R5内
  269. AJMP  PLAY ;跳回PLAY循环
  270. ENDOUT: MOV  P0,#0FFH ;一次显示结束,P0口复位
  271. MOV  P3,#0FFH ;P3口复位
  272. RET ;子程序返回
  273. TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH,0BFH
  274. ;共阳段码表 “0”“1”“2”“3”“4”“5”“6”“7”“8”“9”“不亮”“-”
  275. DL1MS: MOV  R6,#14H ;1ms延时程序,LED显示程序用
  276. DL1: MOV  R7,#19H
  277. DL2: DJNZ  R7,DL2
  278. DJNZ  R6,DL1
  279. RET
  280. ;===================== 单字节十六进制转BCD =======================
  281. HEX2BCD1: MOV  B,#064H ;十六进制->BCD
  282. DIV  AB ;B=A%100
  283. MOV  R7,A ;R7=百位数
  284. MOV  A,#0AH
  285. XCH  A,B
  286. DIV  AB ;B=A%B
  287. SWAP  A
  288. ORL  A,B
  289. RET
  290. ;================================================================
  291. ;Calculate CRC-8Values.  Uses The CCITT-8Polynomial,Expressed As
  292. ;X^8+X^5+X^4+1
  293. ;================================================================
  294. CRC8CAL: PUSH  ACC
  295. MOV  R7,#08H ;Number Bits In Byte
  296. CRC8LOOP1: XRL  A,B ;Calculte CRC
  297. RRC  A ;Move To Carry
  298. MOV  A,B ;Get The Last CRC Value
  299. JNC  CRC8LOOP2 ;Skip If Data==0
  300. XRL  A,#18H ;Updata The New CRC
  301. CRC8LOOP2: RRC  A ;Position The New CRC
  302. MOV  B,A ;Store The New CRC
  303. POP  ACC ;Get The Remaining Bits
  304. RR  A ;Position The Next Bit
  305. PUSH  ACC ;Save The Remaining Bits
  306. DJNZ  R7,CRC8LOOP1 ;Repeat For 8 Bits
  307. POP  ACC
  308. RET
  309. END
复制代码


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

使用道具 举报

沙发
ID:89286 发表于 2017-10-1 01:19 | 只看该作者
thanks for sharing
回复

使用道具 举报

板凳
ID:559709 发表于 2019-6-11 10:25 | 只看该作者
楼主,我想问下,我仿真数码管一直闪烁,且跳不出正确的传感器数据,是什么原因
回复

使用道具 举报

地板
ID:652411 发表于 2020-6-5 15:10 来自手机 | 只看该作者
运行后一直这样

IMG_20200605_150956.jpg (1.22 MB, 下载次数: 26)

IMG_20200605_150956.jpg
回复

使用道具 举报

5#
ID:652411 发表于 2020-6-5 15:11 来自手机 | 只看该作者
gaogaoxingxing 发表于 2019-6-11 10:25
楼主,我想问下,我仿真数码管一直闪烁,且跳不出正确的传感器数据,是什么原因

你的问题解决了吗
回复

使用道具 举报

6#
ID:810487 发表于 2020-11-24 14:56 | 只看该作者

延时的时间太短了 可能是微秒的延时 可以改成毫秒的
回复

使用道具 举报

7#
ID:848431 发表于 2020-11-24 15:29 | 只看该作者
新手路过。这个是用什么软件的呢?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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