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

📄 zxce_1_cpu2.asm

📁 c8051f020和prt905还有tc35语言
💻 ASM
📖 第 1 页 / 共 5 页
字号:
$NOMOD51

$INCLUDE (C8051F020.inc)




;==============================================
; 					cpu采用c8051f020									
;==============================================


;------------------io口定义--------------------
time_over     	equ     p0.4
isda						equ			p0.5
iscl						equ			p0.6

tc35_up					equ			p2.0
led							equ			p2.1
spk							equ			p2.2
igt							equ			p2.3



WDDATA_1 				bit 	 	P2.5 			;定义DS18B20的数据脚P为p2.5端口 

ws1							bit			p1.0
ws2							bit			p1.1
ws3							bit			p1.2
ws4							bit			p1.3


;------------------寄存器定义------------------
;定义临时环境温度数据
dis_1b					equ			30h			;临时温度符号
dis_2b					equ			31h			;临时温度十位
dis_3b					equ			32h			;临时温度个位
dis_4b					equ			33h			;临时温度十分位
dis_5b					equ			34h			;临时温度百分位

dph1						equ			40h
dpl1						equ			41h
dph2						equ			42h
dpl2						equ			43h
databuf1				equ			44h
databuf2				equ			45h
adc_h						equ			46h
adc_l						equ			47h
adc_a_h					equ			48h
adc_a_m					equ			49h
adc_a_l					equ			4ah
min_count				equ			4bh
sla							equ			4ch
addrh						equ			4dh
addrl						equ			4eh
numbyte					equ			4fh
;定义温度数据
dis_1 					equ 		50h 	;符号
dis_2 					equ 		51h 	;十位
dis_3 					equ 		52h 	;个位
dis_4 					equ 		53h 	;小数点后第一位
dis_5 					equ 		54h 	;小数点后第二位
dot 						equ 		55h
ZHENGSHU 				equ 		56h

databuf					equ			57h
csqbuf1					equ			58H
csqbuf2					equ			59H
dp_h						equ			5ah
dp_l						equ			5bh
tim_count				equ			5ch
pdu_count				equ			5dh
sms_num					equ			5eh
alm_count				equ			5fh
;60h_68保留

;--------------------布尔位---------------------
receive_data_ok	bit			00h
smsflag					bit			01h
read_sms_ok			bit			02h
check_num_ok		bit			03h
alm_count_flag	bit			05h
alm_set_flag		bit			06h
ack							bit			07h
write_tmax_flag	bit			08h
flag1 					bit			09h 	;是否检测到DS18B20的标志位
alm_agin				bit			0ah
new_data				bit			0bh


;------------------缓冲区定义--------------------
txd_buf					equ			0000h				;短信发送缓冲区
rxd_buf					equ			0100h				;短信接收缓冲区
wendu_databuf		equ			0200h				;温度数据接收缓冲区
sms_buf					equ			0300h				;有用短信缓冲区
rec_sms_num			equ			0400h				;取得的号码
cen_t_num				equ			0410h				;发送中心号
cen_r_num				equ			0420h				;接受中心号
alm_buf					equ			0430h				;报警阈值
tim_buf					equ			0433h				;报警次数
pdu_buf					equ			0434h				;报警频率
vcc_buf					equ			0435h				;电池电压
rh_buf					equ			0438h				;湿度
ht_buf					equ			043bh				;环境温度
hrbuf						equ			0440h				;
mnbuf						equ			0442h				;
scbuf						equ			0444h				;
a_hrbuf					equ			0450h				;
a_mnbuf					equ			0452h				;
a_scbuf					equ			0454h				;
dat_buf					equ			0460h				;临时数据缓冲区


;-------------温度测量数据缓冲区--------------0
t1_buf					equ			0500h
t2_buf					equ			0505h
t3_buf					equ			050ah
t4_buf					equ			050fh
t5_buf					equ			0514h
t6_buf					equ			0519h
t7_buf					equ			051eh
t8_buf					equ			0523h
t9_buf					equ			0528h
t10_buf					equ			052dh
t11_buf					equ			0532h
t12_buf					equ			0537h

;------------温度测量数据最大值缓冲区-------------
t1_max_buf			equ			0700h
t2_max_buf			equ			0705h
t3_max_buf			equ			070ah
t4_max_buf			equ			070fh
t5_max_buf			equ			0714h
t6_max_buf			equ			0719h
t7_max_buf			equ			071eh
t8_max_buf			equ			0723h
t9_max_buf			equ			0728h
t10_max_buf			equ			072dh
t11_max_buf			equ			0732h
t12_max_buf			equ			0737h



;-------------ee2_rom地址定义-------------------
ee_tx_num				equ			00h
ee_rx_num				equ			10h
ee_alm_num			equ			20h
ee_pd_num				equ			23h
ee_tim_num			equ			26h





;===========================================
;									主程序
;===========================================


		org			0000h
		ljmp		start0

start0:
		mov			wdtcn,#0deh
		mov			wdtcn,#0adh						;禁止看门狗

		clr			ea
		mov			sp,#30h
		
		lcall		clk_init
		lcall		port_init
		lcall		init_uart0
		lcall		init_uart1
		lcall		init_adc
		
		clr			tc35_up
		lcall		set_spk
		lcall		set_led
		lcall		set_power
		lcall		READ_DS18B20_1
		lcall		READ_DS18B20_1
		nop
		clr			alm_agin
		clr			alm_count_flag
		clr			new_data
		nop
		
		
		lcall		clr_wendu_buf					;清温度缓冲区
		lcall		clr_wendu_buf_max			;清温度最大值缓冲区
		lcall		clr_rxd_buf						;清短信接收缓冲区
		lcall		clr_txd_buf						;清短信发送缓冲区
		lcall		clr_sms_buf						;清短信存放区(存有用的短信)
		lcall		clr_wendu_databuf			;清温度数据接收缓冲区
		lcall		clr_cen_r_num_buf			;清接收中心号码缓存区
		lcall		clr_cen_t_num_buf			;清发送中心号码缓存区
		lcall		clr_sms_num_buf				;清取得的短信号码缓冲区
		nop
	
		nop
		lcall		ad_vpp
		lcall		ad_rh
		lcall		READ_DS18B20_1
		nop
			
;=====================================================================================

write_ee2room:
	;	lcall		w_ee_tx_num						;写发送中心号码
	;	lcall		w_ee_rx_num						;写接收中心号码
	;	lcall		w_ee_df_alm						;写报警阀值
	;	lcall		w_ee_df_pd						;写报警频率(次数)
	;	lcall		w_ee_df_tim						;写报警时间间隔
		;nop
		lcall		set_init_time					;设置时间
		;nop


read_ee2room:
		lcall		r_ee_tx_num
		lcall		r_ee_rx_num
		lcall		r_ee_df_alm
		lcall		r_ee_df_pd
		lcall		r_ee_df_tim

		lcall		clr_tim_con						;清状态寄存器
		lcall		clr_tim_int_reg_h			;清时报警寄存器
		lcall		clr_tim_int_reg_m			;清分报警寄存器
		lcall		set_alm_int						;设置中断方式,重复,双报数。
		lcall		set_alm_hour					;设置小时报数



;----------------------握手协议------------------------
;等待ws1置0,确认数据请求信号ws1置0后,将ws2置0,确认接收
;数据。等待数据传送结束信号ws3置0,确认后,将ws4置0,确认
;接收数据完毕。将ws2置位为1,延时,将ws4置位为1。协议结束
;------------------------------------------------------
main:
		lcall		init_tc35									;初始化tc35
		nop
main_loop:
		lcall		ad_vpp
		lcall		ad_rh
		lcall		READ_DS18B20_1
		nop
		lcall		check_sms	
		lcall		test_ws
main_loop0:
		jb			new_data,save_new_data		
		ljmp		main_loop1								;没新数据
save_new_data:												;有新数据	
		clr			alm_set_flag							;
		lcall		compare_alm_data					;比较是否超过报警温度
		jb			alm_set_flag,do_work_alm0	;有报警
		jb			alm_agin,clr_agin
		ljmp		main_loop1
