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 配置…

C++(7): std::list的使用

std::list 容器介绍及用法 1. std::list std::list是 C 标准模板库(STL)中的一个顺序容器适配器,它提供了双向链表的数据结构。与 std::vector 不同,std::list 不存储连续的元素,因此它可以高效地在中间插入和删除元…

Rust 实战练习 - 4. 网络 TCP/UDP/Channel

目标&#xff1a; tcp 服务器和客户端udp服务器和客户端多线程实现服务器&#xff0c;异步并发channel tcp server & client use std::{prelude::*, net, thread, env}; use std::io::{Read, Write};fn main() {let args env::args().into_iter().collect::<Vec<…

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

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

flask_restful渲染模版

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

LeetCode-88

题目&#xff1a; 88. 合并两个有序数组 思路&#xff1a; 最开始想到的就是使用一个中间数组来存放合并后的数据&#xff0c;对两个数组使用双指针进行遍历&#xff0c;将两个数组中较小的放入中间数据。 看了题解&#xff0c;发现可以逆序进行遍历&#xff0c;因为nums1中后…

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

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

setitimer实现每隔一秒打印输出一次

setitimer是一种定时器&#xff0c;可以通过C语言中的系统调用函数setitimer()来实现。 struct itimerval { struct timerval it_interval; // 闹钟触发周期 struct timerval it_value; // 闹钟触发时间 }; struct timeval { long tv_sec; // 秒 lo…

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

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

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

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

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

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

牛可编程题

提示&#xff1a;文章 文章目录 前言一、背景二、 2.1 2.2 总结 前言 前期疑问&#xff1a; 本文目标&#xff1a; 一、背景 最近 二、 2.1 坐标移动 https://www.nowcoder.com/practice/119bcca3befb405fbe58abe9c532eb29?tpId37&tqId21240&rp1&ru/exam/…

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

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

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

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

牛客HJ43 迷宫问题中使用python,append在递归调用时的问题

题目描述 牛客&#xff1a;HJ43 迷宫问题 定义一个二维数组 N*M &#xff0c;如 5 5 数组下所示&#xff1a; int maze[5][5] { 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, }; 它表示一个迷宫&#xff0c;其中的1表示墙壁&#xff0c;0…

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

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

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

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

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

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

差异性分析通常包括以下几个基本步骤

差异性分析通常包括以下几个基本步骤&#xff1a; 明确研究目的&#xff1a;首先需要明确研究的目的和问题&#xff0c;确定要比较的变量或因素是什么&#xff0c;以及希望从数据中获得怎样的信息。 收集数据&#xff1a;收集与研究问题相关的数据样本&#xff0c;确保数据的质…

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

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