串口初始化
void UARTInit()
{EA = 1;   //打开总中断ES = 1; //打开串口中断SM0 = 0;   SM1 = 1;//串口工作方式1,8位UART波特率可变REN = 1;//串口允许接收TR1 = 1;//启动定时器1TMOD |= 0x20;//定时器1,工作模式2 8位自动重装TH1 = 0xfd;   // 根据下面的公式计算得到TL1 = 0xfd; //设置比特率9600
}


例如:计算9600的波特率

SMOD在没有设置的情况下,默认为0.
SMOD = 0
所以2的0次方为1
2^0 = 1

晶震频率计算:fosc = 11.0592 兆赫兹 = 11.0592 x 1000000 = 11059200赫兹

11059200 ÷ 9600 = 1152 得到波特率公式的被除数

根据公式
1152 ÷ 32 = 36

36 ÷ 12 = 3

256 - T初 = 256 - 3 = 253

将 253 转换为16进制得到 0xFD

TH1 = 0xFD;
TL1 = 0xFD; 设置波特率9600

串口中断
void UART() interrupt 4 {if(RI)//判断接收是否完成{num = SBUF;//读SBUF,读出串口接收到的数据RI = 0;//软件清零接收标志位   }if(TI)//判断是否发送完成TI = 0;//清零发送完成标志位
}

串口工作方式1,8位UART比特率9600

#include <reg52.h>
#include <intrins.h>#define uint unsigned int
#define uchar unsigned charsbit DU = P2^6;//数码管段选
sbit WE = P2^7;//数码管段选
uchar num;//数码管显示的值//共阴数码管段选表0-9
uchar code SMGduan[]= {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F,};
//数码管位选码
uchar code SMGwei[] = {0xfe, 0xfd, 0xfb};/*====================================
函数  :display(uchar i)
参数  :i 显示数值,取值范围0-255
返回值 :无
描述  :三位共阴数码管动态显示
====================================*/
void display(uchar i)
{static uchar wei;      P0 = 0XFF;//清除断码WE = 1;//打开位选锁存器P0 = SMGwei[wei];WE = 0;//锁存位选数据switch(wei){case 0: DU = 1; P0 = SMGduan[i / 100]; DU = 0; break;case 1: DU = 1; P0 = SMGduan[i % 100 / 10]; DU = 0; break;   case 2: DU = 1; P0 = SMGduan[i % 10]; DU = 0; break;     }wei++;if(wei == 3)wei = 0;
}
//定时器0初始化
void timer0Init()
{EA = 1;   //打开总中断ET0 = 1;//打开定时器0中断TR0 = 1;  //启动定时器0REN = 1;//允许串口接收TMOD |= 0X01; //定时器工作模式1,16位定时模式TH0 = 0xED;TL0 = 0xFF; //定时5ms
}
//串口初始化
void UARTInit()
{EA = 1;   //打开总中断ES = 1; //打开串口中断SM0 = 0;   SM1 = 1;//串口工作方式1,8位UART波特率可变REN = 1;//串口允许接收TR1 = 1;//启动定时器1TMOD |= 0x20;//定时器1,工作模式2 8位自动重装TH1 = 0xfd;TL1 = 0xfd;//设置比特率9600
}
void main()//main函数自身会循环
{   timer0Init();//定时器0初始化UARTInit();//串口初始化while(1);
} //定时器0中断函数
void timer0() interrupt 1
{TH0 = 0xED;TL0 = 0xFF; //定时5msdisplay(num); //数码管显示函数
}
//串口中断函数
void UART() interrupt 4 {if(RI)//判断接收是否完成{num = SBUF;//读SBUF,读出串口接收到的数据RI = 0;//软件清零接收标志位  }if(TI)//判断是否发送完成TI = 0;//清零发送完成标志位
}

通过串口发送数据前需要进行的设置
在右边的菜单栏找到串口助手然后

  • 第一步让COM号保持一致
  • 第二步波特率设置为9600
  • 第三步打开串口
  • 第四步发送和接收格式选择HEX格式

修改串口中断中的函数,实现接收缓冲区数据
//串口中断函数
void UART() interrupt 4
{uchar temp;if(RI)//判断接收是否完成{num = SBUF;//读SBUF,读出串口接收到的数据RI = 0;//软件清零接收标志位   temp = num;//SBUF = temp;//写SBUF,把要发送的数据送给发送缓存器}if(TI)//判断是否发送完成TI = 0;//清零发送完成标志位
}

对代码修改后可以通过

串口助手选择文本模式接收和发送数据


ASCII码规定了不同字符是用哪个整数去表示,所以其它字母或数字对应的值可以通过ASCII表查看。


通过串口发送字符串

puts()函数和printf()函数
void main()
{UARTInit(); //串口初始化while(1){TI = 1;puts("Hello Wolrd!");   // 使用puts函数while(!TI);TI = 0;delay(1000);}
}
void main()
{UARTInit(); //串口初始化while(1){TI = 1;printf("Hello Wolrd!");   // 使用printf函数while(!TI);TI = 0;delay(1000);}
}

注:puts()函数和printf()函数区别是

  • puts函数会执行换行操作
  • printf函数不会执行换行操作

打开串口助手选择对应COM号,设置波特率9600接收格式选择【文本格式】。

