zl程序教程

您现在的位置是:首页 >  IT要闻

当前栏目

51单片机学习 串行口通信实验

2023-03-20 15:31:46 时间

文章目录

一、实验目的

掌握串行口工作方式的程序设计,掌握单片机通信程序设计方法。

二、原理

发送指令:MOV SBUF,A 接收指令:MOV A,SBUF

1、串行口控制寄存器 SCON (地址:98H)

  • TI:发送中断标志位。发送前必须要用软件清零。
  • RI:接收中断标志位。接收前必须要用软件清零。
  • SM2:多机通信控制位。

2、电源控制寄存器 PCON (地址:87H)

3、发送/接收一帧数据结束与否?

(1)查询方式: 发送程序:发送一个数据-----查询TI-------发送下一个数据(先发后查) 接收程序:查询RI--------读入一个数据---------查询RI-----(先查后收)

(2)中断方式: 发送与接收共用一个串口中断0023H, 中断响应后服务程序中应判断是哪个中断。 如:JB TI , LOOP ;TI=1,跳转至 LOOP 发送程序

发送程序:发送一个数据-----等待中断,在中断服务程序中发送下一个数据 接收程序:等待中断,在中断服务程序中接收数据 注:不管是查询还是中断,发送或接收数据后,一定要软件清 TI 或 RI 注意区分:CLR TI; CLR T1

三、实验内容

1、重复发送同一个数据,观察 TXD 端输出的波形。

P3.1 复用为串行发送端 TXD,将其接至示波器,观察输出波形。注意观察 8 位数据位前后的起始位和停止位。

例:串口设为工作方式 1,发送数据 EDH=11101101B。从低位开始发送,8 位数据、 1 位起始位(低电平)、1 位停止位(高电平)。

仿真电路如下:

汇编语言程序如下:

      ORG   0000H
      JMP   MAIN
      ORG   0040H
MAIN:	
      MOV   R0,#0EDH       ;将要发送的数据1放在R0中
      MOV   TMOD,#20H      ;将定时器T1作为波特率发生器  定时工作方式2
      MOV   TL1,#0EEH      ;初始化定时器初值
      MOV   TH1,#0EEH
      SETB  TR1           ;允许T1定时
      MOV   SCON,#40H     ;串口工作方式1,发送
      MOV   PCON,#0       ;波特率不加倍
Loop:	
      MOV   A,R0          ;将要发送的数据送入累加器中
      MOV   SBUF,A        ;将要发送的数据写入发送缓冲区SBUF,启动串口发送数据
L1:
      JNB   TI,L1         ;判断发送完申请中断标志位,循环等待数据发送完
      CLR   TI            ;软件清除发送中断标志位,保证下一帧数据能发送
      MOV   TH1,#0EEH     ;重装定时器初值
      MOV   TL1,#0EEH
      SJMP  Loop          ;循环发送同一个数据  
      
      END

仿真结果如下:

2、自发自收。将代码段中定义的 10 个数据,通过串口发送和接收,将接收到的数据送 P1 口以 LED 灯显示,并送存内部数据存储空间 60H 开始的单元。要求:数据的发送接收,采用中断方式

仿真电路如下:

提示如下:

  • 1、P3.0 接收端 P3.1 发送端
  • 2、每个数据送 LED 灯显示,要加延时程序
  • 3、进入中断服务程序,要判断是发送中断,还是接收中断

汇编语言程序如下:

      ORG   0000H
      LJMP  MAIN
      ORG   0023H     ;串口中断入口
      LJMP  BREAK      
      ORG   0100H
MAIN:
      MOV   DPTR,#TAB   
      MOV   R0,#00H     ;R0控制循环次数,同时也存放偏移地址
      MOV   R1,#60H     ;接收的内容存放在60H开始的单元中
      MOV   R2,#0AH       ;要发送的数量
      MOV   R3,#0AH       ;要接收的数量
      
      MOV   TMOD,#20H    ;定时器工作方式2
      MOV   PCON,#00H    ;串口波特率不加倍
      MOV   SCON,#50H    ;串口工作方式1,允许接收;没有校验位
      MOV   TH1,#0EEH    ;定时器T1作波特率发生器,fosc=11.0592Hz时,RB=1600pbs
      MOV   TL1,#0EEH
      SETB  TR1          ;启动定时器T1
      SETB  ES          ;串口允许中断
      SETB  EA           ;开中断
      MOV   A,R0        ;偏移地址
      MOVC  A,@A+DPTR
      MOV   SBUF,A      ;将待发送数据放入发送缓冲区
      DEC   R2
      SJMP  $           ;等待中断 
BREAK:  
      JBC    RI,LOOP    ;判断时接收中断还是发送
      CLR    TI         ;不是接收中断,则是发送中断引起的中断服务;清零发送中断益处标志
      INC    R0         ;上一帧数据发送完,偏移地址+1,发送下一帧数据
      MOV    A,R0       ;将偏移地址放到A中
      MOVC   A,@A+DPTR  ;查表,取出要发送的数据
      MOV    SBUF,A     ;将待发送数据放入发送缓冲区
      DJNZ   R2,LOOP1   ;判断数据是否发送完毕    
LOOP: 
      MOV    A,SBUF    ;读SBUF,访问接收数据寄存器
      MOV    @R1,A     ;将接收到的数据放在60H开始的单元中
      MOV    P1,A      ;把接收到的数据送到P1口显式
      ACALL  DELAY 
      INC    R1
      DJNZ   R3,LOOP1      
LOOP1: RETI  ;中断返回
DELAY:
      MOV    R5,#10                  ;延时子程序     
D1:
      MOV    R7,#0FFH
D2:
      MOV    R6,#0A0H
      DJNZ   R6,$
      DJNZ   R7,D2
      DJNZ   R5,D1
      RET      
TAB: DB 0AAH,99H,88H,77H,66H,55H,44H,33H,22H         
     END

仿真结果如下:

60H单元存放数据如下:

作者:叶庭云 CSDN:https://yetingyun.blog.csdn.net/