C51编写串行通信,在proteus中仿真调试————终极保姆级教学


徐晓峰
2021.5.8

两种通信方式

  • 串行通信:
    串行通信是将数据字节分成一位一位的形式在。
  • 并行通信:
    并行通信通常是将数据字节的各位用多条数据线同时进行传送 。

串行通信又分两种

  • 同步通信
    同步通信就是对发送方和接收方的时钟实行直接控制,使双方的数据传输达到完全同步。此时数据以位的形式连续发送
  • 异步通信
    异步通信的发送方和接收方使用各自的时钟控制数据的发射接收,发送端可以在任意时候发送字符。此时数据以帧的形式连续发送(一个帧数据有十位:分别是一个起始位、八个数据位、一个停止位)

波特率

计算

波特率用来衡量数字信号传输的速率,其大小为每秒传输二进制数的位数,单位为:bps。

  • 例如:最常用的传输速率9600,其意思是,每秒传输960帧数据,一帧数据是十个二进制数。即960*10=9600

设置

一般是将定时中断1(T1)作为波特率的发生器,并且T1采用的是工作方式2。

  • 此时波特率的计算公式为:

    在这里插入图片描述

解释一下公式中的几个含义

  • SMOD:波特率选择位

SMOD属于PCON寄存器,不可位寻址,其可作为波特率加倍标志,置0的时候不加倍,置1的时候串行通信方式波特率加倍

  • fosc:单片机的晶振频率

51单片机仿真一般默认的是12Mhz,但其误差相对较大,精准计时一般采用11.0529MHz

  • 256-T初:每次定时器计数的次数

此时波特率发生器T1是工作方式2(八位数据自动装填),初始值在开始时装入TH1和TL1,正常工作时只有TH1计数,当TH1溢出时把TL1中的初始值重新赋值给TH1,这样就实现了自动装填。
注:八位二进制数的范围是0~255,共256个数

波特率9600的初始化设置

  • 1、 设置定时器T1的工作方式:
    TMOD=0X20;// 使定时器T1处于工作方式2;
  • 2、计算T1的初始值:
    TH1=0XFD;
    TL1=0XFD;// 并装载TH1和TL1,波特率为9600bps时
  • 3、启动T1:
    TR1=1; // 打开T1定时器
    PCON=0X80; //波特率加倍
    SCON=0X50; //设置为工作方式1:8位数据位

串口工作方式的选择

  • 设置SM0和SM1,设置工作方式

    在这里插入图片描述

TI与RI的作用

  • TI是发送中断标志位,当数据发送完成后,TI由硬件置1,TI置1后向CPU提出中断申请,进入中断函数后需要软件置0(TI=0;)
  • RI是接收中断标志位,当数据接收完成后,RI由硬件置1,RI置1后向CPU提出中断申请,进入中断函数后需要软件置0(RI=0;)

两者都在SCON寄存器内


在这里插入图片描述

串行通信实验源码

#include <reg51.h>       
void delay(unsigned int x);
void putchar(unsigned char data1);  //字符发送函数
void putstring(unsigned char *dat);//字符串发送函数
void main(void)
{
 unsigned char c = 0;
 SCON = 0x40;         //串口工作方式设置
 TMOD = 0x20;         //定时器工作方式设置
 PCON = 0x00;         //波特率倍增设置
 TL1 = 0xfd;          //波特率设置
 TH1 = 0xfd;          
 TI = 0;              // 清0发送中断标志         
 TR1 = 1;             //开启定时器
 while(1)
	 {
// 在这里略过笔者个人输出的内容,如果需要输出
// 在while中加入输出,常规C语言即可
//实在写不来的同学,在后面见附件
	 }
}

void delay(unsigned int x)   //延时
{
  unsigned char i;
 while(x--)
 {
   for(i = 0;i < 120;i++);
 }
}
void putchar(unsigned char data1)  
{
 SBUF = data1;               //将待发送的字符送入发送缓冲器
 while(TI == 0);            //等待发送完成
 TI = 0;                     //发送中断标志请0
}

void putstring(unsigned char *dat)
{
  while(*dat != '\0')           //判断字符串是否发送完毕
 {
  putchar(*dat);        //发送单个字符
  dat++;                 //字符地址加1,指向先下一个字符
 }
}


实验原理图如下

  • 原理图十分的简单,只需要RX-TX,TX-RX,即可
    在这里插入图片描述

这里的仿真串口检测在这里!

在这里插入图片描述

可能有些朋友发现仿真运行却打不开这个串口终端…
运行后在这里点开

在这里插入图片描述

就可以查看显示的是什么了,否则是观察不到的


在这里插入图片描述

(究极保姆教学…我尽力了)

附上打包的工程文件:
https://download.csdn.net/download/Alangman/18480056

  • 16
    点赞
  • 55
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值