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

发布者:悠闲自在最新更新时间:2022-06-28 来源: eefocus关键字:C51  串行通信  仿真调试 手机看文章 扫描二维码
随时随地手机看文章

两种通信方式

串行通信:

串行通信是将数据字节分成一位一位的形式在。

并行通信:

并行通信通常是将数据字节的各位用多条数据线同时进行传送 。


串行通信又分两种

同步通信

同步通信就是对发送方和接收方的时钟实行直接控制,使双方的数据传输达到完全同步。此时数据以位的形式连续发送

异步通信

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


波特率

计算

波特率用来衡量数字信号传输的速率,其大小为每秒传输二进制数的位数,单位为: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        

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 != '')           //判断字符串是否发送完毕

 {

  putchar(*dat);        //发送单个字符

  dat++;                 //字符地址加1,指向先下一个字符

 }

}


实验原理图如下

原理图十分的简单,只需要RX-TX,TX-RX,即可

在这里插入图片描述

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

在这里插入图片描述

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

运行后在这里点开

在这里插入图片描述

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

在这里插入图片描述

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


附上打包的工程文件:

https://download.csdn.net/download/Alangman/18480056

关键字:C51  串行通信  仿真调试 引用地址:C51编写串行通信,在proteus中仿真调试————终极保姆级教学

上一篇:超声波模块HC-SR04调试经验分享
下一篇:c51语言设计数码管,中断设计1s显示0~F,采用proteus仿真

推荐阅读最新更新时间:2024-11-11 09:25

Keil C51中的优化级别及优化作用
级别 说明 0 常数合并:编译器预先计算结果,尽可能用常数代替表达式。包括运行地址计算。 优化简单访问:编译器优化访问8051系统的内部数据和位地址。 跳转优化:编译器总是扩展跳转到最终目标,多级跳转指令被删除。 1 死代码删除:没用的代码段被删除。 拒绝跳转:严密的检查条件跳转,以确定是否可以倒置测试逻辑来改进或删除。 2 数据覆盖:适合静态覆盖的数据和位段被确定,并内部标识。BL51连接/定位器可以通 过全局数据流分 ,选择可被覆盖的段。 3 窥孔优化:清除多余的MOV指令。这包括不必要的从存储区加载和常数加载操作。当存 储空间或执行时间可
[单片机]
[C51代码]DS1302驱动
/*********************ds1302.c**********************/ #include Atmel/AT89X51.h #include link.h #include ds1302.h /*******************变量定义********************/ uchar co de WeekTab = { //闰年月星期表 (3 5) + 31,//1月 (6 5) + 29,//2月 (0 5) + 31,//3月 (3 5) + 30,/
[单片机]
关于C51编译器的声明标识符
data 128字节的内部数据数据存储空间(00h~7Fh)。可直接或间接访问。全部或部分的堆栈可能保存在此区域中。 idata 间接数据。256字节的内部数据存储空间(00h~FFh。全部或部分的堆栈可能保存在此区域中。此区域包括data区和data区以上的128字节。 sfr 特殊功能寄存器。CPU寄存器和外围部件控制/状态寄存器,只能通过直接地址访问。 pdata 分页的外部数据(256字节)或片上扩展RAM(XRAM)。MA805-64有256字节片上pdata存储器它与片上xdata存储器共存。 xdata 外部数据或片上扩展RAM(XRAM)。MA805-64有1024字节的片上xd
[单片机]
在STM32F103C8微控制器中使用RS-485串行通信
  通信协议是数字电子和嵌入式系统的组成部分。只要有多个微控制器和外围设备的接口,就必须使用通信协议来交换大量数据。有多种类型的串行通信协议可用。RS485 是串行通信协议之一,用于工业项目和重型机械。   本教程是关于在 STM32F103C8 微控制器中使用RS-485 串行通信。   在本教程中,Master STM32F103C8 具有三个按钮,用于通过使用 RS-485 串行通信来控制 Slave Arduino Uno 上的三个 LED 的状态。   RS-485 串行通讯   RS-485 是一种不需要时钟的异步串行通信协议。它使用一种称为差分信号的技术将二进制数据从一个设备传输到另一个设备。   那么这种差
[单片机]
在STM32F103C8微控制器中使用RS-485<font color='red'>串行通信</font>
SPI总线单片机发送数据的C51程序
关于spi协议见: http://hi.baidu.com/gilbertjuly/blog/item/0be222eeac9abae5cf1b3e38.html ISD4002芯片资料参考: http://download.csdn.net/source/1208805 以下是单片机spi通信的通用程序,在不同晶振情况下可能需调整延时。这里单片机晶振为11.0592MHz。 _nop_();语句指延迟一个机器周期,约1us左右。写1bit约10us,spi传输率约100kbit/s。 程序中只用了MOSI,/SS,SCLK信号,没有用MISO信号。 #include REGX52.H #include string
[单片机]
C51单片机内存优化
  52本身有256B的数据存储区,如果没在意一些细节,很容易出现RAM超过128就报错的情况。现讲其问题解释如下:   最常见的是以下两种:   ① 超过变量128后必须使用compact模式编译,实际的情况是只要内存占用量不超过256.0,就可以用 small 模式编译   ② 128以上的某些地址为特殊寄存器使用,不能给程序用。与 PC 机不同,51 单片机不使用线性编址,特殊寄存器与 RAM 使用重复的重复的地址。但访问时采用不同的指令,所以并不会占用 RAM 空间。   ③是否把一些固定的代码存贮到了CODE区。如果把没变化的数据也存储到DATA去,就太浪费了!   由于内存比较小,一般要进行内存优化,尽量提高内存的使用
[单片机]
C51程序设计嵌套设计
C语言的基本规则是有限的,可把这有限的规则组合与嵌套起来,就实现了多种多样的功能。 常量与变量本质是值,不同的变量只是存储结构的不通。表达式最终也是一个值,所以可以通用,可以嵌套。 指针变量存放的是地址。数组名不是变量,而是地址常量。数组是相同结构的变量的集合。数组指针与数组名可以通用。 从本质上来说,没有多维数组的存在。因为c语言允许数组元素可以为任何类型的对象,可以是整型变量,字符型变量,结构体变量,当然也可以是数组。所以,多维数组无非就是一维数组的嵌套而已。掌握了这一点,就可以理解二维数组名可以看作是指向指针常量(一维数组名)的指针常量。就这样一路指下去,一直指到底才是变量名。 结构体(structure),与数组不同的地方
[单片机]
单片机C语言C51程序中的基本结构
一.顺序结构 顺序结构是最基本、最简单的结构,在这种结构中,程序由低地址到高地址依次执行,如图给出顺序结构流程图,程序先执行A操作,然后再执行B操作。 二.选择结构 选择结构可使程序根据不同的情况,选择执行不同的分支,在选择结构中,程序先都对一个条件进行判断。当条件成立,即条件语句为“真”时,执行一个分支,当条件不成立时,即条件语句为“假”时,执行另一个分支。如图:当条件S成立时,执行分支A,当条件P不成立时,执行分支B。 在C51中,实现选择结构的语句为if/else,if/else if语句。另外在C51中还支持多分支结构,多分支结构既可以通过if和else if语句嵌套实现,可用swith/case语句实现。
[单片机]
单片机C语言<font color='red'>C51</font>程序中的基本结构
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved