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

📄 mcu.asm

📁 proteus实例集锦
💻 ASM
📖 第 1 页 / 共 5 页
字号:
		cjne	a,#30h,FUNCTION2_3	;如果原来的次高位也是零,继续灭掉。
						;因为本电路要求待测电阻小于999R,那
						;么最多灭两个零就够了。
		mov	a,RESULT2		;
		mov	RESULT1,a		;
		mov	a,RESULT3		;
		mov	RESULT2,a		;
		mov	a,RESULT4		;
		mov	RESULT3,a		;
FUNCTION2_3:	mov 	a,#LCD_CLS		;清屏。
		call 	WRCMD			;
		call	WRRESULT		;调用写结果字符串子程序。
		jmp	FUNCTION2_1		;
;;;;;;;;;;;;;;;;测量电阻功能子程序结束;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;;;;;;;;;;;;;;;DS18B20子程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;>>>>>>>>>>>>>>>资源占用报告>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;>>>>>>>>>>>>>>>临时占用a,b,c,dptr,bank0区r2~r6
;>>>>>>>>>>>>>>>报告完毕>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
FUNCTION3:	mov	a,RETURNFLAG		;检查返回标志,决定是否返回。
		jz	FUNCTION3_CON		;
		jmp	main			;
FUNCTION3_CON:	call	GET_TEMPERATURE		;
		mov	r2,#04h			;为简化程序编写,温度精确到“度”。
FUNCTION3_1:	clr	c			;DS18B20HIGH,DS18B20LOW联合左移位
						;4次将温度值全部移入DS18B20HIGH,
						;最高bit为符号位,补码格式。
		mov	a,DS18B20LOW		;
		rlc	a			;
		mov	DS18B20LOW,a		;
		mov	a,DS18B20HIGH		;
		rlc	a			;
		mov	DS18B20HIGH,a		;
		djnz	r2,FUNCTION3_1		;
		mov	r2,#00h			;
		mov	a,DS18B20HIGH		;
		jnb	acc.7,FUNCTION3_2	;如果温度是负值,求反加1。
		mov	r2,#0FFh		;设定负值比标志。
		cpl	a			;
		inc	a			;
FUNCTION3_2:	mov	b,#0Ah			;以下显示数据
		div	ab			;
		mov	r6,b			;
		mov	b,#0Ah			;
		div	ab			;
		mov	r4,a			;
		mov	r5,b			;
		mov	a,r6			;最低位。
		mov	dptr,#LCD0		;
		movc	a,@a+dptr		;
		mov	RESULT4,a		;
		mov	a,r5			;次低位。
		movc	a,@a+dptr		;
		mov	RESULT3,a		;
		mov	a,r4			;最高位。
		movc	a,@a+dptr		;
		mov	RESULT2,a		;
		mov	a,#12h			;℃符号。
		movc	a,@a+dptr		;
		mov	RESULT5,a		;
		mov	a,#00h			;
		mov	RESULT6,a		;
		mov	a,r2			;
		jz	FUNCTION3_3		;
		mov	a,#13h			;-符号。
		movc	a,@a+dptr		;
		mov	RESULT1,a		;
		jmp	FUNCTION3_4		;
FUNCTION3_3:	mov	a,#14h			;+符号。
		movc	a,@a+dptr		;
		mov	RESULT1,a		;
FUNCTION3_4:	mov	a,#LCD_CLS		;
		call 	WRCMD			;
		call	WRRESULT		;
		mov	r4,#010h		;这部分程序有两个作用。
D15:		mov	r5,#0FFh		;1:设定2次温度采集的间隔。
D16:		mov	r6,#0FFh		;2:如果要返回主菜单,请在LCD
						;显示结果后约2秒内按下键盘任意
						;键。(约2秒是这里设定的时间)
D17:		djnz	r6,D17			;
		djnz	r5,D17			;
		djnz	r4,D17			;
		jmp	FUNCTION3		;
