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

Posted lanmanuesr

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C51编写串行通信,在proteus中仿真调试————终极保姆级教学相关的知识,希望对你有一定的参考价值。


徐浩宇 川师工学院电气2018级 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

以上是关于C51编写串行通信,在proteus中仿真调试————终极保姆级教学的主要内容,如果未能解决你的问题,请参考以下文章

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

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

Keil C51与Proteus联合仿真和调试示例全过程解析

proteus的C51仿真

Arduino与Proteus仿真实例-两个Arduino之间SPI通信仿真

基于AT89C51的十字路口交通灯proteus仿真 _紧急+夜间