用单片机实现温度远程显示 第6页
;------------1--------rand_main.a51----------------
name rand_main
EXTRN CODE(I_T0,send_order,rec_si,ascii_bcd,key)
extrn data (DISP_buf,disp_wc,time_20ms,wdt)
extrn idata (rec_buf)
public TH0_H,TL0_L,START,ri_f,wdt_time,key_work,key_f
prog SEGMENT CODE           ;定义代码段
byte_buff segment data      ;定义字节数据段1
byte_buffI segment idata    ;定义字节数据段2
bit_buff segment data bitaddressable ;定义位数据段
bit_flag segment bit
stack segment idata         ;定义堆栈数据段
     rseg stack         ;为堆栈保留20个字节
     ds 20
     CSEG AT 00H        ;定义绝对代码段
     USING 0            ;选择工作寄存器组第0组
     lJMP rand          ;复位时程序执行执行点
     CSEG AT 03H        ;外部中断0
     RETI
     CSEG AT 0BH        ;定时器0中断
     lJMP I_T0
     CSEG AT 13H        ;外部中断1
     ljmp key
     RETI
     CSEG AT 1BH        ;定时器1中断
     RETI
     CSEG AT 23H        ;串行中断
     ljmp rec_si
     RSEG BYTE_BUFF
     td_temp: ds 1
     TD_n: DS 1         ;通道号
     YD_n100: ds 1      ;仪表地址
;----------------------------------
     rseg bit_flag
     key_work:dbit 1
     ri_f: dbit 1       ;串行口正在接收标志
;----主程序
     RSEG prog
;------------------------------符号定义
     key_f equ p3.3
     key_up equ p3.4
     key_down equ p3.5
     wdt_time equ 100       ;软件看门狗定时器计数值
     scon_c equ 01010000b   ;串行口设置为10位UART,允许接收
     th1_h equ 0fdh         ;晶振为
     tmod_n equ 21h         ;设置定时器(T1作为波特率发生器工作在模式2,T0为模式1)
     ie_n equ 82h           ;设置串行,定时器0中断
     ip_n equ 12h           ;设置串行,定时器0中断为高级中断
     TH0_H EQU 0FCH
     TL0_L EQU 06BH         ;设定定时器0为1MS中断初值
;------------------初始化代码
clear_wdt macro             ;清硬看门狗宏定义
     orl 96h,#2
     ENDM 
rand:    ORL 96H,#0E1H      ;启动硬件看门狗
     mov p0,#0ffh
     mov r0,#20h
     mov a,#0
start_300:mov @r0,a
     inc r0
     cjne r0,#128,start_300
     setb key_work      ;置巡回/定点标志
     mov p3,#0ffh
     mov p2,#0ffh
     mov disp_wc,#0         ;初始化闪烁控制位
     mov ip,#ip_n       ;设置串行,定时器0中断为高级中断
     mov scon,#scon_c
     MOV TMOD,#tmod_n   
     MOV TH0,#TH0_H         ;设定定时器初值
     MOV TL0,#TL0_L
     mov th1,#th1_h
     mov tl1,#th1_h
     mov ie,#ie_n
     mov pcon,#0
     SETB tr1
     SETB TR0
;-------显示初始化提示
     acall chuhao
     CLEAR_WDT     
start:   clr ea
     mov sp,#stack-1
     setb ea
     clr ri_f      ;清接收中标志
     clr p3.2      ;置75176为接收状态
     jnb key_work,db_work
;-----------------------------------
     setb ex1
     mov yd_n100,#0ah
     mov td_n,#0
s_0: anl disp_wc,#
     mov wdt,#0         ;清看门狗定时器
     clear_wdt
     mov a,yd_n100
     lcall send_order
     JNZ s_1
     mov disp_buf+5,yd_n100
     mov a,td_n
     lcall ascii_bcd
     jnz s_2
     mov disp_buf+4,td_n
     acall mov_to_disp
     mov wdt,#0
     clear_wdt
     mov a,#75
     add a,time_20ms
     cjne a,time_20ms,$
     mov wdt,#0
     clear_wdt
     mov a,#75
     add a,time_20ms
     cjne a,time_20ms,$
s_2: inc td_n
     mov a,td_n
     cjne a,#8,s_0
     mov td_n,#0
s_1: inc yd_n100
     MOV A,YD_N100
     cjne a,#10h,s_0
     mov yd_n100,#0ah
     ajmp s_0
;-----------------------------
db_work:setb ex1
     orl disp_wc,#01h
d_3: mov wdt,#0         ;清看门狗定时器
     clear_wdt
     jb key_up,d_4
     mov a,#2
     add a,time_20ms
     cjne a,time_20ms,$
     jb key_up,d_4
d_5: mov wdt,#0
     clear_wdt
     jnb key_up,d_5         ;等待向上键松开
;------------------------------------------------
d_53:    mov a,td_n
     cjne a,#7,d_50
     mov td_n,#0
d_52:    inc yd_n100
     mov a,yd_n100
     cjne a,#10h,d_51
     mov yd_n100,#0ah
     ajmp d_51
d_50:    inc td_n
d_51:    mov a,yd_n100
     lcall send_order
     JNZ d_52
     mov disp_buf+5,yd_n100
     mov a,td_n
     lcall ascii_bcd
     jnz d_53
     mov disp_buf+4,td_n
     acall mov_to_disp
     mov a,#100         ;2秒钟定时设定
     add a,time_20ms
     ajmp d_3
;------------------------------------------------
d_4: jb key_down,d_10
     mov a,#2
     add a,time_20ms
     cjne a,time_20ms,$
     jb key_down,d_3
d_6: mov wdt,#0
     clear_wdt
jnb key_down,d_6 ;等待向下键松开
上一页 [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] 下一页