clr_agin:
		clr			alm_agin
		ljmp		main_loop1
do_work_alm0:													;有报警数据		
		jb			alm_agin,do_work_alm1			;再次确认报警			
		setb		alm_agin
		ljmp		main_loop1
do_work_alm1:		
		jnb			alm_count_flag,do_work_alm_2
		ljmp		main_loop1								;报警数据发送2次,
do_work_alm_2:		
		lcall		clr_txd_buf							  ;有报警数据直接发两次
		lcall		read_time
		lcall		sent_csq
		lcall		put_dlm4
		lcall		sent_sms
		lcall		sent_back_sms
		lcall		set_spk
		lcall		set_spk
		lcall		set_spk
		nop
		lcall		clr_txd_buf
		lcall		read_time
		lcall		sent_csq
		lcall		put_dlm4
		lcall		sent_sms
		lcall		sent_back_sms
		nop
		clr			alm_agin
		lcall		set_spk
		lcall		set_spk
		lcall		set_spk
		setb		alm_count_flag					;报警数据发送2次,重新请求数据后,恢复报警功能
		clr			alm_agin							
		ljmp		main_loop1

main_loop1:
		jb			time_over,main_loop2		;整点报温度最大值
		lcall		serv_x1226
		lcall		clr_txd_buf
		lcall		read_time
		lcall		sent_csq
		lcall		put_dtt4
		lcall		sent_sms
		lcall		sent_back_sms
		lcall		set_led
		lcall		set_spk
		lcall		set_led
		lcall		set_spk
		lcall		set_led
		lcall		set_spk
		lcall		clr_wendu_buf_max
main_loop2:
		lcall		set_wdot
		ljmp		main_loop










;======================================================
;										以下为子程序
;======================================================

;-------------初始化TC35模块-------------
init_tc35:
		lcall		set_igt
		lcall		tc35_delay
		lcall		set_spk
		lcall		set_led
		lcall		set_spk
		lcall		set_led
		lcall		sent_at
		lcall		sent_ate0
		lcall		sent_cmgf
		lcall		sent_csq
		lcall		sent_cpms1
		lcall		sent_cpms2
		lcall		sent_cmgd_init
		nop
		lcall		clr_txd_buf
		lcall		read_time
		lcall		put_ans4				
		lcall		sent_sms
		lcall		sent_back_sms
		nop
		lcall		set_spk
		lcall		set_led
		lcall		set_spk
		lcall		set_led
		lcall		set_spk
		lcall		set_led
		lcall		set_wdot
		ret
;-------------查询短信----------------
check_sms:
		lcall		sent_cmgl												;列表
		jb			smsflag,check_sms_0
		ljmp		check_sms_out
check_sms_0:																;有信息,短鸣两声
		lcall		set_spk
		lcall		set_led
		lcall		set_spk
		lcall		set_led
		clr			smsflag
		lcall		sent_cmgr												;读信息
		jb			read_sms_ok,check_sms_1
		lcall		sent_cmgd												;读信息不正确,删除信息
		ljmp		check_sms_out
check_sms_1:
		clr			read_sms_ok
		lcall		check_num												;检测卡号
		jb			check_num_ok,check_sms_2
		lcall		sent_cmgd												;卡号不正确,删除
		ljmp		check_sms_out
check_sms_2:
		clr			check_num_ok
		lcall		search_sms											;查信息内容
		lcall		sent_cmgd												;查看后删除信息
		ljmp		check_sms_out
check_sms_out:
		lcall		set_wdot
		ret
;------------判别收到的短信内容-------------
search_sms:
		mov			dptr,#sms_buf+1
		movx		a,@dptr
sms_set:														;"SET/r_num/t_num"
		cjne		a,#53h,sms_tim
		ljmp		do_sms_set
sms_tim:														;"TIM/HHMMSS/END"
		cjne		a,#54h,sms_ask
		ljmp		do_sms_tim
sms_ask:														;"ASK/END"
		cjne		a,#41h,sms_qda
		ljmp		do_sms_ask
