9.串口通信

串口基本认识

串行接口简称串口,也称串行通信接口或串行通讯接口(通常指COM接口),是采用串行通信方
式的扩展接口。串行接口(Serial Interface)是指数据一位一位地顺序传送。其特点是通信线路简
单,只要一对传输线就可以实现双向通信(可以直接利用电话线作为传输线),从而大大降低了成
本,特别适用于远距离通信,但传送速度较慢

串口接线方式

  1. RXD:数据输入引脚,数据接受;STC89系列对应P3.0口。
    TXD:数据发送引脚,数据发送;STC89系列对应P3.1口。

接线方式

在这里插入图片描述

串口编程要素

输入/输出数据缓冲器都叫做SBUF, 都用99H地址码,但是是两个独立的8位寄存器
代码体现为: 想要接收数据 char data = SBUF 想要发送数据 SBUF = data

在这里插入图片描述

回忆UART是异步串行接口,通信双方使用时钟不同,因为双方硬件配置不同,但是需要约定通信
速度,叫做波特率
对于电脑来说,别人做好了软件,鼠标点点点就能配置好,而苦逼单片机的波特率配置需要我们写
代码
点点点配置什么,我们代码也要配置对应参数。

51发送字符到PC

SCON

在这里插入图片描述

在这里插入图片描述

选择SM0和SM1为01,工作模式为方式一,

REN = 0,禁止接收
REN = 1,允许接收

SCON = 0100 0000; //禁止接收
SCON = 0101 0000; //允许接收

PCON

PCON &= 0x7F;//0111 1111 按位与将SMOD设置为0。

AUXR

在这里插入图片描述

TMOD

目标:0010 xxxx

TMOD &= 0x0F; //先将高位清零,低位不变
TMOD |= 0x20; //0010 xxxx

TH1

在这里插入图片描述

TH1 = 0xFD; //smod = 0 9600 = (2^smod) / 32 x 11059200 / 12/(256 - THL)
TL1 = 0xFD; // THL = 253 = FD(HEX)

代码实现

#include "reg52.h"
#include "intrins.h"sfr AUXR = 0x8E;void Delay250ms()		//@11.0592MHz
{unsigned char i, j, k;_nop_();i = 2;j = 193;k = 57;do{do{while (--k);} while (--j);} while (--i);
}void UartInit(void)		//9600bps@11.0592MHz
{PCON &= 0x7F;		SCON  = 0x50;		AUXR &= 0xBF;		AUXR &= 0xFE;		TMOD &= 0x0F;		TMOD |= 0x20;		TL1 = 0xFD;		TH1 = 0xFD;		ET1 = 0;		TR1 = 1;		
}void my_UartInit()
{SCON = 0x40;//选择SM0和SM1为01,工作模式为方式一,SCON = 0100 0000;PCON &= 0x7F;//0111 1111  按位与将SMOD设置为0AUXR |= 0x01;//0000 0001TMOD &= 0x0F;//目标:0010 xxxx   //先将高位清零,低位不变TMOD |= 0x20;//0010 xxxxTH1 = 0xFD;	//smod = 0	9600 = (2^smod) / 32 x 11059200 / 12 /(256 - THL)TL1 = 0xFD;	//THL = 253 = FD(HEX)ET1 = 0;//禁止定时器1中断TR1 = 1;//启动定时器1
}void main()
{char msg_data = 's';my_UartInit();	while(1){Delay250ms();SBUF = msg_data;}
}

51发字符串给PC

