找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6392|回復(fù): 6
收起左側(cè)

單片機(jī)匯編語言數(shù)字溫度計設(shè)計

[復(fù)制鏈接]
ID:236558 發(fā)表于 2017-9-29 13:38 | 顯示全部樓層 |閱讀模式
設(shè)計要求:
數(shù)字溫度計
設(shè)計一個具有特定功能的數(shù)字溫度計。該數(shù)字溫度計上電或按鍵復(fù)位后能自動顯示系統(tǒng)提示符“P.”,進(jìn)入準(zhǔn)備工作狀態(tài)。測量溫度范圍0℃~99℃,測量精度小數(shù)點(diǎn)后兩位,可以通過開始和結(jié)束鍵控制數(shù)字溫度計的工作狀態(tài)。
下面是我的仿真圖和匯編程序,但是我的程序只能精確到小數(shù)點(diǎn)后一位(0.1),而且不能顯示系統(tǒng)提示符“P.”
程序如下:



2342238ranx8ypynlrnyvy.png

234225i6vmg7huykrp7z3g.png

2342268qj2jgvoy32dk2kd.png

23422642d322rs2gf93fnd.png

  1. ;================================================================
  2. ;DS18B20溫度計
  3. ;采用4位LED共陽顯示器顯示測溫值,顯示精度0.1℃,測溫范圍-55~+125℃
  4. ;用AT89C51單片機(jī),12MHz晶振
  5. ;============================常數(shù)定義=============================
  6. TIMEL EQU  0E0H         ;20ms,定時器0時間常數(shù)
  7. TIMEH EQU  0B1H
  8. TEMPHEAD   EQU  36H
  9. ;==========================工作內(nèi)存定義============================
  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. ;============================= 中斷向量區(qū)=========================
  20. ORG     0000H
  21. LJMP    START
  22. ORG    00BH
  23. LJMP    T0IT
  24. ;=============================系統(tǒng)初始化==========================
  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中斷服務(wù)程序=======================
  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定時到標(biāo)志
  55. T0IT1: POP  PSW
  56. RETI
  57. ;============================= 主程序=============================
  58. MAIN: LCALL  DISP1   ;調(diào)用顯示子程序
  59. JNB  TIME1SOK,MAIN
  60. CLR  TIME1SOK  ;測溫每1s一次
  61. JNB  TEMPONEOK,MAIN2 ;上電時先溫度轉(zhuǎn)換一次
  62. LCALL  READTEMP1 ;讀出溫度值子程序
  63. LCALL  CONVTEMP  ;溫度BCD碼計算處理子程序
  64. LCALL  DISPBCD   ;顯示區(qū)BCD碼溫度值刷新子程序
  65. LCALL  DISP1      ;消閃爍,顯示一次
  66. MAIN2:  LCALL READTEMP   ;溫度轉(zhuǎn)換開始
  67. SETB  TEMPONEOK
  68. LJMP  MAIN
  69. ;============================= 子程序區(qū)===========================
  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中讀出一個字節(jié)的數(shù)據(jù)=============
  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中寫一個字節(jié)的數(shù)據(jù)=============
  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=小數(shù)部分BCD
  188. MOV  A,TEMPL     ;整數(shù)部分
  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=十位數(shù)BCD
  201. MOV  TEMPHC,A
  202. MOV  A,TEMPL
  203. ANL  A,#0FH
  204. SWAP  A          ;TEMPLC HI=個位數(shù)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=百位數(shù)BCD
  213. ANL  A,#0FH
  214. ORL  A,R7
  215. MOV  TEMPHC,A
  216. TEMPC12: RET
  217. ;========================= 小數(shù)部分碼表===========================
  218. TEMPDOTTAB: DB  00H,01H,01H,02H,03H,03H,04H,04H,05H,06H
  219. DB  06H,07H,08H,08H,09H,09H
  220. ;====================== 顯示區(qū)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 ;十位數(shù)是0
  242. MOV  A,TEMPHC
  243. SWAP  A
  244. ANL  A,#0FH
  245. MOV  73H,#0AH ;符號位不顯示
  246. MOV  72H,A ;十位數(shù)顯示符號
  247. DISPBCD2: RET
  248. ;======================= 顯示子程序===============================
  249. ;顯示數(shù)據(jù)在70H~73H單元內(nèi),用4位LED共陽數(shù)碼管顯示,P1口輸出段碼數(shù)據(jù),
  250. ;P3口做掃描控制,每個LED數(shù)碼管亮1ms時間再逐位循環(huán)。
  251. DISP1: MOV  R1,#70H ;指向顯示數(shù)據(jù)首址
  252. MOV  R5,#0FEH ;掃描控制字初值
  253. PLAY: MOV  P0,#0FFH
  254. MOV  A,R5 ;掃描字放入A
  255. MOV  P3,A ;從P3口輸出
  256. MOV  A,@R1 ;取顯示數(shù)據(jù)到A
  257. MOV  DPTR,#TAB ;取段碼表地址
  258. MOVC  A,@A+DPTR ;查顯示數(shù)據(jù)對應(yīng)段碼
  259. MOV  P0,A ;段碼放入P0口
  260. MOV  A,R5
  261. JB  ACC.1,LOOP5 ;小數(shù)點(diǎn)處理
  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時一次顯示結(jié)束
  267. RL  A ;A中數(shù)據(jù)循環(huán)左移
  268. MOV R5,A ;放回R5內(nèi)
  269. AJMP  PLAY ;跳回PLAY循環(huán)
  270. ENDOUT: MOV  P0,#0FFH ;一次顯示結(jié)束,P0口復(fù)位
  271. MOV  P3,#0FFH ;P3口復(fù)位
  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. ;===================== 單字節(jié)十六進(jìn)制轉(zhuǎn)BCD =======================
  281. HEX2BCD1: MOV  B,#064H ;十六進(jìn)制->BCD
  282. DIV  AB ;B=A%100
  283. MOV  R7,A ;R7=百位數(shù)
  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
復(fù)制代碼


回復(fù)

使用道具 舉報

ID:89286 發(fā)表于 2017-10-1 01:19 | 顯示全部樓層
thanks for sharing
回復(fù)

使用道具 舉報

ID:559709 發(fā)表于 2019-6-11 10:25 | 顯示全部樓層
樓主,我想問下,我仿真數(shù)碼管一直閃爍,且跳不出正確的傳感器數(shù)據(jù),是什么原因
回復(fù)

使用道具 舉報

ID:652411 發(fā)表于 2020-6-5 15:10 來自手機(jī) | 顯示全部樓層
運(yùn)行后一直這樣
IMG_20200605_150956.jpg
回復(fù)

使用道具 舉報

ID:652411 發(fā)表于 2020-6-5 15:11 來自手機(jī) | 顯示全部樓層
gaogaoxingxing 發(fā)表于 2019-6-11 10:25
樓主,我想問下,我仿真數(shù)碼管一直閃爍,且跳不出正確的傳感器數(shù)據(jù),是什么原因

你的問題解決了嗎
回復(fù)

使用道具 舉報

ID:810487 發(fā)表于 2020-11-24 14:56 | 顯示全部樓層
1234568765 發(fā)表于 2020-6-5 15:10
運(yùn)行后一直這樣

延時的時間太短了 可能是微秒的延時 可以改成毫秒的
回復(fù)

使用道具 舉報

ID:848431 發(fā)表于 2020-11-24 15:29 | 顯示全部樓層
新手路過。這個是用什么軟件的呢?
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表