首 页文档资料下载资料维修视频包年699元
请登录  |  免费注册
当前位置:精通维修下载 > 文档资料 > 家电技术 > 维修教程知识 > 电子制作
51单片机串行通信程序的设计及调试
来源:本站整理  作者:佚名  2010-08-11 09:54:24



  3、初始化程序的设计

       在51汇编集成开发环境下,初始化程序的设计可以借助于其中的辅助工具很方便地完成。从[辅助工具]-[初始化设置]-[波特率设置]我们可以打开这个辅助工具(见图3)。

  你只要设置好晶振频率;选择工作方式1或工作方式夏设定好所需的波特率,就自动地选择好了定时器l的工作方式,计算出了初值,并给出了参考的初始化程序。你只要将这个参考程序复制到你的应用程序中就可以了。

  我们假定单片机系统的晶振频率为6MHz,选择串行口的工作方式为方式1(8位UART,由定时器1作为波特率发生器),数据传输的波特率为600,此时我们得到定时器l应工作在方式2,TH1年HL1的初值均为1AH,参考程序为:

  UART初始化:MOV SCON,#50H;选择串行口的工作方式为方式1

      MOV  PCON,#0OH;  选择SMOD=0MOV
     TMOD,#20H;定时器1设置为方式2,软件启动
     MOV TH1,#E6H;设置TH1-的初值为E6H
     MOV TL1,#E6H;设置TL1的初值为E6H
     CLR ET1;关闭定时器1中断,作为波特率发生器用;
     CLR ES;若采用查询方式通讯,需关闭串行口中断;
     SET.B ES;若采用中断方式通讯,需打开串行口中断
     SETB TR1;启动定时器1
     由于51汇编集成开发环境可以识别中文,将标号用中文来表示,使程序的可读性更强。

  4、查询方式下串行通信程序的设计

      若采用查询方式进行串行通讯,在初始化程序中需关闭串行口中断。

  (1)发送数据的程序设计

       采用查询方式发送数据之前,必须查询标志位TI的状态,当TI=0时,表明串行口未准备好,不可以发送数据;当TI=1时,表明串行口已准备好,可以发送数据。在发送数据前,必须将TI复位。基本流程见图4。


  下例程序是采用查询方式发送一个数据块的子程序,其入口条件是:待发送数据的起始地址在DPTR中,发送数据的字节数在R6R7中,数据采用偶校验。

  发送入口:CLR C
      发送:MOVX  A,@DPTR;读取待发送的数据
      MOV    C,P
      MOV.TB8,C;偶校验位传入 TB8SD2:
      JBC    TI,SD3;查询TI,等待串行口准备好
      AJMP  SD2
      MOV   SBUF,A;发送数据
      SD3:CJNE    R6,#0,修改发送指针
      CJNE R7,#O,修改发送指针
      RET;数据块发送完,退出发送子程序修改发送指针:
      CLR CMOV    A.R7SUBB  A,#1
      MOV    R7.AMOV    A,R6
      SUBB  A,#O
      MOV    R6,A
      SD4:INC DPTR
      AJMP  发送

      (2)接收数据的程序设计

      串行口在可靠接收一个字节的数据后,会自动将SCON中的RI置“1”,查询程序就是查询RI中的内容,在RI=1时,将接收到的数据(SBUF中的内容)保存到指定的地址。在接收一个数据块时,其数据块的字节数一般有两种方式确定,一种是事先约定好的固定字节数,另一种是在数据块的开始处用两个字节来指明字节数。

  下例程序是采用查询方式接收一个数据块的子程序,其入口条件是接收数据存放的起始地址在DPTR中,接收数据的字节数事先约定好存放在R6R7中,数据采用偶校验。

  接收入口:CLR C
      查询:JBC  RI,接收;查询RI,等待接收的数据到达AJMP 
      查询接收:MOV    A,SBUF偶校验:
      MOV C,RB8ANL    C.PSW.O
      JC保存
      MOV    C,RB8ORL    C,PSW.O
      JNC    保存
      LJMP  ERR2;转出错处理
     保存:MOVX   @DPTR,AINC DPTRDJNZ  R7,查询
      DJNZ  R6,查询
      RE7
      ERR2:……;出错处理

      5、中断方式下串行通信程序的设计

      采用中断方式进行串行通信,应在初始化程序中打开串行口中断。若串行口已准备好,可以发送数据时,TI=1,就引发中断,若串行口可靠接收了一个字节的数据后,RI=1,也引发中断。数据的接收与发送是在中断的服务过程中完成的。

  由于RI与TI共用一个中断入口,所以在进入中断服务时必须查询RI或TI,以确定发送数据还是接收数据,此外,由于RI与TI不能自动清除,所以在中断服务程序中还必须清除RI或TI标志。

  下例是发送与接收数据的中断服务程序。设待发送数据在R0所指向的单元中,接收的数据存放在R1所指向的单元中,发送与接收的数据均采用偶校验。

  串行中断入口:JBC  RI,接收;若为RI中断,转接收数据,同时清除RI
       发送:CLR TI;TI中断,清除TI,准备发送数据
       MOV    A,@R0;读取待发送的数据
       MOV    C,P
       MOV TB8,C
       偶校验位传入TB8
       MOV    SBUF,A;
       RETI
       接收:MOV  A,SBUF
        偶校验:MOV  C,RB8
        ANL    C,PSW.0
        JC保存
        MOV    C,RB8
        ORL    C,PSW.0
        JNC    保存

上一页  [1] [2] 

关键词:

文章评论评论内容只代表网友观点,与本站立场无关!

   评论摘要(共 0 条,得分 0 分,平均 0 分)
Copyright © 2007-2017 down.gzweix.Com. All Rights Reserved .
页面执行时间:16,054.69000 毫秒