用单片机实现温度远程显示 第6页
用单片机实现温度远程显示 第6页
十、附录(源程序)
1、主模块(rand_main.a51)
;------------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] 下一页