#include "reg52.h"
#include "intrins.h"sfr AUXR = 0x8E;void Delay250ms()		//@11.0592MHz
{unsigned char i, j, k;_nop_();i = 2;j = 193;k = 57;do{do{while (--k);} while (--j);} while (--i);
}void UartInit(void)		//9600bps@11.0592MHz
{PCON &= 0x7F;		SCON  = 0x50;		AUXR &= 0xBF;		AUXR &= 0xFE;		TMOD &= 0x0F;		TMOD |= 0x20;		TL1 = 0xFD;		TH1 = 0xFD;		ET1 = 0;		TR1 = 1;		
}void my_UartInit()
{SCON = 0x40;//选择SM0和SM1为01,工作模式为方式一,SCON = 0100 0000;PCON &= 0x7F;//0111 1111  按位与将SMOD设置为0AUXR |= 0x01;//0000 0001TMOD &= 0x0F;//目标:0010 xxxx   //先将高位清零,低位不变TMOD |= 0x20;//0010 xxxxTH1 = 0xFD;	//smod = 0	9600 = (2^smod) / 32 x 11059200 / 12 /(256 - THL)TL1 = 0xFD;	//THL = 253 = FD(HEX)ET1 = 0;//禁止定时器1中断TR1 = 1;//启动定时器1
}void sendByte(char msg_data)
{SBUF = msg_data;while(TI == 0);//结束TI=1,TI==0为假TI = 0;
}void sendString(char *str)
{while(*str != '\0'){sendByte(*str);str++;}
}void main()
{my_UartInit();while(1){Delay250ms();sendString("hello world!\r\n");}
}

51接收PC发送的字符,达到点灯关灯的目的

#include "reg52.h"
#include "intrins.h"sbit led1 = P3^7;sfr AUXR = 0x8E;char cmd; void Delay250ms()		//@11.0592MHz
{unsigned char i, j, k;_nop_();i = 2;j = 193;k = 57;do{do{while (--k);} while (--j);} while (--i);
}void UartInit(void)		//9600bps@11.0592MHz
{PCON &= 0x7F;SCON  = 0x50;AUXR &= 0xBF;AUXR &= 0xFE;TMOD &= 0x0F;TMOD |= 0x20;TL1 = 0xFD;TH1 = 0xFD;ET1 = 0;TR1 = 1;
}void my_UartInit()
{SCON = 0x50;//选择SM0和SM1为01,工作模式为方式一,SCON = 0101 0000; 允许接收PCON &= 0x7F;//0111 1111  按位与将SMOD设置为0AUXR |= 0x01;//0000 0001TMOD &= 0x0F;//目标:0010 xxxx   //先将高位清零,低位不变TMOD |= 0x20;//0010 xxxxTH1 = 0xFD;	//smod = 0	9600 = (2^smod) / 32 x 11059200 / 12 /(256 - THL)TL1 = 0xFD;	//THL = 253 = FD(HEX)ET1 = 0;//禁止定时器1中断TR1 = 1;//启动定时器1
}void sendByte(char msg_data)
{SBUF = msg_data;while(TI == 0);//结束时TI=1,TI == 0 为假TI = 0;
}void sendString(char *str)
{while(*str != '\0'){sendByte(*str);str++;}
}void main()
{my_UartInit();led1 = 1;while(1){Delay250ms();sendString("hello world!\r\n");}
}void UartHandler() interrupt 4
{if(RI){RI = 0;cmd = SBUF;if(cmd == 'o'){led1 = 0;}if(cmd == 'c'){led1 = 1;}}if(TI){}
}

51接收PC发送的字符串,达到点灯关灯的目的

#include "reg52.h"
#include "intrins.h"
#include "string.h"sbit led1 = P3^7;sfr AUXR = 0x8E;char cmd[12] = {'\0'};void Delay250ms()		//@11.0592MHz
{unsigned char i, j, k;_nop_();i = 2;j = 193;k = 57;do{do{while (--k);} while (--j);} while (--i);
}void UartInit(void)		//9600bps@11.0592MHz
{PCON &= 0x7F;SCON  = 0x50;AUXR &= 0xBF;AUXR &= 0xFE;TMOD &= 0x0F;TMOD |= 0x20;TL1 = 0xFD;TH1 = 0xFD;ET1 = 0;TR1 = 1;
}void my_UartInit()
{SCON = 0x50;//选择SM0和SM1为01,工作模式为方式一,SCON = 0101 0000; 允许接收PCON &= 0x7F;//0111 1111  按位与将SMOD设置为0AUXR |= 0x01;//0000 0001TMOD &= 0x0F;//目标:0010 xxxx   //先将高位清零,低位不变TMOD |= 0x20;//0010 xxxxTH1 = 0xFD;	//smod = 0	9600 = (2^smod) / 32 x 11059200 / 12 /(256 - THL)TL1 = 0xFD;	//THL = 253 = FD(HEX)ET1 = 0;//禁止定时器1中断TR1 = 1;//启动定时器1
}void sendByte(char msg_data)
{SBUF = msg_data;while(TI == 0);//结束TI=1,TI==0为假TI = 0;
}void sendString(char *str)
{while(*str != '\0'){sendByte(*str);str++;}
}void main()
{my_UartInit();led1 = 1;while(1){Delay250ms();sendString("hello world!\r\n");}
}void UartHandler() interrupt 4
{static int i = 0;//静态变量 只被初始化一次if(RI)//中断处理函数中,对于接收中断的响应{	RI = 0;//清除接收中断标志位cmd[i] = SBUF;i++;if(strstr(cmd,"open")){led1 = 0;i = 0;memset(cmd,'\0',12);}if(strstr(cmd,"close")){led1 = 1;i = 0;memset(cmd,'\0',12);}}if(TI){}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/771103.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

搭建 canal 监控mysql数据到RabbitMQ

项目需求: 使用canal监控mysql某个库某个表,或者多个库,多个表---- update/inster/create 操作, 系统版本mysql版本java版本canal版本rabbitMQ版本Rocky 9.2MySQL 8.0.26openjdk 11.0.221.1.6rabbitmq-server 3.12.4 mysql 配置…

淘宝扭蛋机小程序开发:开启线上扭蛋新体验

随着科技的飞速发展和移动互联网的普及,线上娱乐方式也变得越来越多样化。为了满足广大用户对于新鲜、有趣的娱乐体验的需求,我们决定开发一款淘宝扭蛋机小程序,为用户带来全新的线上扭蛋乐趣。 淘宝扭蛋机小程序将结合淘宝平台的优势资源&a…

flask_restful渲染模版

渲染模版就是在 Flask_RESTful 的类视图中要返回 html 片段代码,或 者是整个html 文件代码。 如何需要浏览器渲染模板内容应该使用 api.representation 这个装饰器来定 义一个函数, 在这个函数中,应该对 html 代码进行一个封装&#xff…

基于nginx 动态 URL反向代理的实现

背景: 我们在项目中在这样一个场景,用户需要使用固定的软件资源,这些资源是以服务器或者以容器形式存在的。 资源以webAPI方式在内网向外提供接口,资源分类多种类型,每种类型的资源程序和Wapi参数都一样。这些资源部属…

学习SpringBoot笔记--知识点(1)

目录 SpringBoot介绍 创建一个最基础的springbooot项目 使用Spring Initializr创建springboot项目 Spring Boot 自动配置机制 SpringBoot常用注解 1.组件注册 2.条件注解 3.属性绑定 SpringBoot自动配置流程​编辑 学习SpringBoot的方法 ​编辑 SpringBoot日志配置…

2015年认证杯SPSSPRO杯数学建模A题(第一阶段)绳结全过程文档及程序

2015年认证杯SPSSPRO杯数学建模 A题 绳结 原题再现: 给绳索打结是人们在日常生活中常用的技能。对登山、航海、垂钓、野外生存等专门用途,结绳更是必不可少的技能之一。针对不同用途,有多种绳结的编制方法。最简单的绳结,有时称…

PyCharm环境下Git与Gitee联动:本地与远程仓库操作实战及常见问题解决方案

写在前面:本博客仅作记录学习之用,部分图片来自网络,如需引用请注明出处,同时如有侵犯您的权益,请联系删除! 文章目录 前言下载及安装GitGit的使用设置用户签名设置用户安全目录Git基本操作Git实操操作 Pyc…

SpringBoot+Vue前后端分离项目在Linux系统中基于Docker打包发布,并上传镜像到阿里镜像私仓

文章目录 SpringBootVue前后端分离项目在Linux系统中基于Docker打包发布,并上传镜像到阿里镜像私仓一、Java项目基于Docker打包发布1.打包应用,将打好的jar包放到我们的linux系统中2.新建dockerfile3.打包镜像4.测试运行5.上传镜像到阿里云免费私仓 二、…

Webpack生成企业站静态页面 - 项目搭建

现在Web前端流行的三大框架有Angular、React、Vue,很多项目经过这几年的洗礼,已经都 转型使用这三大框架进行开发,那为什么还要写纯静态页面呢?比如Vue中除了SPA单页面开发,也可以使用nuxt.js实现SSR服务端渲染&#x…

基于前端技术实现的全面预算编制系统

前言 在现代商业环境中,预测销售数据和实际成本是每个公司CEO和领导都极为重视的关键指标。然而,由于市场的不断变化,准确地预测和管理这些数据变得愈发具有挑战性。为了应对这一挑战,建立一个高效的系统来管理和审查销售数据的重…

hbase启动错误-local host is“master:XXXX“ destination is:master

博主的安装前提: zookeeper安装完成,且启动成功 hdfs高可用安装,yarn高可用安装,且启动成功 报错原因:端口配置不对 解决方案: 输入:hdfs getconf -confKey fs.default.name 然后把相应的…

考研数学一——概率论真题——自我总结题型整理(总分393)

系列文章目录 终于考完研了,本人考的是南京航空航天大学的仪器科学与技术,英一数一电路,以下是成绩单: 平时习惯整理自己的学习体系,以下是一个记录。 其实,每个人都应该训练,看到某一类题目…

2024/03/25(C++·day1)

一、思维导图 二、练习 练习一 定义自己的命名空间&#xff0c;其中有string类型的变量&#xff0c;再定义两个函数&#xff0c;一个函数完成字符串的输入&#xff0c;一个函数完成求字符串长度&#xff0c;再定义一个全局函数完成对该字符串的反转 #include <iostream&g…

# vue刷新当前页面

vue刷新当前页面 背景 在项目开发中遇到了需要刷新当前页面的场景。中途尝试了以下四种方法 1、this. f o r c e U p d a t e ( ) t h i s . forceUpdate() this. forceUpdate()this.forceUpdate() 是Vue.js中的一个方法&#xff0c;用于强制组件重新渲染&#xff0c;即使没有…

景联文科技上新高质量大模型训练数据!

在过去的一年中&#xff0c;人工智能领域呈现出了风起云涌的态势&#xff0c;其中模型架构、训练数据、多模态技术、超长上下文处理以及智能体发展等方面均取得了突飞猛进的发展。 在3月24日举办的2024全球开发者先锋大会的大模型前沿论坛上&#xff0c;上海人工智能实验室的领…

【Android】美团组件化路由框架WMRouter源码解析

前言 Android无论App开发还是SDK开发&#xff0c;都绕不开组件化&#xff0c;组件化要解决的最大的问题就是组件之间的通信&#xff0c;即路由框架。国内使用最多的两个路由框架一个是阿里的ARouter&#xff0c;另一个是美团的WMRouter。这两个路由框架功能都很强大&#xff0…

一篇文章,告别Flutter状态管理争论,问题和解决

起因 每隔一段时间&#xff0c;都会出现一个新的状态管理框架&#xff0c;最近在YouTube上也发现了有人在推signals, 一个起源于React的状态管理框架&#xff0c;人们总是乐此不疲的发明各种好用或者为了解决特定问题而产生的方案&#xff0c;比如Bloc, 工具会推陈出新&#x…

[Vue warn]: Invalid vnode type when creating vnode: false

如题&#xff0c;意思是创建vnode时&#xff0c;vnode类型无效:false。 根据右边的索引点进去&#xff0c;发现定位的是组件loading。搜索loading发现声明了变量loading&#xff0c;更改后问题消失。

【python】获取4K壁纸保存到本地文件夹【附源码】

图片信息丰富多彩&#xff0c;许多网站上都有大量精美的图片资源。有时候我们可能需要批量下载这些图片&#xff0c;而手动一个个下载显然效率太低。因此&#xff0c;编写一个简单的网站图片爬取程序可以帮助我们高效地获取所需的图片资源。 目标网站&#xff1a; 如果出现模…

物联网云组态是什么?部署物联网云组态有什么作用?

在信息化与工业化的深度融合进程中&#xff0c;物联网云组态以其独特的优势&#xff0c;正在成为企业数字化转型的重要工具。那么&#xff0c;物联网云组态究竟是什么呢&#xff1f;部署物联网云组态又能给企业带来哪些实质性的好处呢&#xff1f;今天&#xff0c;我们将围绕这…