?? 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 + -