注册 登录
编程论坛 汇编论坛

新手求指教。PC和单片机的串口通信程序,三八译码器位选,数码管显示不正确,错误不知道在哪。程序如下

huayanxia 发布于 2018-11-18 17:44, 2663 次点击
只有本站会员才能查看附件,请 登录

 ORG 0000H
AJMP MAIN
ORG 0023H
AJMP IT_RXD
ORG 0030H
MAIN:   
        //设置T1为方式2,允许串口中断接收
        MOV TMOD,#20H         ;0010 0000  定时方式  方式2八位自动重转载   
        MOV TH1,#0FAH         ;22.1184MHZ:208     //12MHZ:230   
        MOV TH0,#0FAH         ;22.1184MHZ:208     //12MHZ:230
        SETB TR1             ;开启定时器
    MOV R6,#0
        MOV SCON,#50H        ;串行方式1,允许接受
        SETB EA                 ;开启总开关
        SETB ES              ;允许串行口中断
         MOV  DPTR,#TAB1     //字码表首地址
         CLR   A                 //清零
      MOV R0,#0                 //数码管赋初值R0-R3用于数码管赋值   R6计数用于选择数码管
      MOV R1,#0
      MOV R2,#0
      MOV R3,#0
                     
WAIT:    //数码管扫描
        //数码管1
        MOV A,R0             ;R0赋值给A
        MOVC A,@A+DPTR      ;DPTR地址初始化时指向TAB1,MOVC为偏移赋值,即当A=A+DPTR,A为1时A=3FH,为2时A=06H..以此类推到9
        MOV   P2,A              ;P2输出到数码管
        CALL  DELAY          ;延时5ms        
         //数码管2  
        MOV A,R1
        MOVC  A,@A+DPTR  
        MOV   P2,A  
        CALL  DELAY         
        //数码管3
        MOV A,R2
        MOVC  A,@A+DPTR
   
        MOV   P2,A  
        CALL  DELAY
        //数码管4
        MOV A,R3
        MOVC  A,@A+DPTR
   
        MOV   P2,A           
        CALL  DELAY
          SJMP WAIT
IT_RXD://串口发送及接收中断程序
        JB RI,AD_R6              ;判断RI是否为1,为1则说明是串口接收中断进入AD_R6,否则是发送中断则不做处理。

      
RET_IT_RXD:    RETI
        
DELAY:  MOV   R4,#10
D1:     MOV   R5,#80 ;1US
        DJNZ  R5,$ ;2US             (80*2+1)*2*40+1+1
        DJNZ  R4,D1
        RET


CLEAR_R://串口发送过来的是S则清零
      MOV R0,#0
      MOV R1,#0
      MOV R2,#0
      MOV R3,#0
      MOV R6,#0
      JMP RET_IT_RXD

VALUE_R:
       MOV B,R7   
      
    CLR A     
      ANL B,#0FH         //保留低八位,高八位清零
      CJNE R6,#1,TWO      //R6=1跳ONE,不等跳TWO
      JMP ONE
      JMP RET_IT_RXD

//每进入一次接收中断选择赋值给R0还是R1还是R2还是R3,当R6=1时赋值给R0,R6=2时赋值类推。。
ONE:  MOV R0,B                 //B赋给寄存器R0,中断返回
      JMP RET_IT_RXD

TWO:  CJNE R6,#2,THREE      //r6=2将B付给寄存器R1并返回中断,否则跳THREE
      MOV R1,B
      JMP RET_IT_RXD

THREE:CJNE R6,#3,FOUR        //R6=3,     将B付给寄存器R2并返回中断     否则跳FOUR
        MOV R2,B
      JMP RET_IT_RXD

FOUR: CJNE R6,#4,RET_IT_RXD           //R6=4, 将B付给寄存器R3并返回中断     否则直接中断返回
       MOV R3,B
      MOV R6,#0
      JMP RET_IT_RXD

 AD_R6: INC R6        
         CLR RI
        MOV R7,SBUF            ;将串口接收的数据赋值给R7         
        MOV A,R7
           MOV P1,A               //p1连三八译码器        
       ADD A,#01H              ;将串口接收的数据加一重新发送给PC
        MOV SBUF,A     
        CLR A
        CJNE R7,#83,VALUE_R  ;判断字符是否为S,是的话则进入CLEAR_R清零,不是的话就进入VALUE_R给R0-R3赋值
        JMP  CLEAR_R
 JMP RET_IT_RXD
TAB1:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,88H,83H,0C6H,0A1H,86H,8EH
END


3 回复
#2
wlrjgzs2018-11-18 21:21
留下联系方式可以吗?
#3
huayanxia2018-11-18 21:55
回复 2楼 wlrjgzs
QQ..785792499
1