正文

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

阅读(1921) | 评论(0)


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

评论

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