sms_qda:														;"QDA/END"
		cjne		a,#51h,sms_wen
		ljmp		do_sms_qda
sms_wen:														;"WEN/END
		cjne		a,#57h,sms_exit
		ljmp		do_sms_wen
sms_exit:
		ljmp		search_sms_out
;------------------------
;执行set
do_sms_set:														;设置号码参数
		lcall		reset_rx_num
		lcall		reset_tx_num
		lcall		reset_alm_data
		lcall		reset_pd_data
		lcall		reset_tim_data
		lcall		clr_txd_buf
		lcall		sent_csq
		lcall		put_ans4
		lcall		sent_sms
		lcall		sent_back_sms
		lcall		set_led
		lcall		set_spk
		lcall		set_led
		lcall		set_spk
		lcall		set_led
		lcall		set_spk
		ljmp		search_sms_out
;-----------------------
;执行tim
do_sms_tim:														;设置时间参数
		lcall		take_time
		lcall		sent_csq
		lcall		clr_txd_buf
		lcall		put_dtm4
		lcall		sent_sms
		lcall		sent_back_sms
		lcall		set_led
		lcall		set_spk
		lcall		set_led
		lcall		set_spk
		lcall		set_led
		lcall		set_spk
		lcall		re_set_time
		lcall		set_alm_hour
		ljmp		search_sms_out
;-----------------------
;执行ask
do_sms_ask:														;请求设备信息
		lcall		clr_txd_buf
		lcall		sent_csq
		lcall		put_ans4
		lcall		sent_sms
		lcall		sent_back_sms
		lcall		set_led
		lcall		set_spk
		lcall		set_led
		lcall		set_spk
		lcall		set_led
		lcall		set_spk
		mov			alm_count,#02h
		clr			alm_count_flag
		ljmp		search_sms_out
;----------------------
;执行qda
do_sms_qda:														;请求数据上传
		lcall		clr_txd_buf
		lcall		read_time
		lcall		sent_csq
		lcall		put_dat4
		lcall		sent_sms
		lcall		sent_back_sms
		lcall		set_led
		lcall		set_spk
		lcall		set_led
		lcall		set_spk
		lcall		set_led
		lcall		set_spk
		ljmp		search_sms_out
;--------------------------
;执行wen
do_sms_wen:
		lcall		init_wen_count
do_sms_wen_1:		
		lcall		delay_1min
		djnz		tim_count,do_sms_wen_1
		lcall		test_ws
		lcall		clr_txd_buf
		lcall		read_time
		lcall		sent_csq
		lcall		put_dat4
		lcall		sent_sms
		lcall		sent_back_sms
		djnz		pdu_count,do_sms_wen_2
		ljmp		search_sms_out
do_sms_wen_2:
		mov			dptr,#tim_buf
		movx		a,@dptr
		anl			a,#0fh
		mov			tim_count,a
		ljmp		do_sms_wen_1
search_sms_out:
		lcall		set_wdot	
		ret
;-----------------检测卡号---------------------
check_num:
		mov			dptr,#rec_sms_num+3					;取得的号码
		mov			dp_h,dph
		mov			dp_l,dpl
		mov			r0,#0ah
		mov			dptr,#cen_t_num							;发送中心号码
check_num_0:
		movx		a,@dptr
		mov			b,a													;发送中心号码字符存入b
		inc			dptr
		push		dph
		push		dpl
		mov			dph,dp_h
		mov			dpl,dp_l
		movx		a,@dptr											;取得的号码字符存入a
		inc			dptr
		mov			dp_h,dph
		mov			dp_l,dpl
		pop			dpl
		pop			dph
		cjne		a,b,check_num_1							;a与b比较
		djnz		r0,check_num_0
		setb		check_num_ok
		ljmp		check_num_out
check_num_1:
		clr			check_num_ok
check_num_out:
		lcall		set_wdot
		ret
;--------取温度数据送入温度测量数据缓冲区---------
save_data_to_tbuf:
		mov			dptr,#t1_buf
		mov			dp_h,dph
		mov			dp_l,dpl
		mov			dptr,#wendu_databuf+1
		movx		a,@dptr
