正文

在stc12c2052ad实验板上编的数码管扫描与串口通信结合的程序 .2012-08-15 11:17:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/enc999/53718.html

分享到:

;===================程序说明======================
/*  该程序就是从串口发送一串字符: 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个小时就搞定了,下载到板子上也是一次成功,终于感觉到流程图的神奇魅力!建议大家在写程序之前一定先画流程图,虽然看上去时间花得比较多,其实恰恰相反,如果你没有画流程图,在程序写完之后,除非你非常有经验,心思非常缜密,否则你会发现你花在调试程序上的时间将是你写程序所花时间的几倍甚至上十倍。而流程图的魅力正在于此,他可以很方便地查错,同时也训练了你的思维能力!

阅读(1572) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册