#include <reg52.h>
#include <stdio.h>  // 打印字符串需要调用 stdio.h 库#define uint unsigned int
#define uchar unsigned char//毫秒级延时函数定义
void delay(uint z)
{uint x,y;for(x = z; x > 0; x--)for(y = 114; y > 0 ; y--);
} //串口初始化
void UARTInit()
{SM0 = 0;  SM1 = 1;//串口工作方式1,8位UART波特率可变TR1 = 1;//启动定时器1TMOD |= 0x20;//定时器1,工作模式2 8位自动重装TH1 = 0xfd;TL1 = 0xfd;//设置比特率9600
}void main()
{UARTInit(); //串口初始化while(1){TI = 1;puts("Hello Wolrd!");   // 每次打印都会换行   支持中文打印 while(!TI);TI = 0;delay(1000);}
}

注:

  • 使用printf()函数puts()函数需要引入头文件#include <stdio.h>
  • 使用printf()函数puts()函数前都应软件置位TI = 1;
    如果没有软件置位TI = 1,则会一直处于等待状态,while(!TI)一直在循环中。

STC89C52单片机 串口通信相关推荐

  1. STC89C52单片机串口通信以及代码演示

    目录 串口介绍 硬件电路 电平标准 常见通讯接口比较 51单片机的UART 串口参数及时序图 串口通信流程图 串口相关寄存器 波特率的计算方法 中断模式以及寄存器的配置 数据显示模式 代码示例(串口与 ...

  2. 基于PC与单片机串口通信的温度监控系统程序设计

    基于PC与单片机串口通信的温度监控系统程序设计 1.系统介绍 1)本系统主要讲解基于PC与单片机串口通信的温度监控系统程序设计(如图1),上位机采用常用的PC机,下位机使用的是STC89C52单片机, ...

  3. 51单片机串口通信模板_深入理解51单片机串口通信及通信实例

    串口通信的原理 串口通信(SerialCommunications)的概念非常简单,串口按位(bit)发送和接收字节.尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一 ...

  4. 51单片机-串口通信

    目录 1.什么是通信 1.1.通信的概念 1.2.传送方式 1.3.同步方式 1.4.传送方向 1.5.校验方式 2.单片机串口介绍 2.1.硬件电路 2.2.电平标准 2.3.常见接口 2.4.内部 ...

  5. 蓝桥杯单片机串口通信学习提升笔记

    今日得以继续蓝桥杯国赛备赛之旅: 有道是 "不知何事萦怀抱,醒也无聊,醉也无聊,梦也何曾到谢桥." 那我们该如何 让这位诗人纳兰 "再听乐府曲 ,畅解相思苦"呢 ...

  6. 普中单片机--串口通信(2)---通过串口助手发送数据点LED

    普中单片机–串口通信(2) 通过串口助手发送数据 点亮LED 软件部分 #include <reg52.h> #define jingzhen 12000000UL /*使用12.0M晶体 ...

  7. 51单片机串口通信原理、相关寄存器配置与简单串口收发程序代码

    目录 1. 串口通信原理 2. 51单片机串口通信 2.1 串口简要模式图 2.2 相关寄存器 (1)PCON.SCON.SBUF (2)IE.IPH.IP (3)配置T1定时器 2.3 波特率和系统 ...

  8. 51单片机串口通信模板_51单片机串口通信

    51 单片机串口通信 51 单片机串口通信(转载) 2009-03-03 18:22 一.串口通信原理 串口通讯对单片机而言意义重大,不但可以实现将单片机的数据传输到计 算机端,而且也能实现计算机对单 ...

  9. 51单片机~串口通信(讲解+代码)

    51单片机~串口通信 (一)计算机串行通信原理: 综上:所以在设置的时候,经常将SCON设置为0X50==0101 0000 ,使用方式1. (二)工作: 中断控制 led灯,每发送一条指令灯亮或灭( ...

最新文章

  1. 浏览器是如何解析html的?
  2. 计算机技术大神,2017考研:计算机科学与技术学科大神给你的套路
  3. kafka logstash elk
  4. 和一个刚毕业不久的朋友聊天
  5. Django框架——ORM数据库操作
  6. charles请求转发_Charles安装与基本操作
  7. 状态管理技术~~Session
  8. ubuntu 10.04 CTS 环境搭建
  9. Java自动装箱和拆箱
  10. 一个简单的中文自动转拼音
  11. C# 序列化之二进制
  12. “基因编辑婴儿”惹争议,那你知道机器学习在脱靶效应中的作用吗?
  13. 关于PhpDE zend ide破解方式
  14. 1489 数据结构:矩阵鞍点
  15. 纯HTML个人清新网站源码
  16. 偏执的iOS逆向研究员:收集全版本的macOS iOS+越狱+内核调试
  17. SOT-223 封装尺寸图
  18. 用python采集modbus_python modbus_tk库学习记录
  19. php源码 运费计算,php – Woocommerce:获取运输邮政编码以计算运费
  20. wfp 禁用ip_[原创]WFP网络过滤驱动——限制网站访问

热门文章

  1. 2003DC 升级到2008R2 DC实验
  2. 转载:VMware虚拟机时钟不准的问题(linux图形界面投影到windows配置参考)--略有修改...
  3. form表单的两种提交方式,submit和button的用法
  4. 求解最大字段和的几种方法
  5. 03:Poor Herobrine 直接插入排序
  6. linux经典书籍--linux系统编程手册
  7. golang中的strings.EqualFold
  8. C#之windows桌面软件第六课:(上集)串口工具实现数据校验、用灯反应设备状态
  9. CMSIS对异常和中断标识符、中断处理函数名以及中断向量异常号都有严格的要求。
  10. Socket简介及客户端服务器连接实例