|
技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统 驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe |
[分享]数字温度计程序 |
作者:jaky 栏目:单片机 |
S1OK EQU 5FH TEMPUTER EQU 39H TEMPH EQU 5EH TEMPL EQU 5DH MS50 EQU 5CH SIGN EQU 5BH S1 BIT P1.0 S2 BIT P1.1 S3 BIT P1.2 S4 BIT P1.3 ORG 0000H LJMP MAIN ORG 000BH LJMP TOIT ORG 0030H MAIN: MOV SP, #60H MOV TMOD, #01H MOV TH0, #3CH MOV TL0, #0B0H SETB ET0 SETB TR0 SETB EA MOV TEMPH, #30 MOV TEMPL, #9 MOV TEMPUTER, #15 ;温度最始值 MOV S1OK, #00H MOV SIGN, #00H MOV 38H, #0BH MOV 37H, #0CH MOV 36H, #0BH ACALL DISP ACALL T1S ; ***************************************** ; 主程序 START: JB S1, NET1 ACALL T12MS JB S1, NET1 JNB S1, $ INC SIGN MOV A, SIGN CJNE A, #1, TIAO ACALL TIAOTL TIAO:CJNE A, #2, NET1 MOV SIGN, #0 ACALL TIAOTH ; ***************************************** NET1: MOV A, S1OK CJNE A, #1, START MOV A, TEMPUTER SUBB A, TEMPH JNB ACC.7, ALEM MOV A, TEMPUTER SUBB A, TEMPL JB ACC.7, ALEM SETB P2.1 ACALL WENDU ACALL DISP MOV S1OK, #00H AJMP START ALEM: MOV 36H, #0CH MOV 37H, #0CH MOV 38H, #0CH CLR P2.1 ACALL DISP ACALL T1S LCALL WENDU LCALL DISP MOV S1OK, #00H SJMP START ;***************************************** TIAOTL:MOV 50H, TEMPUTER MOV 37H, TEMPL ACALL BIN_BCD ACALL DISP ACALL T12MS ACALL T12MS ACALL T12MS ACALL T12MS MOV 36H, #0AH MOV 37H, #0AH MOV 38H, #0AH ACALL DISP ACALL T12MS ACALL T12MS ACALL T12MS ACALL T12MS JB S2, ADD1 ACALL T12MS JB S2, ADD1 JNB S2, $ INC TEMPL MOV A, TEMPL CJNE A, #100, ADD1 MOV TEMPL, #0 ADD1: JB S3, ADD2 ACALL T12MS JB S3, ADD2 JNB S3, $ DEC TEMPL MOV A, TEMPL CJNE A, #00 , ADD2 MOV TEMPL,#100 ADD2: JB S4, TIAOTL ACALL T12MS JB S4, TIAOTL JNB S4, $ MOV TEMPUTER, 50H LJMP START
|
2楼: | >>参与讨论 |
作者: jaky 于 2007/1/19 20:11:21 发布:
bsp; ACALL T12MS JB S4, TIAOTH JNB S4, $ MOV TEMPUTER, 50H LJMP START ; 一秒定时中段 ; ***************************************** TOIT: PUSH PSW PUSH ACC MOV TH0, #3CH MOV TL0, #0B0H INC MS50 MOV A, MS50 CJNE A, #14H, RETURN MOV S1OK, #1 MOV MS50, #00H RETURN:POP ACC POP PSW RETI ; ***************************************** ;温度总子程序 ; ***************************************** wendu: ACALL INIT_1820 ACALL RE_CONFIG ACALL GET_TEMPER ACALL TEMPER_COV RET ; ***************************************** ;DS18B20初始化程序 ; ***************************************** INIT_1820: SETB P2.0 NOP CLR P2.0 MOV R0,#06BH MOV R1,#03H TSR1: DJNZ R0,TSR1 ; 延时 MOV R0,#6BH DJNZ R1,TSR1 SETB P2.0 NOP NOP NOP MOV R0,#25H TSR2: JNB P2.0,TSR3 DJNZ R0,TSR2 LJMP TSR4 ; 延时 TSR3: SETB 20H.1 ; 置标志位,表示DS1820存在 LJMP TSR5 TSR4: CLR 20H.1 ; 清标志位,表示DS1820不存在 LJMP TSR7 TSR5: MOV R0,#06BH MOV R1,#03H TSR6:DJNZ R0,TSR6 ; 延时 MOV R0,#6BH DJNZ R1,TSR6 TSR7:SETB P2.0 RET ; ***************************************** ; 重新写DS18B20暂存存储器设定值 ; ***************************************** RE_CONFIG:JB 20H.1,RE_CONFIG1 ; 若DS18B20存在,转RE_CONFIG1 RET RE_CONFIG1: MOV A,#0CCH ; 发SKIP ROM命令 LCALL WRITE_1820 MOV A,#4EH ; 发写暂存存储器命令 LCALL WRITE_1820 MOV A,#00H ; TH(报警上限)中写入00H LCALL WRITE_1820 MOV A,#00H ; TL(报警下限)中写入00H LCALL WRITE_1820 MOV A,#1FH ; 选择9位温度分辨率 LCALL WRITE_1820 RET ; ***************************************** ; 读出转换后的温度值 ; ***************************************** GET_TEMPER: SETB P2.0 ; 定时入口 LCALL INIT_1820 JB 20H.1,TSS2 RET ; 若DS18B20不存在则返回 TSS2: MOV A,#0CCH ; 跳过ROM匹配 LCALL WRITE_1820 MOV A,#44H ; 发出温度转换命令 LCALL WRITE_1820 LCALL INIT_1820 MOV A,#0CCH ; 跳过ROM匹配 LCALL WRITE_1820 MOV A,#0BEH ; 发出读温度命令 LCALL WRITE_1820 LCALL READ_18200 MOV 37H,A ; 将读出的温度数据保存 RET ; ***************************************** ; 写DS18B20的程序 ; ***************************************** WRITE_1820: MOV R2,#8 CLR C WR1:CLR P2.0 NOP NOP NOP NOP RRC A MOV P2.0,C MOV R3,#35 DJNZ R3,$ SETB P2.0 NOP DJNZ R2,WR1 SETB P2.0 RET ; ***************************************** ; ***************************************** READ_18200: MOV R4,#2 ; 将温度高位和低位DS18B20中读 RE00:MOV R2,#8 RE01:CLR C SETB P2.0 NOP NOP CLR P2.0 NOP NOP NOP SETB P2.0 NOP NOP MOV C,P2.0 MOV R3,#35 RE20: DJNZ R3,RE20 RRC A DJNZ R2,RE01 MOV @R1,A DEC R1 DJNZ R4,RE00 RET ; ****************************** |
3楼: | >>参与讨论 |
作者: jaky 于 2007/1/19 20:12:12 发布:
; ***************************************** ; 将16进制的温度数据转换成压缩BCD码 ; 38H中放百位,37十位,36个位 ; ***************************************** BIN_BCD: MOV 39H,37H MOV A,37H MOV B,#100 DIV AB MOV 38H,A MOV 37H,B XCH A,B MOV B,#10 DIV AB MOV 37H,A MOV 36H,B RET DISP: SETB RS0 MOV R0, #36H MOV R7, #3 LOOPP:MOV A, @R0 MOV DPTR, #TAB MOVC A, @A+DPTR MOV SBUF, A JNB TI, $ CLR TI INC R0 DJNZ R7, LOOPP CLR RS0 RET TAB: DB 11H, 0D7H, 32H, 92H, 0D4H, 98H, 18H, 0D1H, 10H, 90H ,0FFH, 070H, 0FEH ; 延时子程序 T12MS: SETB RS1 MOV R7, #18H TM: MOV R6, #0FFH TM6: DJNZ R6, TM6 DJNZ R7, TM CLR RS1 RET ; 开机延时程序 T1S: SETB RS1 MOV R6, #3 LSP:ACALL T12MS DJNZ R6, LSP CLR RS1 RET END |
4楼: | >>参与讨论 |
作者: jaky 于 2007/1/19 20:13:57 发布:
不知道有没有错 |
5楼: | >>参与讨论 |
作者: 微蓝 于 2007/1/19 21:14:27 发布:
怎么没有硬件图的啊.......... |
6楼: | >>参与讨论 |
作者: godsky 于 2007/1/19 22:22:16 发布:
这个程序 我好像见到过 ^_^ |
7楼: | >>参与讨论 |
作者: zjh19831011 于 2007/1/25 15:41:47 发布:
这么多,干吗不用C写啊 |
8楼: | >>参与讨论 |
作者: luo5610 于 2007/3/30 12:03:27 发布:
楼住,能告诉我在这个程序中如何修改程序就可以把这个温度程序的测温范围扩大到1000度啊 |
9楼: | >>参与讨论 |
作者: zwt659 于 2007/3/31 17:42:26 发布:
楼主怎么没有上传硬件部分啊,这样看起来有点不太清楚 |
10楼: | >>参与讨论 |
作者: wujing198 于 2007/3/31 18:44:39 发布:
我刚才看见一个帖子在求温度控制,用这个程序改一下就可以实现温度控制,无非就是加一段控制程序,设计1、2个控制信号而已。其实资源多的是,就看自己会不会用。 |
11楼: | >>参与讨论 |
作者: wap 于 2008/10/3 14:18:40 发布:
C麻烦,不好写
|
|
|
免费注册为维库电子开发网会员,参与电子工程师社区讨论,点此进入 |
Copyright © 1998-2006 www.dzsc.com 浙ICP证030469号 |