用单片机实现温度远程显示 第9页

用单片机实现温度远程显示 第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] 下一页

Copyright © 2007-2012 www.chuibin.com 六维论文网 版权所有