⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 汇编程序.lt

📁 51单片机温度计
💻 LT
字号:
        		 1		;这是关于DS18B20的读写程序,数据脚P2.2,晶振12MHZ
        		 2		;温度传感器18B20汇编程序,采用器件默认的12位转化,最大转化时间750微秒
        		 3		;可以将检测到的温度直接显示到AT89C51开发实验板的两个数码管上
        		 4		;显示温度00到99度,很准确哦~~无需校正!
        	       	 5		ORG	0000H
        		 6		;单片机内存分配申明!
        	       	 7		TEMPER_L	EQU	29H	;用于保存读出温度的低8位
        	       	 8		TEMPER_H	EQU	28H	;用于保存读出温度的高8位
        	       	 9		FLAG1	EQU	38H	;是否检测到DS18B20标志位
        	       	 10		A_BIT	EQU	20H	;数码管个位数存放内存位置
        	       	 11		B_BIT	EQU	21H	;数码管十位数存放内存位置
  0000  12004B	 	 12	MAIN:	LCALL	GET_TEMPER	;调用读温度子程序
        		 13		;进行温度显示,这里我们考虑用网站提供的两位数码管来显示温度
        		 14		;显示范围00到99度,显示精度为1度
        		 15		;因为12位转化时每一位的精度为0.0625度,我们不要求显示小数所以可以抛弃29H的低4位
        		 16		;将28H中的低4位移入29H中的高4位,这样获得一个新字节,这个字节就是实际测量获得的温度
        		 17		;这个转化温度的方法可是我想出来的哦~~非常简洁无需乘于0.0625系数
  0003  E529	   	 18		MOV	A,29H
  0005  A240	   	 19		MOV	C,40H	;将28H中的最低位移入C
  0007  13	     	 20		RRC	A
  0008  A241	   	 21		MOV	C,41H
  000A  13	     	 22		RRC	A
  000B  A242	   	 23		MOV	C,42H
  000D  13	     	 24		RRC	A
  000E  A243	   	 25		MOV	C,43H
  0010  13	     	 26		RRC	A
  0011  F529	   	 27		MOV	29H,A
  0013  1200B4	 	 28		LCALL	DISPLAY	;调用数码管显示子程序
  0016  B290	   	 29		CPL	P1.0
  0018  0100	   	 30		AJMP	MAIN
        		 31		;这是DS18B20复位初始化子程序
  001A  D2A2	   	 32	INIT_1820:	SETB	P2.2
  001C  00	     	 33		NOP
  001D  C2A2	   	 34		CLR	P2.2
        		 35		;主机发出延时537微秒的复位低脉冲
  001F  7903	   	 36		MOV	R1,#3
  0021  786B	   	 37	TSR1:	MOV	R0,#107
  0023  D8FE	   	 38		DJNZ	R0,$
  0025  D9FA	   	 39		DJNZ	R1,TSR1
  0027  D2A2	   	 40		SETB	P2.2	;然后拉高数据线
  0029  00	     	 41		NOP
  002A  00	     	 42		NOP
  002B  00	     	 43		NOP
  002C  7825	   	 44		MOV	R0,#25H
  002E  30A205	 	 45	TSR2:	JNB	P2.2,TSR3	;等待DS18B20回应
  0031  D8FB	   	 46		DJNZ	R0,TSR2
  0033  02003D	 	 47		LJMP	TSR4	;延时
  0036  D238	   	 48	TSR3:	SETB	FLAG1	;置标志位,表示DS1820存在
  0038  C297	   	 49		CLR	P1.7	;检查到DS18B20就点亮P1.7LED
  003A  020044	 	 50		LJMP	TSR5
  003D  C238	   	 51	TSR4:	CLR	FLAG1	;清标志位,表示DS1820不存在
  003F  C291	   	 52		CLR	P1.1
  0041  020048	 	 53		LJMP	TSR7
  0044  7875	   	 54	TSR5:	MOV	R0,#117
  0046  D8FE	   	 55	TSR6:	DJNZ	R0,TSR6	;时序要求延时一段时间
  0048  D2A2	   	 56	TSR7:	SETB	P2.2
  004A  22	     	 57		RET
        		 58		;读出转换后的温度值
  004B  D2A2	   	 59	GET_TEMPER:	SETB	P2.2
  004D  12001A	 	 60		LCALL	INIT_1820	;先复位DS18B20
  0050  203803	 	 61		JB	FLAG1,TSS2
  0053  C292	   	 62		CLR	P1.2
  0055  22	     	 63		RET	;判断DS1820是否存在?若DS18B20不存在则返回
  0056  C293	   	 64	TSS2:	CLR	P1.3	;DS18B20已经被检测到!!!!!!!!!!!!!!!!!!
  0058  74CC	   	 65		MOV	A,#0CCH	;跳过ROM匹配
  005A  120078	 	 66		LCALL	WRITE_1820
  005D  7444	   	 67		MOV	A,#44H	;发出温度转换命令
  005F  120078	 	 68		LCALL	WRITE_1820
        		 69		;这里通过调用显示子程序实现延时一段时间,等待AD转换结束,12位的话750微秒
  0062  1200B4	 	 70		LCALL	DISPLAY
  0065  12001A	 	 71		LCALL	INIT_1820	;准备读温度前先复位
  0068  74CC	   	 72		MOV	A,#0CCH	;跳过ROM匹配
  006A  120078	 	 73		LCALL	WRITE_1820
  006D  74BE	   	 74		MOV	A,#0BEH	;发出读温度命令
  006F  120078	 	 75		LCALL	WRITE_1820
  0072  120090	 	 76		LCALL	READ_18200	;将读出的温度数据保存到35H/36H
  0075  C294	   	 77		CLR	P1.4
  0077  22	     	 78		RET
        		 79		;写DS18B20的子程序(有具体的时序要求)
  0078  7A08	   	 80	WRITE_1820:	MOV	R2,#8	;一共8位数据
  007A  C3	     	 81		CLR	C
  007B  C2A2	   	 82	WR1:	CLR	P2.2
  007D  7B06	   	 83		MOV	R3,#6
  007F  DBFE	   	 84		DJNZ	R3,$
  0081  13	     	 85		RRC	A
  0082  92A2	   	 86		MOV	P2.2,C
  0084  7B17	   	 87		MOV	R3,#23
  0086  DBFE	   	 88		DJNZ	R3,$
  0088  D2A2	   	 89		SETB	P2.2
  008A  00	     	 90		NOP
  008B  DAEE	   	 91		DJNZ	R2,WR1
  008D  D2A2	   	 92		SETB	P2.2
  008F  22	     	 93		RET
        		 94		;读DS18B20的程序,从DS18B20中读出两个字节的温度数据
  0090  7C02	   	 95	READ_18200:	MOV	R4,#2	;将温度高位和低位从DS18B20中读出
  0092  7929	   	 96		MOV	R1,#29H	;低位存入29H(TEMPER_L),高位存入28H(TEMPER_H)
  0094  7A08	   	 97	RE00:	MOV	R2,#8	;数据一共有8位
  0096  C3	     	 98	RE01:	CLR	C
  0097  D2A2	   	 99		SETB	P2.2
  0099  00	     	 100		NOP
  009A  00	     	 101		NOP
  009B  C2A2	   	 102		CLR	P2.2
  009D  00	     	 103		NOP
  009E  00	     	 104		NOP
  009F  00	     	 105		NOP
  00A0  D2A2	   	 106		SETB	P2.2
  00A2  7B09	   	 107		MOV	R3,#9
  00A4  DBFE	   	 108	RE10:	DJNZ	R3,RE10
  00A6  A2A2	   	 109		MOV	C,P2.2
  00A8  7B17	   	 110		MOV	R3,#23
  00AA  DBFE	   	 111	RE20:	DJNZ	R3,RE20
  00AC  13	     	 112		RRC	A
  00AD  DAE7	   	 113		DJNZ	R2,RE01
  00AF  F7	     	 114		MOV	@R1,A
  00B0  19	     	 115		DEC	R1
  00B1  DCE1	   	 116		DJNZ	R4,RE00
  00B3  22	     	 117		RET
        		 118		;显示子程序
  00B4  E529	   	 119	DISPLAY:	MOV	A,29H	;将29H中的十六进制数转换成10进制
  00B6  75F00A	 	 120		MOV	B,#10	;10进制/10=10进制
  00B9  84	     	 121		DIV	AB
  00BA  F521	   	 122		MOV	B_BIT,A	;十位在A
  00BC  85F020	 	 123		MOV	A_BIT,B	;个位在B
  00BF  9000E6	 	 124		MOV	DPTR,#NUMTAB	;指定查表启始地址
  00C2  7804	   	 125		MOV	R0,#4
  00C4  79FA	   	 126	DPL1:	MOV	R1,#250	;显示1000次
  00C6  E520	   	 127	DPLOP:	MOV	A,A_BIT	;取个位数
  00C8  93	     	 128		MOVC	A,@A+DPTR	;查个位数的7段代码
  00C9  F580	   	 129		MOV	P0,A	;送出个位的7段代码
  00CB  C2A7	   	 130		CLR	P2.7	;开个位显示
  00CD  11E1	   	 131		ACALL	D1MS	;显示1MS
  00CF  D2A7	   	 132		SETB	P2.7
  00D1  E521	   	 133		MOV	A,B_BIT	;取十位数
  00D3  93	     	 134		MOVC	A,@A+DPTR	;查十位数的7段代码
  00D4  F580	   	 135		MOV	P0,A	;送出十位的7段代码
  00D6  C2A6	   	 136		CLR	P2.6	;开十位显示
  00D8  11E1	   	 137		ACALL	D1MS	;显示1MS
  00DA  D2A6	   	 138		SETB	P2.6
  00DC  D9E8	   	 139		DJNZ	R1,DPLOP	;100次没完循环
  00DE  D8E4	   	 140		DJNZ	R0,DPL1	;4个100次没完循环
  00E0  22	     	 141		RET
        		 142		;1MS延时(按12MHZ算)
  00E1  7F50	   	 143	D1MS:	MOV	R7,#80
  00E3  DFFE	   	 144		DJNZ	R7,$
  00E5  22	     	 145		RET
        		 146		;实验板上的7段数码管0~9数字的共阴显示代码
  00E6  CF035D5B	 147	NUMTAB:	DB	0CFH,03H,5DH,5BH,93H,0DAH,0DEH,43H,0DFH,0DBH
  00EA  93DADE43
  00EE  DFDB    
        		       	 148		END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -