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

📄 ds18b20.src

📁 使用PROTEUS仿真的智能温度计,使用DS18B20测温,C编写
💻 SRC
📖 第 1 页 / 共 2 页
字号:
			; SOURCE LINE # 84
?C0009:
; 	while(i--);
			; SOURCE LINE # 85
	MOV  	A,R7
	DEC  	R7
	MOV  	R4,AR6
	JNZ  	?C0027
	DEC  	R6
?C0027:
	ORL  	A,R4
	JNZ  	?C0009
; }
			; SOURCE LINE # 86
?C0011:
	RET  	
; END OF _delay_18B20

; 
; 
; /*DS18B20的复位脉冲 主机通过拉低单总线至少480us以产生复位脉冲
;   然后主机释放单总线并进入接收模式 此时单总线电平被拉高
;   DS18B20检测到上升沿后 延时15~60us,拉低总线60~240us产生应答脉冲  */						
; void Init_DS18B20(void) 

	RSEG  ?PR?Init_DS18B20?DS18B20
Init_DS18B20:
	USING	0
			; SOURCE LINE # 92
; {
			; SOURCE LINE # 93
; 	 unsigned char x=0;
			; SOURCE LINE # 94
;---- Variable 'x?546' assigned to Register 'R5' ----
	CLR  	A
	MOV  	R5,A
; 	 DQ = 1;          //DQ复位
			; SOURCE LINE # 95
	SETB 	DQ
; 	 delay_18B20(8);  //稍做延时
			; SOURCE LINE # 96
	MOV  	R7,#08H
	MOV  	R6,A
	LCALL	_delay_18B20
; 	 DQ = 0;          //单片机将DQ拉低
			; SOURCE LINE # 97
	CLR  	DQ
; 	 delay_18B20(80); //精确延时 大于 480us
			; SOURCE LINE # 98
	MOV  	R7,#050H
	MOV  	R6,#00H
	LCALL	_delay_18B20
; 	 DQ = 1;          //拉高总线
			; SOURCE LINE # 99
	SETB 	DQ
; 	 delay_18B20(14);
			; SOURCE LINE # 100
	MOV  	R7,#0EH
	MOV  	R6,#00H
	LCALL	_delay_18B20
; 	 x=DQ;            //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
			; SOURCE LINE # 101
	MOV  	C,DQ
	CLR  	A
	RLC  	A
	MOV  	R5,A
; 	 delay_18B20(20);
			; SOURCE LINE # 102
	MOV  	R7,#014H
	MOV  	R6,#00H
	LJMP 	_delay_18B20
; END OF Init_DS18B20

; }
; 
; /*写时隙 主机在写1时隙向DS18B20写入1,在写0时隙向DS18B20写入0
;   所有写时隙至少需要60us,且在两次写时隙之间至少需要1us的恢复时间
;   两种写时隙均以主机拉低总线开始
;   产生写1时隙:主机拉低总线后,必须在15us内释放总线,由上拉电阻拉回至高电平
;   产生写0时隙:主机拉低总线后,必须整个时隙保持低电平 */
; void WriteOneChar(unsigned char dat)

	RSEG  ?PR?_WriteOneChar?DS18B20
_WriteOneChar:
	USING	0
			; SOURCE LINE # 110
;---- Variable 'dat?647' assigned to Register 'R5' ----
	MOV  	R5,AR7
; {
			; SOURCE LINE # 111
;  	unsigned char i=0;
			; SOURCE LINE # 112
;---- Variable 'i?648' assigned to Register 'R3' ----
;  	for (i=8; i>0; i--)
			; SOURCE LINE # 113
	MOV  	R3,#08H
?C0013:
;  	{
			; SOURCE LINE # 114
;   		DQ = 0;
			; SOURCE LINE # 115
	CLR  	DQ
;  		DQ = dat&0x01;
			; SOURCE LINE # 116
	MOV  	A,R5
	RRC  	A
	MOV  	DQ,C
;     	delay_18B20(5);
			; SOURCE LINE # 117
	MOV  	R7,#05H
	MOV  	R6,#00H
	LCALL	_delay_18B20
;  		DQ = 1;
			; SOURCE LINE # 118
	SETB 	DQ
;     	dat>>=1;
			; SOURCE LINE # 119
	MOV  	A,R5
	CLR  	C
	RRC  	A
	MOV  	R5,A
;  }
			; SOURCE LINE # 120
	DJNZ 	R3,?C0013
; }
			; SOURCE LINE # 121
