用单片机实现温度远程显示 第9页
mov p0,#0feh
ajmp d_10
DISP2: CJNE R0,#2,DISP3 ;显示十位
setb p0.0
mov c,disp_c_2
mov A,disp_2
mov p1,#0FFH
mov p0,#0fdh
ajmp d_10
DISP3: CJNE R0,#3,DISP4 ;显示百位
mov c,disp_c_3
mov A,disp_3
mov p1,#0FFH
mov p0,#0fbh
ajmp d_10
DISP4: CJNE R0,#4,DISP5 ;显示千位
mov c,disp_c_4
mov A,disp_4
mov p1,#0FFH
mov p0,#0f7h
ajmp d_10
DISP5: CJNE R0,#5,DISP6 ;显示通道号
mov A,disp_5
mov p1,#0FFH
mov p0,#0efh
ajmp d_10
DISP6: CJNE R0,#6,DISP7 ;显示仪表地址
mov A,disp_6
mov p1,#0FFH
mov p0,#0dfh
ajmp d_10
DISP7: CJNE R0,#7,DISP8 ;无
mov A,disp_7
mov p1,#0FFH
mov p0,#0bfh
ajmp d_10
DISP8: CJNE R0,#8,d_10 ;无
mov A,disp_8
mov p1,#0FFH
mov p0,#7fh
d_10: acall disp_w
mov r0,disp_c
cjne r0,#10,d_12 ;若disp_c=10则清disp_c
mov disp_c,#0
inc time_s_c ;MS,S计数处理程序
mov a,time_s_c
cjne a,#2,d_12
mov time_s_c,#0
inc time_20ms
inc wdt ;软看门狗处理程序
mov a,wdt
cjne a,#wdt_time,d_12
mov wdt,#0
mov a,#0
push acc
push acc
reti
;-----------------------
d_12: pop psw
pop dpl
pop dph
pop ar0
pop acc
RETI
disp_w: jnc d_0
jnb disp_s_c,d_0
mov p1,#0FFH
ajmp d_1
d_0: movc a,@a+dptr
cpl a
mov p1,a
D_1: ret
;---------------------------------------------------------
TAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
; 0 1 2 3 4 5 6 7 8 9
db 77H,7CH,39H,5EH,79H,71H
; A B C D E F
DB 0BFH,86H,0DBH,0CFH,0E6H,0EDH,0FDH,87H,0FFH,0EFH
; 0. 1. 2. 3. 4. 5. 6. 7. 8. 9.
db 40H,80H,00H,37h,5ch,1ch,58h,74h,0dch,46h
; - . 空 n o u c h a -1
; 1a 1b 1c 1d 1e 1f 20 21 22 23
END
4、命令发送及接收控制子模块(rand_send.a51)
;----------4--------rand_send.a51----------------
name send_order
extrn idata (rec_buf) ;rec_buff 接收缓冲区
extrn data (time_20ms)
extrn bit (ri_f) ;ri_f 正在接收标志
PUBLIC send_order
prog SEGMENT CODE ;定义代码段
byte_buff segment data ;定义字节数据段1
byte_buffI segment idata ;定义字节数据段2
bit_buff segment data bitaddressable ;定义位数据段
rseg byte_buff
send_n:ds 1
order_buf:ds 10
rseg prog
dd_c equ 4 ;等待回应20m数
cw_n equ 7 ;设置允许错误次数
using 0
;---------------------清命令缓冲区
send_order:
mov dpl,#8
mov r0,#order_buf
send_0: mov @r0,#0
inc r0
djnz dpl,send_0
MOV DPL,#72 ;清接收缓冲区
MOV R0,#REC_BUF
SEND_A: MOV @R0,#0
INC R0
DJNZ DPL,SEND_A
;----------------------发送命令控制程序
mov send_n,#cw_n ;设置允许错误次数
mov b,#10
clr c
subb a,b
mov b,#8
mul ab
mov dptr,#a_order
mov r0,#order_buf-1
mov r1,#10
start_mov:inc r0
push acc
movc a,@a+dptr
mov @r0,a
inc dptr
pop acc
cjne @r0,#0dh,start_mov
;----------------------发送命令子程序
send_start:setb p3.2 ;切换75176至发送状态
mov r0,#order_buf-1
send_10:inc r0
mov sbuf,@r0
jnb ti,$ ;等待一帧数据发完
CLR TI
cjne @r0,#0dh,send_10 ;检测到结束标志退出
;------------------------检测接收标志
mov r0,#30 ;延时60uS等待停止位发送完毕
djnz r0,$
setb es
clr p3.2 ;切换75176至接收状态
mov a,#dd_c ;延时检测仪表有无回应
add a,time_20ms
send_21:jb ri_f,send_20
cjne a,time_20ms,send_21
mov a,#'N'
ajmp send_23
;-------------------------检测接收是否正确
send_20:mov a,#10 ;延时200MS等待接收结束
add a,time_20ms
send_28:jnb ri_f,send_29
cjne a,time_20ms,send_28
clr ri_f ;200MS仍未结束清接收中标志
send_29:mov r0,#rec_buf+4
cjne @r0,#'*',send_22
mov a,#'*'
send_23:djnz send_n,send_start ;达到允许错误次数退出
ajmp send_out
send_22:mov r0,#rec_buf+71
cjne @r0,#0dh,send_23 ;接收缓冲区第72字节不为回车符转出错处理
;------------------------------还原校验码
mov r0,#rec_buf+70
mov a,@r0
clr c
subb a,#3ah
jnc SEND_25
add a,#7
send_25:add a,#3
mov @r0,a
dec r0
mov a,@r0
clr c
subb a,#3ah
jnc SEND_26
add a,#7
send_26:ADD A,#3
swap a
inc r0
xchd a,@r0
dec r0
xch a,@r0
inc r0
mov @r0,#0dh ;检验码后加回车符
;------------------------------检验接收缓冲区数据
mov r0,#rec_buf+1
mov a,@r0
inc r0
send_24:xrl a,@r0
inc r0
cjne @r0,#0dh,send_24
cjne a,#0,send_200 ;接收校验未通过转出错处理
send_out:clr es
ret
send_200:mov a,#1
ajmp send_23
;----------------------------------------------------
a_order: db '@0ARD67',0DH ;读A表全部动态数据命令
b_order: db '@0BRD64',0DH ;读B表全部动态数据命令
c_order: db '@0CRD65',0DH ;读c表全部动态数据命令
d_order: db '@0DRD62',0DH ;读d表全部动态数据命令
e_order: db '@0ERD63',0DH ;读e表全部动态数据命令
f_order: db '@0FRD60',0DH ;读f表全部动态数据命令
END
5、串行接收子模块(rand_rec.a51)
;-------5----------rand_rec.a51
name rec_si
extrn bit (ri_f)
public rec_si,rec_buf
prog SEGMENT CODE ;定义代码段
byte_buff segment data ;定义字节数据段1
byte_buffI segment idata ;定义字节数据段2
bit_buff segment data bitaddressable ;定义位数据段
rseg byte_buff
rec_buf_z: ds 1 ;接收区指针
rec_err: ds 1 ;接收缓冲区溢出计数器
rseg byte_buffi
rec_buf: ds 75
rseg prog
using 0
rec_si: PUSH PSW
push ar0
push acc
JNB RI,REC_OUT ;为发送中断跳出
上一页 [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] 下一页