导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→初学者:有关单片机接收字符的命令,我不太懂,请求您的帮助![weeknjzy]

 *第7907篇: 初学者:有关单片机接收字符的命令,我不太懂,请求您的帮助!

  
楼 主:weeknjzy 2003年1月24日10:15
 初学者:有关单片机接收字符的命令,我不太懂,请求您的帮助!
老古版主:
    您好!
    有关单片机接收字符的命令,我不太懂,请求您的帮助!最好用汇编,在此非常感谢!
急急!
    单片机与计算机通讯,接口协议:RS232、9600BPS、8位数据,1停止位,无效验。当计
算机发送ASCII命令“<C X1 X2 >”其中包括<>在内,X1 X2为00~99,也就是P0(X1)、P2
(X2)口数码管要显示的数字,数码管为共阳接法。 
  
2楼:白莲 2003年1月24日10:49
 其实不难
我不知道你用的什么型号的单片机,比如:我以AT89C51为例,串口模式1,T1方式2具有8位
重装,根据晶振选择9600BPS,然后要建立单片机与PC之间的通讯协议,例如引用你的原文
“当计算机发送ASCII命令“<C X1 X2 >”其中包括<>在内”你一共发了多少个ASCII码给你
的单片机,要我来数的话应该是8
个:"<";   "C";   " ";  "X1";   " ",   "X2";  " ";  ">";  然后你和你的协议对应一
下不就知道了吗?  

  
3楼:weeknjzy 2003年1月24日11:34
 我还是不太懂?请求帮助?
白莲老师:
     您好!
     我是刚学单片机的,我还是不太懂,我用的是AT89C51,对于8个ASCII
码:"<";   "C";   " ";  "X1";   " ",   "X2";  " ";  ">"; 我不知道如何用汇编编写,
您能帮我忙吗? 多谢了!!
  
4楼:白莲 2003年1月24日11:48
 建议。。。
我个你提供个网页:  <a href=http://wwd.8u8.com/exam/ascii.htm target=_blank>    </a>  
你的问题应该没了。
  
5楼:weeknjzy 2003年1月24日12:05
 能不能举个例子?
白莲老师:
    您好!
    对于您来说,就是一件小事,但对于我来说,却是一件大事,很难,您能不能留出一点
时间,帮我这个笨学生的忙,举个列子呢?
  
6楼:白莲 2003年1月24日13:53
 源。。。
        ORG     0000H
        SJMP    START
        ORG     0003H           ;INT0
        LJMP    ZHDI0
        ORG     0030H
START:  MOV     SP,#60H         ;DUI ZHAN
        SETB    EA              ;ZHONG DUAN ZHONG YUN XU
        SETB    EX0             ;INT0 KAI ZHONG DUAN
        SETB    IT0             ;BIAN YAN CHU FA
        MOV     TMOD,#20H       ;T1 MO SHI 2
        MOV     TL1,#0f4H       ;T1 CHU ZHI 4800
        MOV     TH1,#0f4H       ;8 WEI CHONG ZHUANG
        SETB    TR1             ;QI DONG T1
        MOV     SCON,#40H       ;CHUAN KOU 1
        setb    f0
        setb    2eh.7
deng:   jb      2eh.7,deng
        setb    2eh.7
        mov     a,20h
        DEC     A
        ANL     A,#0FH
        MOV     r1,A
        mov     a,21h
        ANL     A,#07H
        SWAP    A
        ORL     A,r1
        mov     sbuf,a
        jnb     ti,$
        clr     ti
        sjmp    deng
;*********************************************************************
;*********************************************************************
ZHDI0:  MOV     P1,#0FFH
        MOV     A,P1
        jnb     f0,DIYI1
        mov     20h,a
        clr     f0
        SJMP    NEXT2
DIYI1:  mov     21h,a
        setb    f0
        clr     2eh.7
next2:  reti
;**********************************************************************
        END
次程序是我INT0中断收数,然后往串口上发送的程序,稍加改造便可!不明白问我吧!


  
7楼:weeknjzy 2003年1月24日14:52
 需要您的帮助!
白莲老师:
    您好!
    也许您从来没有看到过象我这样笨的学生了,我都有些不好意思了,但我这个人,觉得
我不知道的,别人这么说我都不在乎,我只在乎我要读懂它,但我还是不会,并被其他的网
站的人员骂过,我希望你能帮助我?能不能编一下我的程序,并每段用中文注释,我知道我
的要求有点过分了,但我真的没办法,我对自己都有些失望,恳请您帮助!谢谢!哦,显示
部分为把八字数码管。
  
8楼:白莲 2003年1月24日15:59
 经过验证的源代码........
        ORG     0000H
        SJMP    START
        ORG     0023H           ;串口中断
        LJMP    CHUAN           
        ORG     0030H