?C0016:
	RET  	
; END OF _WriteOneChar

;   
; /*所有读时隙至少60us 且两次独立的读时隙之间至少需要1us的恢复时间
;   每次读时隙由主机发起,拉低总线至少1us。
;   若传1,则保持总线高电平;若发送0,则拉低总线
;   传0时DS18B20在该时隙结束时释放总线,再拉回高电平状态,主机必须在读时隙开始后的15us内释放总线,并保持采样总线状态 */
; unsigned char ReadOneChar(void)

	RSEG  ?PR?ReadOneChar?DS18B20
ReadOneChar:
	USING	0
			; SOURCE LINE # 127
; {
			; SOURCE LINE # 128
; 	unsigned char i=0;
			; SOURCE LINE # 129
;---- Variable 'i?749' assigned to Register 'R5' ----
	CLR  	A
; 	unsigned char dat = 0;
			; SOURCE LINE # 130
;---- Variable 'dat?750' assigned to Register 'R3' ----
	MOV  	R3,A
; 	for (i=8;i>0;i--)
			; SOURCE LINE # 131
	MOV  	R5,#08H
?C0017:
; 	 {
			; SOURCE LINE # 132
; 		  DQ = 0; // 给脉冲信号
			; SOURCE LINE # 133
	CLR  	DQ
; 		  dat>>=1;
			; SOURCE LINE # 134
	MOV  	A,R3
	CLR  	C
	RRC  	A
	MOV  	R3,A
; 		  DQ = 1; // 给脉冲信号
			; SOURCE LINE # 135
	SETB 	DQ
; 		  if(DQ)
			; SOURCE LINE # 136
	JNB  	DQ,?C0020
; 		  dat|=0x80;
			; SOURCE LINE # 137
	ORL  	AR3,#080H
?C0020:
; 		  delay_18B20(4);
			; SOURCE LINE # 138
	MOV  	R7,#04H
	MOV  	R6,#00H
	LCALL	_delay_18B20
; 	 }
			; SOURCE LINE # 139
	DJNZ 	R5,?C0017
?C0018:
;  	return(dat);
			; SOURCE LINE # 140
	MOV  	R7,AR3
; }
			; SOURCE LINE # 141
?C0021:
	RET  	
; END OF ReadOneChar

; 		 
; 
; void read_18B20(void)

	RSEG  ?PR?read_18B20?DS18B20
read_18B20:
	USING	0
			; SOURCE LINE # 144
; {
			; SOURCE LINE # 145
; 
; 	Init_DS18B20();
			; SOURCE LINE # 147
	LCALL	Init_DS18B20
; 	WriteOneChar(0xCC);    	// 跳过读序号列号的操作
			; SOURCE LINE # 148
	MOV  	R7,#0CCH
	LCALL	_WriteOneChar
; 	WriteOneChar(0x44); 	// 启动温度转换
			; SOURCE LINE # 149
	MOV  	R7,#044H
; 
; 	delay_18B20(100);       // this message is wery important
			; SOURCE LINE # 151
	LCALL	L?0029
; 
; 	Init_DS18B20();
			; SOURCE LINE # 153
	LCALL	Init_DS18B20
; 	WriteOneChar(0xCC); 	//跳过读序号列号的操作
			; SOURCE LINE # 154
	MOV  	R7,#0CCH
	LCALL	_WriteOneChar
; 	WriteOneChar(0xBE); 	//读取温度寄存器等(共可读9个寄存器) 前两个就是温度
			; SOURCE LINE # 155
	MOV  	R7,#0BEH
; 
; 	delay_18B20(100);
			; SOURCE LINE # 157
	LCALL	L?0029
; 
; 	L_18B20=ReadOneChar();	//读取低八位数据
			; SOURCE LINE # 159
	LCALL	ReadOneChar
	MOV  	L_18B20,R7
; 	H_18B20=ReadOneChar();	//读取高八位数据
			; SOURCE LINE # 160
	LCALL	ReadOneChar
	MOV  	H_18B20,R7
; 
; 	zhengshu=L_18B20/16+H_18B20*16; //整数部分
			; SOURCE LINE # 162
	MOV  	A,L_18B20
	SWAP 	A
	ANL  	A,#0FH
	MOV  	R5,A
	MOV  	R4,#00H
	MOV  	A,R7
	MOV  	B,#010H
	MUL  	AB
	MOV  	R6,B
	ADD  	A,R5
	MOV  	zhengshu+01H,A
	MOV  	A,R4
	ADDC 	A,R6
	MOV  	zhengshu,A
; 	xiaoshu_a=(L_18B20&0x0f)*10/16; //小数第一位
			; SOURCE LINE # 163
	MOV  	A,L_18B20
	ANL  	A,#0FH
	MOV  	B,#0AH
	MUL  	AB
	MOV  	R7,A
	MOV  	A,B
	SWAP 	A
	MOV  	R0,A
	ANL  	A,#0F0H
	XCH  	A,R0
	XRL  	A,R0
	MOV  	xiaoshu_a,A
	MOV  	A,R7
	SWAP 	A
	ANL  	A,#0FH
	ORL  	A,R0
	MOV  	xiaoshu_a+01H,A
; }
			; SOURCE LINE # 164
	RET  	
