导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→求助:一个单片机串口通信的程序,请帮忙找下错误[kexiner]

 *第47715篇: 求助:一个单片机串口通信的程序,请帮忙找下错误

  
楼 主:kexiner 2007年4月9日19:03
 求助:一个单片机串口通信的程序,请帮忙找下错误
将单片机与计算机通过RS232相连,单片机的P1.4接蜂鸣器,P1.5接红灯,P1.6接绿灯。调试时使用串口调试助手。当从输入18H时,要求蜂鸣器响,19H时红、绿灯一起亮,1AH时红灯亮,1BH时绿灯亮。
下面是我的程序。调试时基本已实现了要求,可是,有一点毛病,比如我先输入18H,蜂鸣器响了,然后我再输入1AH,正确的结果是红灯亮,我的程序是先是蜂鸣器响,然后再发一次,红灯才会亮,我搞了好久,真不知道怎么办了,哪位高手帮帮忙啊! 

ORG    0000H
          LJMP   START
          ORG    0023H    
        
  START:  MOV    SP,#30H
          MOV    TMOD, #21H     ; 定时计数器0工作于方式1,1工作于方式2
          MOV    TH1,  #0FDH    ; 波特率9600
          MOV    TL1,  #0FDH
          MOV    SCON, #50H     ; 置串口为方式1,允许接收
          SETB   TR1
          SETB   EA             ; 开中断
          SETB   ES             ; 允许串口中断   
           
 LOOP:    LCALL  SIN         
          LCALL  DELAY_1
          AJMP   LOOP   
          
 SIN:     MOV    A,SBUF
          JNB    RI,$
          CLR    RI                                
          CJNE   A,#18H,GR        ;如果收到18H,即"↑",蜂鸣器响 
          JNB    RI,$
          CLR    RI
          CLR    P1.4
          LCALL  DELAY_1
          SETB   P1.4
          RET
                    
 GR:      CJNE   A,#19H,RED        ;如果收到19H,即"↓",红、绿灯一起亮
          JNB    RI,$
          CLR    RI
          CLR    P1.6             
          CLR    P1.5
          LCALL  DELAY_1 
          SETB   P1.6
          SETB   P1.5
          SETB   ES
          RET
                    
 RED:     CJNE   A,#1AH,GREEN          ;如果收到1AH,即"→",红灯亮          
          JNB    RI,$
          CLR    RI 
          CLR    P1.5
          LCALL  DELAY_1
          SETB    P1.5
          SETB    ES
          RET
                    
 GREEN:   CJNE   A,#1BH,ENT0           ;如果收到1BH,即"←",绿灯亮         
          CLR    RI
          CLR    P1.6
          LCALL  DELAY_1
          SETB   P1.6
          SETB   ES
          RET
                 
  ENT0:   SETB   ES                   ;允许串行中断
          RETI                        ;中断返回
          
 
         
       
DELAY_1:
        MOV  R0, #0FFH
  LOOP2:MOV  R1, #0FFH
  LOOP1:NOP
        NOP
        DJNZ R1, LOOP1
        DJNZ R0, LOOP2  
        RET
        
        END


 ORG    0000H
          LJMP   START
          ORG    0023H    
        
  START:  MOV    SP,#30H
          MOV    TMOD, #21H     ; 定时计数器0工作于方式1,1工作于方式2
          MOV    TH1,  #0FDH    ; 波特率9600
          MOV    TL1,  #0FDH
          MOV    SCON, #50H     ; 置串口为方式1,允许接收
          SETB   TR1
          SETB   EA             ; 开中断
          SETB   ES             ; 允许串口中断   
           
 LOOP:    LCALL  SIN          ; 返回初始状态( $QQT:0000  <CR>    <LF>   )
          LCALL  DELAY_1
          AJMP   LOOP   
          
 SIN:     MOV    A,SBUF
          JNB    RI,$
          CLR    RI                                
          CJNE   A,#18H,GR        ;如果收到18H,即"↑",蜂鸣器响 
          JNB    RI,$
          CLR    RI
          CLR    P1.4
          LCALL  DELAY_1
          SETB   P1.4
          RET
                    
 GR:      CJNE   A,#19H,RED        ;如果收到19H,即"↓",红、绿灯一起亮
          JNB    RI,$
          CLR    RI
          CLR    P1.6             
          CLR    P1.5
          LCALL  DELAY_1 
          SETB   P1.6
          SETB   P1.5
          SETB   ES
          RET
                    
 RED:     CJNE   A,#1AH,GREEN          ;如果收到1AH,即"→",红灯亮          
          JNB    RI,$
          CLR    RI 
          CLR    P1.5
          LCALL  DELAY_1
          SETB    P1.5
          SETB    ES
          RET
                    
 GREEN:   CJNE   A,#1BH,ENT0           ;如果收到1BH,即"←",绿灯亮         
          CLR    RI
          CLR    P1.6
          LCALL  DELAY_1
          SETB   P1.6
          SETB   ES
          RET
                 
  ENT0:   SETB   ES                   ;允许串行中断
          RETI                        ;中断返回
          
 
         
       
