;===================程序说明======================
/* 该程序就是从串口发送一串字符: COUNT DATA1 DATA2 ……
COUNT:要显示的字符个数
DATA1 DATA2……是要显示的字符
如:05 00 01 02 03 04 则单片机数码管上显示 0 1 2 3 4
值得注意的是:数码管的扫描显示,发送数据与显示数据的冲突
*/
程序源代码如下:
DATA_OK BIT 01H ; 数据准备好
RECE BIT 02H ;允许接收
RC EQU 42H ;接收数据 计数
DC EQU 40H ;显示数据计数
RP EQU R0 ;数据接收指针
REI EQU 41H ;接收数据寄存器
COUNT EQU 30H ;显示的数据个数
DATA1 EQU 31H ;第一个数据
; …………
; 其他数据
;
ORG 0000H
JMP MAIN
ORG 0023H
JMP INT_SERAIL
ORG 0030H
;======================串口中断服务子程序===================
INT_SERAIL:
PUSH PSW
PUSH ACC
JNB RI, L2
CLR RI
JNB RECE, EXIT ;不允许接收
MOV A,RC
CJNE A,#0,L1 ;接收数据个数
CLR DATA_OK ;开始接收数据
INC RC ;数据计数加一
MOV COUNT,SBUF
JMP EXIT
L1: MOV A,RC
CJNE A, COUNT, L3 ;数据是否接收完毕
MOV @RP,SBUF ;接收最后一个数据
MOV RC,#0 ;接收完以后数据计数清0
MOV RP,#DATA1 ;指针重定位
SETB DATA_OK ;可以显示数据
CLR RECE ;不能接收数据,除非一轮显示完成
JMP EXIT
L3: MOV @RP,SBUF
INC RP
INC RC
JMP EXIT
L2: CLR TI
EXIT: POP ACC
POP PSW
RETI
;===================== MAIN =================================
;初始化
MAIN:
MOV SP,#50H ;堆栈
MOV TMOD,#20H ;串口初始化
MOV SCON,#50H
MOV TH1,#0F3H
MOV TL1,#0F3H
SETB TR1 ;中断初始化
SETB EA
SETB ES
SETB RECE ;位定义初始化
CLR DATA_OK
MOV RC ,#0 ;RAM,寄存器初始化
MOV DC, #0
MOV RP, #DATA1
MAINLOOP: JNB DATA_OK, MAINLOOP ; 若没有数据准备好泽则不显示数据
MOV DC, COUNT ;
MOV R1, #DATA1 ; r1做数据显示的指针
INC DC ; 边界处理
CALL DISPLAY ; 显示
SETB RECE ; 一轮显示完以后可以再次发送别的数据
JMP MAINLOOP
;======================显示子程序=============================
DISPLAY: DJNZ DC, DIS1
RET
DIS1: MOV A, @R1
MOV DPTR,#TALBE
MOVC A,@A+DPTR
MOV P1,A
MOV A,DC
CJNE A,#8,DIS2
CLR P3.4
CLR P3.3
CLR P3.2
CALL DELAY ;显示一个字符后延时一段时间
INC R1
JMP DISPLAY
DIS2: CJNE A,#7, DIS3
CLR P3.4
CLR P3.3
SETB P3.2
CALL DELAY
INC R1
JMP DISPLAY
DIS3: CJNE A,#6, DIS4
CLR P3.4
SETB P3.3
CLR P3.2
CALL DELAY
INC R1
JMP DISPLAY
DIS4: CJNE A,#5, DIS5
CLR P3.4
SETB P3.3
SETB P3.2
CALL DELAY
INC R1
JMP DISPLAY
DIS5: CJNE A,#4, DIS6
SETB P3.4
CLR P3.3
CLR P3.2
CALL DELAY
INC R1
JMP DISPLAY
DIS6: CJNE A,#3, DIS7
SETB P3.4
CLR P3.3
SETB P3.2
CALL DELAY
INC R1
JMP DISPLAY
DIS7: CJNE A,#2, DIS8
SETB P3.4
SETB P3.3
CLR P3.2
CALL DELAY
INC R1
JMP DISPLAY
DIS8: CJNE A,#1, DIS9
SETB P3.4
SETB P3.3
SETB P3.2
CALL DELAY
INC R1
JMP DISPLAY
DIS9: RET
DELAY:MOV R6,#10H
L6: MOV R7,#0FFH
L7: DJNZ R7,L7
DJNZ R6,L6
RET
TALBE: DB 0C0H,0F9H,0A4H,0B0H
DB 099H,092H,082H,0F8H
DB 080H,090H
END
这个程序大约1个小时就搞定了,下载到板子上也是一次成功,终于感觉到流程图的神奇魅力!建议大家在写程序之前一定先画流程图,虽然看上去时间花得比较多,其实恰恰相反,如果你没有画流程图,在程序写完之后,除非你非常有经验,心思非常缜密,否则你会发现你花在调试程序上的时间将是你写程序所花时间的几倍甚至上十倍。而流程图的魅力正在于此,他可以很方便地查错,同时也训练了你的思维能力!
评论