;;;;;;;;;;;;;;;;DS18B20子程序结束;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;;;;;;;;;;;;;;;一组DS18B20操作子程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;===============读取温度子程序==================================================================
;>>>>>>>>>>>>>>>资源占用报告>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;>>>>>>>>>>>>>>>临时占用a
;>>>>>>>>>>>>>>>报告完毕>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
GET_TEMPERATURE:clr 	EA 			;使用DS18B20一定要禁止任何
						;中断产生。 
		call 	INITDS18B20		;调用初使化DS18B20子程序。
		mov 	a,#0CCH 		;
		call	WRITEDS18B20 		;送入跳过ROM命令。 
		mov	a,#44H			; 
		call 	WRITEDS18B20 		;送入温度转换命令。 
		call	INITDS18B20		;温度转换完全,再次初使化
						;DS18B20。
		mov	a,#0CCH 		;
		call 	WRITEDS18B20		;送入跳过ROM命令。
		mov	a,#0BEH			;
		call 	WRITEDS18B20		;送入读温度暂存器命令。
		call	READDS18B20		;
		mov	DS18B20LOW,a 		;读出温度值低字节存入DS18B20LOW。
		call	READDS18B20		;
		mov	DS18B20HIGH,a		;读出谩度值高字节存入DS18B20HIGH。
		setb	EA 			;开启中断。
		ret				; 
;===============读取温度子程序结束==============================================================

;===============初始化DS18B20子程序=============================================================
;>>>>>>>>>>>>>>>资源占用报告>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;>>>>>>>>>>>>>>>临时占用bank0区r6,r7
;>>>>>>>>>>>>>>>报告完毕>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
INITDS18B20: 	clr 	EA			;
L0:		clr	p3.4 			;置DS18B20总线低复位状态。
		mov	r7,#0C8h		;
L1:		clr	p3.4			;
		djnz	r7,L1 			;总线复位电平保持400us。
		setb	p3.4 			;释放DS18B20总线。
		mov	r7,#1Eh			; 
L4:		djnz	r7,L4 			;释放DS18B20总线状态,保持
						;60us。
		clr	c			;清存在信号。
		orl	c,p3.4			;
		jc	L0 			;存在吗?不存在则重新来。
		mov	r6,#50h			;
L5:		orl 	c,p3.4 			;存在脉冲之后,要变为高电平。
		jc 	L3			;否则DS18B20出现异常错误,要
		djnz	r6,L5			;重新初始化。详细时序请参考
		jmp 	L0 			;技术文档。
L3:		mov	r7,#0F0h		; 
L2:		djnz	r7,L2 			;
		ret
;===============初始化DS18B20子程序结束=========================================================

;===============写DS18B20子程序=================================================================
;>>>>>>>>>>>>>>>资源占用报告>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;>>>>>>>>>>>>>>>临时占用a,bank0区r3,r4
;>>>>>>>>>>>>>>>报告完毕>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
WRITEDS18B20:	clr	EA			;
		mov	r3,#08h			;写入DS18B20的bit数。
WR1:		setb	p3.4  			;
		mov	r4,#08h			; 
		rrc 	a			;把一个字节分成8个bit移入C。
		clr	p3.4 			;开始写入DS18B20,总线要处于
						;低复位状态 。
WR2:		djnz 	r4,WR2 			;DS18B20总线复位保持16us。
		mov 	p3.4,c 			;写入一个bit。
		mov	r4,#14h			;
WR3:		djnz	r4,WR3 			;等待40us
		djnz	r3,WR1 			;写入下一个bit 。
		setb	p3.4 			;重新释放DS18B20总线 。
		ret				;
;===============写DS18B20子程序结束=============================================================

;===============读DS18B20子程序=================================================================
;>>>>>>>>>>>>>>>资源占用报告>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;>>>>>>>>>>>>>>>临时占用a,bank0区r4,r5,r6
;>>>>>>>>>>>>>>>报告完毕>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
READDS18B20: 	clr	EA 			;
		mov	r6,#08h			;连续读8个bit。
RE1:		clr	p3.4 			;读前总线保持为低 。
		mov	r4,#04h			; 
		nop				;
		setb	p3.4 			;开始读总线释放 。
