📄 zxce_1_cpu2.asm
字号:
$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 + -