START:  MOV     SP,#70H         ;设置SP
        SETB    EA              ;总中断允许
        SETB    ES              ;串口中断允许
        MOV     TMOD,#20H       ;T1 方式2
        MOV     TL1,#0FDH       ;晶振11.0592MHz,波特率9600。
        MOV     TH1,#0FDH       ;8位重载
        SETB    TR1             ;启动 T1
        MOV     SCON,#40H       ;串口模式1
        SETB    REN             ;允许接收
        mov     R0,#40H         ;设置RAM 40H为接受缓冲区首地址
        MOV     R1,#30H         ;设置RAN 30H为发送缓冲区首地址
        mov     r5,#16          ;定义接受16个数据
        mov     r6,#16          ;定义发送16个数据
        setb    20h.1           ;定义发送
        sjmp    $
;串口中断服务子程序
CHUAN:  PUSH    ACC
        PUSH    PSW
        JNB     RI,SEND         ;判断是不是接收引起的中断如果是顺序执行,不是一
定是发送,转发送
        MOV     A,SBUF          ;把SBUF里的数据收下来
        mov     @r0,a           ;保存数据
        inc     r0              ;接受缓冲区加1 
        djnz    r5,tiao         ;判断是否接收齐16个数据
        mov     r0,#40h         ;重新设置RAM 40H为接受缓冲区首地址
        mov     r5,#16          ;重新设置接受16个数据计数器
        lcall   renwu           ;调用你的任务子程序,就是收完数想干什么?     
TIAO:   CLR     RI              ;清除发送中断标志为,等待下一次中断的到来
        SJMP    NEXT            ;
SEND:   CLR     TI              ;清除接收中断标志为,等待下一次中断的到来
        CLR     20H.1
NEXT:   POP     PSW
        POP     ACC
        RETI
;你的任务子程序
renwu: ...........
       ...........
       ...........
       ret
;你的发送子程序,在发送前,你要写入你要发送的数据!
SOUT:   MOV     A,@R1
        INC     R1
        MOV     SBUF,A          ;FA SONG SHU JU
        JB      20H.1,$
        SETB    20H.1
        DJNZ    R6,SOUT
        MOV     R1,#30H          ;重新设置RAM 30H为接受缓冲区首地址
        mov     r6,#16           ;重新设置发送16个数据计数器
        RET
帮人帮到底吧!我写的可以说够详细的了,你几乎可以拿来就用!你要仔细看懂了,然后用
到你的硬件上!
       
       

  
9楼:Kuang-chingTsui 2003年2月2日20:28
 Hi, White Lotus Flower
Hi, White Lotus Flower,
Happy to you this Chinse New Year , and say to your wife with your mother and 
father. 
  
10楼:dirty 2003年2月3日10:09
 学51单片机
各位大虾,我想学51单片机,不知需要那些东东。L32K仿真器好用吗?给我个建议好吗?
  
11楼:tm1300 2003年1月24日12:23
 参考
其实“<C X1 X2 >”只需要接收5个有效数据就行了“ ”一般不需要,除非通讯过程中要
求,但也会给定值,因为“ ”为不可见字符,有很宽的范围。例如:02H(一般作为通讯起
始STX),03H(一般作为通讯结束ETX),其接收的ASCII屏幕显示形式都为“ ”。而接收
的ASCII字符,完全可以对应的与其十六进制值进行比较,判别是否正确。
另外,即使你这么发送“<CX1X2>”,其实PC也是发送的也为5个有效字节。
  
12楼:weeknjzy 2003年1月24日12:29
 可不可以更直接一点,用汇编编一下给我看看?
tm1300老师:
      您好!
      可不可以更直接一点,用汇编编一下给我看看?
      非常感谢!帮帮我了!
  
13楼:tm1300 2003年1月24日15:51
 别客气,我不是老师,我们相互学习罢了
  ;该程序采用串口中断来接收单个字符,并进行判断处理的例子,作为参考
;如果以后熟练了,可以开BUFF区,
;严格控制中断处理时间,串口中断来接收单个字符,定时修正,
;并由主程序判断对接收信息的处理
;00H-07H分别用R0-R7表示,作通用工作寄存器
     ;        ;串口数据缓冲区
     WORD2    EQU 09H        ;接收区1-8      
     WORD3    EQU 0AH
     WORD4    EQU 0BH
     WORD5    EQU 0CH
     WORD6    EQU 0DH
     WORD7    EQU 0EH
     WORD8    EQU 0FH
     
;以下是立即数定义     
     STX      EQU 02H       ;start of text
     ETX      EQU 03H       ;end of text
     
;以下是主程序开始
      ORG 0000H
         AJMP MAIN         ;转主程序
      ORG 0023H
         LJMP SCINT        ;转串行口通信中断服务子程序  

      ORG 0030H
;-------------------------------------------
;以下是程序运行初使化
MAIN:    MOV SP,#30H
         CLR PSW.3         ;选定第0组工作寄存器
         CLR PSW.4
         CLR A
         MOV R0,#08H       ;inside ram initialize
         MOV R7,#30
INITIA:  MOV @R0,A
         INC R0
         DJNZ R7,INITIA