save_data_to_tbuf_1:
		inc			dptr
		push		dph
		push		dpl
		mov			dph,dp_h
		mov			dpl,dp_l
		movx		@dptr,a
		inc			dptr
		mov			dp_h,dph
		mov			dp_l,dpl
		pop			dpl
		pop			dph
		movx		a,@dptr
		cjne		a,#29h,save_data_to_tbuf_1
		lcall		set_wdot
		ret
;-------------取温度最大值-------------
take_tmp_max:
		mov			r0,#0ch									;取12道数据
		mov			dptr,#t1_max_buf
		mov			dph2,dph
		mov			dpl2,dpl
		lcall		take_dptr2
		mov			dptr,#t1_buf
		mov			dph1,dph
		mov			dpl1,dpl
		lcall		take_dptr1
take_tmp_max_1:
		mov			r1,#04h
		mov			a,databuf1
		cjne		a,#2bh,take_out					;首位是否为"+"
		ljmp		take_tmp_max_2
take_out:
		ljmp		take_out_1							;非正数,查下一道数据
take_tmp_max_2:											;比较符号下一位
		lcall		dptr2_inc_save
		lcall		take_dptr2
		mov			a,databuf2
		mov			b,a
		lcall		dptr1_inc_save
		lcall		take_dptr1
		mov			a,databuf1
		cjne		a,b,take_tmp_max_3			;不相等,求差
		ljmp		take_tmp_max_4					;相等,比较下一位
take_tmp_max_3:
		clr			c
		subb		a,b
		jc			take_tmp_max_5					;进位位=1,t<tmax比较下一位
		ljmp		take_tmp_max_6					;进位为=0,t>tmax,取t=>tmax
take_tmp_max_4:
		djnz		r1,take_tmp_max_2
		ljmp		take_tmp_max_1
take_tmp_max_5:
		lcall		dptr1_inc_save
		lcall		take_dptr1
		lcall		dptr2_inc_save
		lcall		take_dptr2
		djnz		r1,take_tmp_max_5
		djnz		r0,take_tmp_max_loop
		ljmp		take_tmp_max_over
take_tmp_max_6:
		lcall		take_dptr1
		mov			a,databuf1
		mov			dph,dph2
		mov			dpl,dpl2
		movx		@dptr,a
		lcall		dptr1_inc_save
		lcall		dptr2_inc_save
		djnz		r1,take_tmp_max_6
		lcall		take_dptr1
		djnz		r0,take_tmp_max_loop
		ljmp		take_tmp_max_over
take_out_1:
		lcall		dptr1_inc_save
		lcall		dptr2_inc_save
		lcall		dptr1_inc_save
		lcall		dptr2_inc_save
		lcall		dptr1_inc_save
		lcall		dptr2_inc_save
		lcall		dptr1_inc_save
		lcall		dptr2_inc_save
		lcall		dptr1_inc_save
		lcall		dptr2_inc_save
		lcall		take_dptr1
		djnz		r0,take_tmp_max_loop
		ljmp		take_tmp_max_over
take_tmp_max_loop:
		ljmp		take_tmp_max_1
take_tmp_max_over:
		lcall		set_wdot
		ret
;----------比较是否超过报警温度-----------
bijiao_alm_all:
		mov			r0,#0ch								;比较前10道数据
		mov			dptr,#t1_buf
		mov			dph1,dph
		mov			dpl1,dpl
		lcall		dptr1_inc_save
bijiao_alm_all_0:									;比较百位
		mov			r1,#03h								;3位报警值
		mov			dptr,#alm_buf
		movx		a,@dptr
		mov			b,a
		lcall		take_dptr1						;取dptr1数据存入databuf1
		cjne		a,b,bijiao_alm_subb
		lcall		dptr1_inc_save				;dptr1加1,保存dph1,dpl1
bijiao_alm_all_1:									;比较十位
		dec			r1
		mov			dptr,#alm_buf+1

⌨️ 快捷键说明

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