📄 receive.asm
字号:
;该程序为有线传送系统的接收部分,定时器T0负责显示的扫描,T1作为串口波特率发生器
;串口波特率9600bps,串口接收数据后,根据数据的类型决定是否要产生报警信号(LED,和
;蜂鸣器),串口接收到回车符后开始处理本次接收的数据.串口接收数据的类型号如下:
;当前温度 A1= = 386C ;A:数据类型标志 1:通道号 _ _ :显示为暗 386C:38.6C
;温度上限 B1= = 386C ;B:数据类型标志 1:通道号 _ _ :显示为暗
;报警 C1>p ====
;单稳态时间 D1_ 3494 ;3494:3494H
;当检测到C类型数据后,发出声音,亮发光二极管,并显示当前温度
;工作方式1(P_T0)进行中断处理,
;中断时间为2.5ms, FOSC为12MHZ
DISPPTR EQU 30H ; 显示缓冲区地址30-37
DISPLEN EQU 08H ; LED数
DISPCLK BIT P2.5 ;脉冲端
DISPDIN BIT P2.6 ;164 数据输入口
DISPDATA EQU P0 ;显示数据输出口
DISPR1 EQU 40H
DISPR0 EQU 41H
PSECOND EQU 38H ;时间秒标志,判是否到200个0.0025秒,即0.5秒
second equ 3bh
serialbuf equ 39h
bufsize equ 3ah
FOSC EQU 12
TOUT EQU 1500
TH0DATA EQU (65536-TOUT*FOSC/12)/256 ;定义TH0值
TL0DATA EQU (65536-TOUT*FOSC/12)MOD 256 ;定义TL0值
alert bit 2fh.0
ORG 0000H
AJMP MAIN
ORG 000BH
LJMP P_T0
org 23h
LJMP P_S
;========主程序=========
;
;
ORG 30H
MAIN:
clr ea
mov SP,#6fh
acall init
clr ea
acall dispinit
setb ea
HERE:
SJMP HERE
;-----------------------------------
;
;
;
;
;串行接收程序,接收到回车符后,开始处理接收到的数据
;数据临时存放在serialbuf中,字节数bufsize
;使用工作寄存器组2
;
;
P_S:
jbc RI,P_Srece
jbc TI,P_Ssend
P_Ssend:reti
P_Srece:
push psw
push acc
mov psw,#10h ;RS1=1,RS0=0
mov a,SBUF
CJNE A, #0dh, P_Srece1
mov serialbuf,#50h
mov bufsize,#0
mov r0,#50h
mov r1,#dispptr
mov r2,#8
clr alert ;清除报警标志
mov a,@r0
CJNE A, #"C", P_Srece4
setb alert ;接到C,D时,C:报警(置报警标志),D:单稳态时间显示
setb c
P_Srece4:
P_Srece2:
mov a,@r0
clr c
subb a,#30h ;把ASCII码转换成显示码
mov @r1,a
inc r0
inc r1
DJNZ r2,P_Srece2
setb dispdot ;小数点亮
pop acc
pop psw
reti
P_Srece1:mov r0,serialbuf
mov @r0,a
inc serialbuf
inc bufsize
pop acc
pop psw
reti
;使用工作寄存器组1
P_T0:
MOV TL0,#TL0DATA
MOV TH0,#TH0DATA
PUSH PSW
PUSH ACC
mov psw,#08h ;RS1=0,RS0=1
DIN12 :DJNZ PSECOND,DIN11
inc second
DIN11: jnb alert,DIN13
mov a,second
mov c,acc.1
mov p1.0,c ;LED闪
cpl p1.1 ;声音报警
LCALL DISP
pop acc
pop psw
RETI
DIN13:setb p1.0
setb p1.1
LCALL DISP ;设定时时间为0.05秒,定时20次则一秒
POP ACC
POP PSW
RETI
init:
MOV TMOD, #21H ;定时器T0工作于方式1,
MOV TL0, #TL0DATA
MOV TH0, #TH0DATA ;
mov th1,#0fdh ;9600bps
mov tl1,#0fdh
mov PCON,#00h ;波特率no加倍
mov SCON,#50h ;8bit可变速率,mode 1
clr p2.0 ;设置为接收状态
mov serialbuf,#50h
mov bufsize,#0
clr alert
setb dispdot
mov psw,#10h
MOV DISPR0,#DISPPTR
MOV DISPR1,#DISPLEN
MOV PSECOND,#200
mov psw,#10h
mov r0,#50h
mov r2,#0
mov psw,#0
mov 20h,#0
SETB ET0 ;开定时器T0中断允许
CLR ET1
SETB ES
SETB PS
SETB TR1 ;串口波特率发生器
SETB TR0 ;定时器T0开始定时运行
SETB EA ;开总中断
RET
;=========显示子程序
dispa equ 01h
dispb equ 02h
dispc equ 04h
dispd equ 08h
dispe equ 10h
dispf equ 20h
dispg equ 40h
disph equ 80h
disp8 equ 0ffh-disph
dispdot bit 00h
DISP: MOV A,DISPR1
CJNE A,#DISPLEN,DISP1 ;判断是否显示完毕
CLR DISPDIN ;显示完毕清输入口
DISP1: CLR DISPCLK ;脉冲端送入低电平
MOV DISPDATA,#0FFH ;延时1T
SETB DISPCLK ;脉冲端送入高电平
SETB DISPDIN ;开启输入口
MOV DPTR,#DISPTAB ;取显示数据表
MOV R0,DISPR0
MOV A,@R0 ;取出数据
MOVC A,@A+DPTR ;转化为数据显示字形码
cpl a
jnb dispdot,DISP4
CJNE R0, #35h, DISP4
clr acc.7 ;dispdot light
DISP4:
MOV DISPDATA,A ;显示数据由P0送出
DISP2: INC DISPR0
DJNZ DISPR1,DISP3
MOV DISPR1,#DISPLEN
MOV DISPR0,#DISPPTR
DISP3: RET
DISPTAB: db disp8-dispg,dispb+dispc,dispa+dispb+dispg+dispd+dispe ;0,1,2
db disp8-dispe-dispf,disp8-dispa-dispd-dispe,disp8-dispb-dispe ;3,4,5
db disp8-dispb,dispa+dispb+dispc,disp8,disp8-dispe ;6,7,8,9
db 00h,00h,00h,dispg,dispe+dispc+dispd,00h,00h ;全暗,全暗,全暗,-,u(>),全暗,全暗
db disp8-dispd,disp8-dispa-dispb,disp8-dispb-dispc-dispg ;a,b,c
db disp8-dispa-dispf,disp8-dispb-dispc,disp8-dispb-dispc-dispd ;d,e,f
db disp8+disph,00h,disph,dispg,dispa,dispb,dispc,dispd,dispe ;全亮,全暗,小数点亮,负号,...
db disp8-dispc-dispd,dispg+dispc+dispd+dispe,disp8-dispb ;19H:P 1BH:o 1CH:G
db dispb+dispc+dispd ;1DH:u
dispinit:
mov 30h,#11h ;a
mov 31h,#1
mov 32h,#0dh ;-
mov 33h,#0dh ;-
mov 34h,#03h
mov 35h,#9
mov 36h,#2
mov 37h,#13h ;c
setb dispdot
ret
delayms:
mov b,#250
nop
nop
DJNZ b,$-2
DJNZ acc,delayms
ret
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -