C51/C52单片机的串口原理及参考代码
一、什么是串口(RS232 9针串口)
串口是我们的大多数微控制单元(MCU)都具有的基本的外部接口,一般串口最基本的功能就是调试,又能做数据通信的接口(数据量要小一些)。
二、串口通信原理
一条信息的各位数据按位依次顺序的通信方式称为串行通信,传信通信可以是串口也可以是其他(74LS164移位寄存器)。
根据传输方式又分为单工、半双工和全双工三种,如图所示:
串口传输如下图所示:
三、串口相关寄存器介绍
1、串口控制寄存器SCON
2、电源控制寄存器PCON
四、串口示例代码
1、串口发送单个数据
/**************************************************************************************
*
*实现现象:串口发送单个数据
*
*注意事项:波特率为4800
***************************************************************************************/#include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器typedef unsigned int u16; //对数据类型进行声明定义
typedef unsigned char u8;void Delay(void)//延时500ms
{unsigned char i,j;for(i=0;i<255;i++) //进行循环操作,以达到延时效果for(j=0;j<255;j++);for(i=0;i<255;i++)for(j=0;j<255;j++);for(i=0;i<255;i++)for(j=0;j<255;j++);}/*******************************************************************************
* 函数名 :UsartInit()
* 函数功能 :设置串口
* 输入 : 无
* 输出 : 无
*******************************************************************************/
void UsartInit()
{SCON=0X50; //设置为工作方式1:8位数据位TMOD=0X20; //设置计数器工作方式2 高四位和低四位PCON=0X80; //波特率加倍TH1=0XF3; //计数器初始值设置,注意波特率是4800的,如果波特率要9600,修改TH1和TL1即可TL1=0XF3;
}/*******************************************************************************
* 函数名 :UsartSendByte()
* 函数功能 :串口发送单个字节
* 输入 : 无
* 输出 : 无
*******************************************************************************/
void UsartSendByte(unsigned char byte)
{SBUF=byte; //缓冲区装载要发送的字节while(TI==0)//等待发送数据完成,TI标志位会置1TI=0; //清空发送中断标志位
}/*******************************************************************************
* 函 数 名 : main
* 函数功能 : 主函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void main()
{ unsigned char i = 0;UsartInit(); //串口初始化while(1){UsartSendByte(i);//串口发送单字节数据Delay();i++;if(i>255)i=0;}
}
2、串口接收并返回数据
/**************************************************************************************
*
*实现现象:串口接收并返回数据
*
*注意事项:波特率为4800
***************************************************************************************/#include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器typedef unsigned int u16; //对数据类型进行声明定义
typedef unsigned char u8;void Delay(void)//延时500ms
{unsigned char i,j;for(i=0;i<255;i++) //进行循环操作,以达到延时效果for(j=0;j<255;j++);for(i=0;i<255;i++)for(j=0;j<255;j++);for(i=0;i<255;i++)for(j=0;j<255;j++);}void UsartInit()
{SCON=0X50; //设置为工作方式1:8位数据位TMOD=0X20; //设置计数器工作方式2 高四位和低四位PCON=0X80; //波特率加倍TH1=0XF3; //计数器初始值设置,注意波特率是4800的,如果波特率要9600,修改TH1和TL1即可TL1=0XF3;ES=1; //打开接收中断EA=1; //打开总中断TR1=1; //打开计数器
}/*******************************************************************************
* 函数名 :UsartSendByte()
* 函数功能 :串口发送单个字节
*******************************************************************************/
void UsartSendByte(unsigned char byte)
{SBUF=byte; //缓冲区装载要发送的字节while(TI==0)//等待发送数据完成,TI标志位会置1TI=0; //清空发送中断标志位
}/************************************************************
*
*输入:pstr 字符串
*
*功能:串口打印字符串
*
************************************************************/
void PrintfStr(char *pstr)
{while(pstr && *pstr){UsartSendByte(*pstr++);}
}void main()
{ unsigned char i = 0;UsartInit(); // 串口初始化while(1);
}/*******************************************************************************
* 函数名 : Usart() interrupt 4
* 函数功能 : 串口通信中断函数*******************************************************************************/
void Usart() interrupt 4 //串口中断号
{u8 receiveData;receiveData=SBUF; //出去接收到的数据 接收中断标志位 RI = 0; //清除接收中断标志位UsartSendByte(receiveData);//返回接收到的数据//SBUF=receiveData; //将接收到的数据放入到发送寄存器//while(!TI); //等待发送数据完成//TI=0; //清除发送完成标志位 发送中断标志位
}
C51/C52单片机的串口原理及参考代码相关推荐
- C51/C52单片机,最小系统
一个小白,开始学习单片机,从C51/52开始, 我学习的型号是STC98C52单片机. STC89C52是一种低功耗.高性能CMOS8位微控制器,具有8K在系统可编程Flash存储器.在单芯片上,拥有 ...
- C51/C52单片机printf打印出来的值是原来值的256倍
开发环境(蓝色粗体字为特别注意内容) 1,开发板:89C52RC. 2,开发环境:Keil uv5 在51单片机的KEIL程序中,使用printf("Voltage0:%d\r\n" ...
- C52单片机中断定时系统思路和实现代码
最近拿到了单片机的课程设计题目,乍一看还挺简单的,就是一个简单的电子时钟,想都没想就直接把我arduinod的DS1302时钟模块拿来直接就做出来了,好家伙这两天仔细读了题目才发现直接指出了不能用DS ...
- 电赛校赛-三相逆变电源设计(单片机部分--C52仿真测频+串口发送机与串口接收机)
写在前面 承接前文的模拟部分,这次开始写下单片机部分的仿真程序设计,本文介绍C52单片机的设置,后面将会介绍MSP430F249的具体配置. 题目 基础部分 搭建 DC-AC 电路以及检测电路. 调整 ...
- C51单片机与C52单片机内部的资源区别
C52单片机可以理解为是C51单片机的增强版 • 两个方面有差异,存储空间和定时器计数器方面有区别○ C52单片机的内部ROM为8KB:C51单片机的内部ROM为4KB○ C52单片机的内部RAM为2 ...
- 利用c51进行数模转换并在液晶屏上显示_51单片机汇编语言实验(五)-----A/D 0809模数转换和DA0832数模转换实验(附参考代码及注释)...
本系列共6篇文章,本文作为本系列的第五篇文章,介绍实验五 :A/D 0809模数转换和DA0832数模转换实验,本系列文章基于Dais-52PRO实验箱. 本系列文章链接: ------------- ...
- 8051(c51)单片机从汇编到C语言,从Boot到应用实践教程
8051(c51)单片机从汇编到C语言,从Boot到应用实践教程 作者 将狼才鲸 创建日期 2022-09-29 本仓库相关网址: CSDN文章地址 Gitee工程和源码地址 相关仓库: 嵌入式整体介 ...
- 51单片机多任务操作系统的原理与实现
写在前面的话:这篇文章值得看十遍.分享一下 51单片机多任务操作系统的原理与实现 -- 一个超轻量级的操作系统 前言 想了很久,要不要写这篇文章?最后觉得对操作系统感兴趣的人还是很多,写吧.我不一定能 ...
- android单片机wifi通信原理,基于单片机计算机之间无线通信实现.doc
基于单片机计算机之间无线通信实现 课 程 设 计 报 告 学 院: 专业名称: 学生姓名: 指导教师: 时 间: TOC \o "1-3" \h \u 课程设计任务书 题目:基于单 ...
最新文章
- 关于final局部变量引用的研究
- vector基础操作
- python汉诺塔问题_Python汉诺塔问题
- PS提示错误1解决办法
- 随机森林降维matlab代码,随机森林代码实现问题
- java 内部类 返回值_Java学习笔记:形参和返回值、内部类、常用API
- 《码出高效:Java 开发手册》“码” 出高效的同时编写出高质量的代“码”。
- FoxitReader3.0注册码和foxit pdf creator key foxit pdf editor v2.0 key
- Qt 6安装(qt6 测试在win7运行崩溃,不再支持win7)
- 对 torch 中 dim 的总结和理解
- Linux文件比较工具
- Error 0x80240017: Failed to execute MSU package.
- Tomcat详细使用步骤
- 我的2013——学习、工作与生活
- rabbitmq reply-code=404, reply-text=NOT_FOUND
- 浏览器的储存方式有哪些
- Linear Algebra 线性代数
- Servlet 和Session的关系
- ASP.NET Zero 11.1.0
- 李炎恢jquery学习笔记
热门文章
- 框架运行错误:Ljava/lang/String;Ljava/lang/String;
- Android数组适配器ArrayAdapter用法(用于只有文字的列表显示)
- 冰河公开了其总结的一项重要的编程技能!
- 初次使用hammer.js做卡片滑动效果
- smali代码结构解析
- 学什么程序语言工资高
- Web 1.0、Web 2.0 和 Web 3.0 之间的比较
- Python连接mysql,插入数据时不报错,但是没有插入进去
- OpenCV入门基础学习
- Windows服务没有及时响应启动或控制请求