RE2:		djnz	r4,RE2 			;持续8us。
		mov	c,p3.4 			;从DS18B20总线读得一个bit。 
		rrc	a 			;把读得的位值环移给a。
		mov	r5,#1Eh			; 
RE3:		djnz	r5,RE3 			;持续60us。
		djnz	r6,RE1 			;读下一个bit。
		setb	p3.4 			;重新释放DS18B20总线。
		ret				;
;===============读DS18B20子程序=================================================================

;;;;;;;;;;;;;;;;一组DS18B20操作子程序结束;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;;;;;;;;;;;;;;;自动计数子程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;>>>>>>>>>>>>>>>资源占用报告>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;>>>>>>>>>>>>>>>临时占用a,b,dptr,bank0区r4~r7
;>>>>>>>>>>>>>>>报告完毕>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
FUNCTION4:	mov	a,#00h			;初始赋值。
		mov	AUTOCOUNTER,a		;保存在34h中。
FUNCTION4_1:	mov	a,RETURNFLAG		;检查返回标志,决定是否返回。
		jz	FUNCTION4_CON		;
		jmp	main			;
FUNCTION4_CON:	mov	a,AUTOCOUNTER		;恢复计数值。
		inc	a			;加一。
		cjne	a,#64h,NO_ROUND1	;如果超过99,那么返回00。
		mov	a,#00h			;
NO_ROUND1:	mov	AUTOCOUNTER,a		;
		mov	b,#0Ah			;
		div	ab			;除以10,高位(商)在a中。
						;低位(余数)在b中。
		mov	r4,a			;
		mov	a,b			;先显示低位。
		mov	dptr,#SEGMENT7		;
		movc	a,@a+dptr		;取得该数字对应的7段数码管的数值。
		cpl	a			;注意数码管采用共阳极电路,所以求反。
		mov	dptr,#8500h		;7段数码管B对应低位。
		movx	@dptr,a			;显示。
		mov	a,r4			;再显示高位。
		mov	dptr,#SEGMENT7		;
		movc	a,@a+dptr		;
		cpl	a			;
		mov	dptr,#8400h		;
		movx	@dptr,a			;
		mov	r5,#05h			;以下延迟一段时间,可自行调整。
D6:		mov	r6,#80h			;
D7:		mov	r7,#80h			;
D8:		djnz	r7,D8			;
		djnz	r6,D7			;
		djnz	r5,D6			;
		jmp	FUNCTION4_1		;循环计数。
SEGMENT7:	db	3Fh			;7段数码管字符0的abcdefg的值,
						;a在最低位,最高位始终保留为0。
		db	06h			;7段数码管字符1的abcdefg的值。
		db	5Bh			;7段数码管字符2的abcdefg的值。
		db	4Fh			;7段数码管字符3的abcdefg的值。
		db	66h			;7段数码管字符4的abcdefg的值。
		db	6Dh			;7段数码管字符5的abcdefg的值。
		db	7Dh			;7段数码管字符6的abcdefg的值。
		db	07h			;7段数码管字符7的abcdefg的值。
		db	7Fh			;7段数码管字符8的abcdefg的值。
		db	6Fh			;7段数码管字符9的abcdefg的值。
						;	    a
						;	■■■■■
						;	■	■
						;      f■      ■b
						;	■  g   ■
						;	■■■■■
						;	■      ■
						;      e■	■c
						;	■      ■
						;	■■■■■
						;           d
;;;;;;;;;;;;;;;;自动计数子程序结束;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;;;;;;;;;;;;;;;LED显示子程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;>>>>>>>>>>>>>>>资源占用报告>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;>>>>>>>>>>>>>>>临时占用a,c,dptr,bank0区r4~r7
;>>>>>>>>>>>>>>>报告完毕>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
FUNCTION5:	mov	a,RETURNFLAG		;检查返回标志,决定是否返回。
		jz	FUNCTION5_CON		;这段程序返回主菜单时可能反应比较慢,
		jmp	main			;原因是必须完成一次显示循环才判断是
						;否返回。所以请耐心等待。
FUNCTION5_CON:	mov	dptr,#8600h		;没有什么可以解释的,就是让LED阵列闪,
FUNCTION5_1:	setb	c			;烁,有一种漂亮的效果。您可以发挥自己
		mov	a,#00h			;的想象力,随意创作。作者只是给出一个
		mov	r4,#08h			;简单的例子。
FUNCTION5_2:	movx	@dptr,a			;
		call	F5DELAY			;
		rlc	a			;
		djnz	r4,FUNCTION5_2		;
		setb	c			;
		mov	a,#00h			;
		mov	r4,#08h			;
FUNCTION5_3:	movx	@dptr,a		  	;
		call	F5DELAY			;
		rrc	a			;
		djnz	r4,FUNCTION5_3		;
		clr	c			;
		mov	a,#0FFh			;
		mov	r4,#08h			;
FUNCTION5_4:	movx	@dptr,a			;
		call	F5DELAY			;
		rlc	a			;
		djnz	r4,FUNCTION5_4		;
		clr	c			;
		mov	a,#0FFh			;
		mov	r4,#08h			;
FUNCTION5_5:	movx	@dptr,a			;
		call	F5DELAY			;
		rrc	a			;
		djnz	r4,FUNCTION5_5		;
		jmp	FUNCTION5		;
F5DELAY:	mov	r5,#05h			;在此调整时间间隔。
D9:		mov	r6,#80h			;
D10:		mov	r7,#80h			;
D11:		djnz	r7,D11			;
		djnz	r6,D10			;
		djnz	r5,D9			;
		ret				;
;;;;;;;;;;;;;;;;LED显示子程序结束;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;;;;;;;;;;;;;;;虚拟串口通信子程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;>>>>>>>>>>>>>>>资源占用报告>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;>>>>>>>>>>>>>>>临时占用a,dptr,bank0区r5~r7
;>>>>>>>>>>>>>>>报告完毕>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>		
;'''''''''''''''友情提示''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
;1:使用此功能,您需要有两个必备软件:虚拟串口软件和串口调试软件。
;2:请连接http://siwawa9000.gbaopan.com,获得相关软件和使用指南。
;'''''''''''''''提示完毕''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
FUNCTION6:	call	COMMINITIALIZATION	;调用串口初始化子程序。
FUNCTION6_1:	mov	a,RETURNFLAG		;检查返回标志,决定是否返回。
		jz	FUNCTION6_CON		;
		clr	TR1			;关闭定时器1。
		jmp	main			;
FUNCTION6_CON:	clr 	ES              	;禁止串行中断。
                clr 	RI             		;清除接收标志位。
                mov 	dptr,#SERIAL		;
		mov	a,COMINDEX		;
                movc 	a,@a+dptr		;
		jz	FUNCTION6_3		;
                mov 	SBUF,a       		;发送。这段程序的功能就是把可打
						;印的ASCII字符显示出来。
FUNCTION6_2:	jnb 	TI,FUNCTION6_2    	;等待发送完毕。
                clr  	TI              	;清除发送中断标志。
                setb 	ES               	;允许串行中断。
		mov	a,COMINDEX		;
		inc	a			;
		mov	COMINDEX,a		;
		call	F6DELAY			;
		jmp	FUNCTION6_1		;
FUNCTION6_3:	mov	COMINDEX,#00h		;
		setb 	ES			;
		jmp	FUNCTION6_1    		;
F6DELAY:	mov	r5,#02h			;在此调整时间间隔。
D23:		mov	r6,#80h			;
D24:		mov	r7,#80h			;
D25:		djnz	r7,D25			;
		djnz	r6,D24			;
		djnz	r5,D23			;
		ret				;	
;;;;;;;;;;;;;;;;虚拟串口通信子程序结束;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;;;;;;;;;;;;;;;初始化串口子程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
COMMINITIALIZATION:
		mov 	TMOD,#20h      	;设置定时器T1工作方式2。
              	mov 	TL1,#0F3h      	;定时器计数初值,波特率2400。 
              	mov 	TH1,#0F3h      	;定时器重装值。
              	setb 	EA            	;允许总的中断。
              	setb 	ES            	;允许串行中断。
              	mov 	PCON,#00h      	;波特率不倍增。

⌨️ 快捷键说明

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