; END OF read_18B20

; 
; 
; /*------MAIN------*/
; void main(void)

	RSEG  ?PR?main?DS18B20
main:
	USING	0
			; SOURCE LINE # 168
; {
			; SOURCE LINE # 169
;    write_command(56);
			; SOURCE LINE # 170
	MOV  	R7,#038H
	MOV  	R6,#00H
	LCALL	_write_command
;    write_command(12);
			; SOURCE LINE # 171
	MOV  	R7,#0CH
	LCALL	_write_command
;    write_command(6);
			; SOURCE LINE # 172
	MOV  	R7,#06H
	LCALL	_write_command
;    write_command(1);
			; SOURCE LINE # 173
	MOV  	R7,#01H
	LCALL	_write_command
;    write_command(2);
			; SOURCE LINE # 174
	INC  	R7
	LCALL	_write_command
;    display_string(1,0," Temprature:");
			; SOURCE LINE # 175
	MOV  	R3,#0FFH
	MOV  	R2,#HIGH (?SC_0)
	MOV  	R1,#LOW (?SC_0)
	CLR  	A
	MOV  	R5,A
	MOV  	R4,A
	DEC  	R7
	LCALL	_display_string
?C0025:
;    do{read_18B20();
			; SOURCE LINE # 176
	LCALL	read_18B20
;    write_command(192);
			; SOURCE LINE # 177
	MOV  	R7,#0C0H
	MOV  	R6,#00H
	LCALL	_write_command
;    write_data((0x30|(zhengshu/10)));
			; SOURCE LINE # 178
	MOV  	R6,zhengshu
	MOV  	R7,zhengshu+01H
	MOV  	R4,#00H
	MOV  	R5,#0AH
	LCALL	?C?UIDIV
	LCALL	L?0030
;    write_data((0x30|(zhengshu-(zhengshu/10)*10)));
			; SOURCE LINE # 179
	MOV  	R6,zhengshu
	MOV  	R7,zhengshu+01H
	MOV  	R4,#00H
	MOV  	R5,#0AH
	LCALL	?C?UIDIV
	MOV  	R4,#00H
	MOV  	R5,#0AH
	LCALL	?C?IMUL
	CLR  	C
	MOV  	A,zhengshu+01H
	SUBB 	A,R7
	MOV  	R7,A
	MOV  	A,zhengshu
	SUBB 	A,R6
	MOV  	R6,A
	LCALL	L?0030
;    write_data(0x2e);
			; SOURCE LINE # 180
	MOV  	R7,#02EH
	MOV  	R6,#00H
	LCALL	_write_data
;    write_data(0x30|xiaoshu_a);
			; SOURCE LINE # 181
	MOV  	R6,xiaoshu_a
	MOV  	A,xiaoshu_a+01H
	ORL  	A,#030H
	MOV  	R7,A
	LCALL	_write_data
;    }
			; SOURCE LINE # 182
;    while(1);
			; SOURCE LINE # 183
	SJMP 	?C0025
; END OF main

	END

⌨️ 快捷键说明

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