;----------------------
;---------------------       
         MOV PCON,#00H
         MOV SCON,#01010000B ;MODE=1 SM2=0 REN=1
         MOV TMOD,#00100000B ;T1:波特率发生器 模式2
         MOV TL1,#0F4H       ;晶振=11.0592M
         MOV TH1,#0F4H
         CLR ET1
         SETB TR1            ;启动波特率 =2400Bps 
;---------------------------
         SETB EA
         SETB ES             ;串行口接收数据开
LOOP:    .....                 ;程序循环体
         .....
         LJMP LOOP
         
;-------------------串口接收-----------        
SCINT:   PUSH ACC
         PUSH PSW
         CLR ES
         CLR RI
         MOV A,SBUF
         CJNE R2,#00H,BYTE1  ;接收WORD1 起始码              
              CJNE A,#STX,REFUSE              
              MOV R2,#01H
              LJMP SCEXIT

BYTE1:   CJNE R2,#01H,BYTE2  ;接收WORD2 地址
              ;CJNE A,#3CH,REFUSE  ;与'  <'比较     
              MOV WORD2,A
              MOV R2,#02H
              LJMP SCEXIT

BYTE2:   CJNE R2,#02H,BYTE3  ;接收WORD3 DATA1
              ;CJNE A,#43H,REFUSE  ;与'C'比较
              MOV WORD3,A
              MOV R2,#03H
              LJMP SCEXIT

BYTE3:   CJNE R2,#03H,BYTE4  ;接收WORD4 DATA2
              ;CJNE A,#X1H,REFUSE  ;与X1H比较
              MOV WORD4,A
              MOV R2,#04H
              LJMP SCEXIT

BYTE4:  CJNE R2,#04H,BYTE5   ;接收WORD5 DATA3
              ;CJNE A,#X2H,REFUSE  ;与X2比较
              MOV WORD5,A
              SJMP DEALDT
              LJMP SCEXIT

BYTE5:  CJNE R2,#05H,BYTE6   ;接收WORD6 DATA4
              ;CJNE A,#3EH,REFUSE  ;与'  <'比较              
              CJNE A,ETX,REFUSE
              LJMP SCEXIT


REFUSE:  LJMP SCRETI         ;数据非法返回区                

DEALDT:  ........            ;中断处理段

SCRETI:  MOV R2,#00H
SCEXIT:  SETB ES
         POP PSW
         POP ACC
         RETI

         END

  
14楼:weeknjzy 2003年1月24日16:17
 非常感谢!
非常感谢您!
  
15楼:Kuang-chingTsui 2003年1月24日13:58
 一个参考程序
         org 0
         jmp main
..............
         org 40h
main:     .             ;初始化程序段
          .
          .             ;设置串口模式1,9600bps
          .             
       setb ren         ;允许接收
         
          .
       mov r0,#xxh      ;r0指向数据缓冲区首地址
          .
loop:  mov a,@r0
       anl a,#0fh       ;屏蔽高四位(ASCII-BCD)
       mov dptr,#font
       mov a,@a+dptr
       mov p1,a
       inc r0
       mov a,@r0
       anl a,#0fh
       mov a,@a+dptr
       mov p2,a
       mov r0,#xxh
          .
          .
          .
;serial port sink 
sin:   jnb ri,$
       clr ri
       mov a,sbuf         ;收到一个字节
       xrl a,#"<"
       jz next
       mov r0,#xxh        ;不是约定的字符返回 
       jmp loop       
next:  
       jnb ri,$
       clr ri
       mov a,sbuf
       xrl a,#">"      
       jnz  next3
       mov r0,#xxh
       jmp loop         ;
next3: mov @r0,a
       inc r0
       jmp next

font:  db LED0,LED1, 。。。,LED9   ;定义LED显示字形编码

你可以根据需要设置串口中断方式接收        

  
16楼:weeknjzy 2003年1月24日15:06
 非常感谢!不过我很笨呀?
非常感谢!不过我很笨,希望您能提供完整,并每段用中文注释一下,在下麻烦您了,有不
对的地方,请您指教!
  
17楼:Kuang-chingTsui 2003年1月24日15:24
 告诉我你哪里
你告诉我你哪里不明白,我的程序基本上是按照你的要求写的,  有些地方我没有加注释是时间
来不及。手头如果有仿真器,抄下这段程序一边调试一边修改(注意,你得自己定义r0指向的数
据缓冲区首地址例如内部ram中的20H), 直到你自己满意为止。行吗?我其实也不是什么高
手,学习单片机完全是逼出来的, 别怕困难,一旦入门,你会很快爱上她的。
  
18楼:weeknjzy 2003年1月24日15:29
 谢谢您!
非常感谢您!
  
19楼:Kuang-chingTsui 2003年1月24日16:36
 参考程序
你把几个人的参考程序都认真读过或仿真测试一下,肯定有收获。
  
20楼:Kuang-chingTsui 2003年1月29日12:09
 一点修改
Sorry,
mov a,@a+dptr   应为   movc a,@a+dptr

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

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


[上一篇主题]:Motorola单片机

[下一篇主题]:Motorola单片机