![]() |
|
| | 网站首页 | 电子知识 | 单片机知识 | 电路设计 | 微电子技术 | SCADA系统 | 资源下载 | 给我留言 | 谷歌商城 | 视频教程 | ieee | |
| 热门搜索关键字: 单片机教程 | 三极管 | 二极管 | C语言 | 汇编语言 | SCADA | 元器件 | 模拟电子 | |
|
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
;------------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 ;等待向下键松开
;-----------------------------------------------
d_43: mov a,td_n
cjne a,#0,d_40
mov td_n,#7
d_42: dec yd_n100
mov a,yd_n100
cjne a,#9h,d_41
mov yd_n100,#0fh
ajmp d_41
d_40: dec td_n
d_41: mov a,yd_n100
lcall send_order
JNZ d_42
mov disp_buf+5,yd_n100
mov a,td_n
lcall ascii_bcd
jnz d_43
mov disp_buf+4,td_n
acall mov_to_disp
mov a,#100 ;2秒钟定时设定
add a,time_20ms
ajmp d_3
;----------------------------------
d_10: cjne a,time_20ms,d_30
mov a,yd_n100
lcall send_order
jnz d_30
mov a,td_n
lcall ascii_bcd
jnz d_30
acall mov_to_disp
mov a,#100
add a,time_20ms
d_30:ajmp d_3
;----------------------------------
mov_to_disp:mov disp_buf,r1
mov disp_buf+1,r2
mov disp_buf+2,r3
mov disp_buf+3,r4
ret
chuhao: mov r1,#1eh ;初始化等待提示
mov r2,#22h
mov r3,#21h
mov r4,#1fh
mov disp_buf+4,#21h
mov disp_buf+5,#20h
acall mov_to_disp
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,$
ret
end
;-----------2-------rand_data.a51----------------
name rand_data
extrn idata (rec_buf)
public ascii_bcd
prog SEGMENT CODE ;定义代码段
byte_buff segment data ;定义字节数据段1
byte_buffI segment idata ;定义字节数据段2
bit_buff segment data bitaddressable ;定义位寻址区字节数据段
rseg prog
using 0
;-------------------------------------
ASCII_BCD:mov b,#8 ;计算该通道数据偏移首地址
mul ab
add a,#5
mov r0,#rec_buf
add a,r0
mov b,a
mov r0,a
acall ascii4_bcd3
mov a,b ;还原小数位数
add a,#7
mov r0,a
acall ascii_bin
mov r6,a ;小数位数暂存在R6中
mov a,r5
jz asc_oK
mov a,dpl
cpl a
clr c
inc a
mov dpl,a
mov a,dph
cpl a
addc a,#0
mov dph,a
jnz asc_b
asc_0: mov a,dpl
dec a
jnz asc_b
mov r1,#0fh
mov r2,#0fh
mov r3,#0fh
mov r4,#0fh
mov a,#0fh
ajmp asc_out
asc_b: mov r1,dpl ;为负数处理
mov r2,dph
acall bin_bcd
mov a,b ;还原小数位数
add a,#7
mov r0,a
acall ascii_bin
mov r6,a ;小数位数暂存r6
acall bcd2_bcd1
mov a,r4
dec a
jnz asc_100 ;数据小于-199.9时显示-199.9
mov r4,#23h
ajmp asc_sw
asc_100:mov r4,#23h
mov r3,#9
mov r2,#19h
mov r1,#9
ajmp asc_sw_1
asc_ok: acall bcd2_bcd1 ;正常数据处理程序
asc_sw: mov a,r4 ;清除有效位前面的0
jnz asc_sw_1
mov r4,#1ch
mov a,r3
jnz asc_sw_1
mov r3,#1ch
asc_sw_1:clr a
asc_out:ret
;------------每字节两位BCD码转换为每字节一位BCD码子程序
;入口:r3=个位及十位BCD码,r4=百位及千位BCD码,r6=小数位数
;出口:r1=个位BCD码,r2=十位BCD码,r3=百位BCD码,r4=千位BCD码
bcd2_bcd1:mov a,r3 ;个位及十位BCD数处理
anl a,#0fh
mov r1,a
mov a,r3
anl a,#
swap a
mov r2,a
mov a,r4 ;百位及千位BCD数处理
anl a,#0fh
mov r3,a
mov a,r4
anl a,#
swap a
mov r4,a
mov a,r6 ;加入小数点信息
jz bcd2_out
add a,#ar1
mov r0,a
mov a,@r0
add a,#10h
mov @r0,a
bcd2_out:ret
;---------------ASCii4_BCD3转换子程序
;入口:r0=四字节ASCII码首地址
;出口:r5,r4,r3从高至低依次存放BCD码(r3,r4各存2位,r5存1位)
ascii4_bcd3:acall ascii4_bin2
mov dpl,r1
mov dph,r2
acall bin_bcd
ret
;---------------BIN_BCD转换子程序
;入口:r1=BIN低字节,r2=BIN高字节 共2字节