DELAY_1:
        MOV  R0, #0FFH
  LOOP2:MOV  R1, #0FFH
  LOOP1:NOP
        NOP
        DJNZ R1, LOOP1
        DJNZ R0, LOOP2  
        RET
        
        END

  
2楼:dz47s_wxy 2007年4月9日20:41
 回复
在你程序基础上改的,自己研究吧。

        ORG    0000H
        jmp    main
        ORG    0023H
        jmp    SIN
main:
        MOV    SP,#30H
        MOV    TMOD, #21H     ; 定时计数器0工作于方式1,1工作于方式2
        MOV    TH1,  #0FDH    ; 波特率9600
        MOV    TL1,  #0FDH
        MOV    SCON, #50H     ; 置串口为方式1,允许接收
        SETB   TR1
        SETB   EA             ; 开中断
        SETB   ES             ; 允许串口中断
LOOP:
        JMP   LOOP
        ret
SIN:
        JNB    RI,$
        MOV    A,SBUF
        CLR    RI
        CJNE   A,#18H,GR        ;如果收到18H,即"↑",蜂鸣器响
        CLR    P1.4
        LCALL  DELAY_1
        SETB   P1.4
        RETI
GR:
        CJNE   A,#19H,RED        ;如果收到19H,即"↓",红、绿灯一起亮
        CLR    P1.6
        CLR    P1.5
        LCALL  DELAY_1
        SETB   P1.6
        SETB   P1.5
        SETB   ES
        RETI
RED:
        CJNE   A,#1AH,GREEN          ;如果收到1AH,即"→",红灯亮
        CLR    P1.5
        LCALL  DELAY_1
        SETB   P1.5
        RETI
GREEN:
        CJNE   A,#1BH,ENT0           ;如果收到1BH,即"←",绿灯亮
        CLR    P1.6
        LCALL  DELAY_1
        SETB   P1.6
ENT0:
        RETI                        ;中断返回
DELAY_1:
        MOV  R0, #0FFH
LOOP2:
        MOV  R1, #0FFH
LOOP1:
        NOP
        NOP
        DJNZ R1, LOOP1
        DJNZ R0, LOOP2
        RET

        END

  
3楼:kexiner 2007年4月15日09:22
 谢谢
在仿真机上调试通过了,下面是正确的程序:
 ORG    0000H
          LJMP   START
          ORG    0023H       ;串口中断入口地址
          LJMP   SIN
          ORG    0100H
        
  START:  MOV    SP,#35H        ; 修改堆栈地址
          CLR    TXEN
          
          MOV    TMOD, #21H     ; 定时计数器0工作于方式1,1工作于方式2
          MOV    TH1,  #0FDH    ; 计数初值(11.0592MHz晶振下,波特率为9600)
          MOV    TL1,  #0FDH
          MOV    SCON, #50H     ; 置串口为方式1,允许接收
          SETB   TR1            ; 启动定时器1
          SETB   EA             ; 开中断
  
  
   LOOP:  SETB   ES             ; 允许串行中断
          LCALL  DELAY_1
          AJMP   LOOP                                             
                          
 SIN:     CLR    ES                ;关串行中断
          CLR    RI                ;清接收中断标志
          MOV    A,SBUF   
          CJNE   A,#18H,GR         ;测试是否收到18H
          CLR    P1.4              ;如果收到18H,即"↑",蜂鸣器响
          LCALL  DELAY_1
          SETB   P1.4
          
         
                    
 GR:      MOV    A,SBUF
          CJNE   A,#19H,RED        ;测试是否收到19H
          CLR    P1.6              ;如果收到19H,即"↓",红、绿灯一起亮
          CLR    P1.5
          LCALL  DELAY_1 
          SETB   P1.6
          SETB   P1.5
         
                    
 RED:     MOV    A,SBUF
          CJNE   A,#1AH,GREEN      ;测试是否收到1AH          
          CLR    P1.5              ;如果收到1AH,即"→",红灯亮 
          LCALL  DELAY_1
          SETB   P1.5
          
                    
 GREEN:   MOV    A,SBUF
          CJNE   A,#1BH,ENT0      ;测试是否收到1BH            
          CLR    P1.6             ;如果收到1BH,即"←",绿灯亮  
          LCALL  DELAY_1
          SETB   P1.6
         
                 
  ENT0:   SETB   ES 
          RETI                        ;中断返回
          
 
         
       
DELAY_1:                          ;延时程序
        MOV  R0, #0FFH
  LOOP2:MOV  R1, #0FFH
  LOOP1:NOP
        NOP
        DJNZ R1, LOOP1
        DJNZ R0, LOOP2  
        RET
        
        END
          


>>>>>>对该主题发表你的看法

本主题贴数3,分页: [第1页]


[上一篇主题]:关于KS8695X问题请教

[下一篇主题]:求教ADC0809和89C51的连接数据采集系统?