NO9 蓝桥杯单片机实践之串口通信的使用

news/2024/5/9 14:06:33

1 回顾

串口通信的代码编写结构还是与中断一样,不同的是:

初始中断函数条件涉及到串口通信相关的寄存器和定时器1相关的寄存器(定时器1用于产生波特率),但初始条件中的中断寄存器只考虑串口通信而不考虑定时器1。

void  函数名()

{

包含两部分寄存器:定时器1+串口通信

定时器1: TMOD (选择模式),TH1和TL1(初始计时寄存器),TR1(TCON寄存器里的启动计时按钮)

串口通信:SCON(总的来说功能是模式选择),AUXR(辅助寄存器),中断开关(分开关+总开关)

}

void  函数名() interrupt  中断号

{

就是写时间到后执行什么。注意中断号要写串口通信的,而不是定时器的,因为定时器作用只是产生波特率而不是产生中断。

}

2 实践

2.1 任务

2.2 思路

题目中涉及到串口通信。那么串口通信的结构就要先写下来:

void  函数名()

{

}

void  函数名() interrupt  中断号

{

}

先考虑初始函数怎么写:

用定时器1产生波特率9600: (那么就要写与定时器1有关的寄存器)

TMOD,TR1,TL1,TH1 ,中断(但不使用)

(1)波特率9600查表得到当时钟为11.059MHZ,定时器1用方式2工作即8位重装,写入0xfd,即TL1,TH1= 0xfd

(2)刚才说到要用8位重装模式

查手册之TMOD= 0x20

(3)要让定时器允许定时则TR1 = 1。

初始函数中还涉及串口通信:

与串口通信有关的寄存器: SCON, PCON,AUXR, SBUF,中断

SCON:(上一篇文章查表,或直接查手册)常用的工作模式是8位UART波特率可变,即SM0,SM1为01,那么TB8和RB8和SM2为0(方式1时不使用),TI和RI初始也应该为0,REN=1,要允许接收。

即:01010000

因此,SCON=0x50.

PCON:在定时器1串口1情况写,只考虑SMOD那位,由波特率常用表,我们选了那一行的SMOD显示为0,故SMOD=0,故PCON=0x00。

AUXR: AUXR= 0x00(上一篇文章有解释)

中断:总开关EA=1,分开关ES=1

SBUF是存放数据的所以不是写在初始函数中

接下看看看中断程序函数怎么写:

(1)首先是中断号,因为中断用的是串口通信而不是定时器1,故中断号应是对应串口通信的中断号为4。

(2)任务是要我们接收信息。那么就要用到接收判断位RI,首先判断RI,当RI=1表示接收完成数据,然后再把接收到的数据存下来。(我们前一篇说过,发送的数据会暂时存到SBUF),那么现在我们要接收,就要定义一个变量把SBUF的数据存起来,即data= SBUF,然后再把RI清零。(由于这里只考虑接收,故在中断中只是写接收就行了)

虽然在中断中不用判断发送,但是还是要写一个发送函数来传给单片机,然后接收出来让我们看看是否嗯那个完成接收工作。

注意:还有因为任务是产生9600的波特率,因此串口收发助手的波特率记得调到9600!!

2.3 完整代码

这里我发现很奇怪,要把发送内容的函数放到main函数的循环里面才能让串口助手收到数据,放在main的循环外面是不行的,这样就导致其一直在发送,串口助手就一直在循环接收数据,小蜜蜂老师教程里却不会这样,为啥呢?求助大佬!!

(以下是在蓝桥杯单片机中可以使用的代码)

#include "stc15f2k60s2.h"void selectHC138(unsigned int n)
{switch(n){case 0:P2 = (P2 & 0x1f) | 0x00;  break;case 1: P2 = (P2 & 0x1f) | 0x20;  break; case 2:P2 = (P2 & 0x1f) | 0x40;  break; case 3: P2 = (P2 & 0x1f) | 0x60;  break; case 4:P2 = (P2 & 0x1f) | 0x80;  break; case 5:P2 = (P2 & 0x1f) | 0xa0;  break; case 6:P2 = (P2 & 0x1f) | 0xc0;  break; case 7:P2 = (P2 & 0x1f) | 0xe0;  break;}
}//=============================send and recieve===============
void Init_Timer1()
{TH1 = 0xfd;TL1 = 0xfd;TMOD = 0x20;TR1 = 1;SCON = 0x50;
//  PCON = 0x00;AUXR = 0x00;ES = 1;EA = 1;
}unsigned char urdat;void chuankou() interrupt 4
{
//  if(TI == 1)
//  {
//    urdat = SBUF;
//    TI = 0;
//  }if (RI == 1){//SBUF = urdat;urdat = SBUF;RI = 0;}
}  
//=====================================================
void send(unsigned char dat)
{SBUF = dat;while(TI == 0);TI = 0;
}void close()
{selectHC138(5);P0 = 0x00;selectHC138(4);P0 = 0xff;
}void main()
{close();Init_Timer1();while(1){send(0x5a);send(0xa5);   }}


http://www.mrgr.cn/p/43114156

相关文章

Matlab|计及电池储能寿命损耗的微电网经济调度

目录 1 主要内容 储能寿命模型 负荷需求响应 2 部分代码 3 程序结果 4 下载链接 1 主要内容 该程序参考文献《考虑寿命损耗的微网电池储能容量优化配置》模型,以购售电成本、燃料成本和储能寿命损耗成本三者之和为目标函数,创新考虑储能寿命损耗约…

程序员如何兼职赚小钱?

程序员由于有技术和手艺其实兼职赚钱的路子还是挺多的,只要你有足够的时间。 1. 做外包 这是比较传统的方式,甲方在一些众包平台上发布开发任务,你可以抢这个任务,但是价格都比较便宜。 任务比较多的平台: 猪八戒、一品威客、开…

C语言指针详解(上)

一.什么是指针 指针是一种类型,用来存储变量的地址的类型 有哪些类型呢 字符指针:char* 整型指针:int* 浮点型指针:float* 双精度浮点型指针:double* 空指针:void* (每一个类型的指针&a…

ubuntu没有有线网络的一种解决办法

直接使用下面的代码: sudo nmcli networking off sudo nmcli networking on转自 Ubuntu 20.04 LTS 有线网络设置消失了怎么办 - 知乎 (zhihu.com) 评论区第一条 理客Lick - 知乎 (zhihu.com)Keep it simple and stupid

Huawei设备基础配置

<Huawei>system-view # 进入系统视图 [Huawei]telnet server enable # 开启设备telnet功能 [Huawei]user-interface vty 0 4 # 开启登录端口0-4并进入用户接口视图 [Huawei-ui-vty0-4]protocol inbound telnet # 通过telnet协议登录 [Huawei-ui-vty0-4]authentic…

如何安装和卸载SFP光模块

SFP光模块的安装和拆卸是简单直接的过程。然而&#xff0c;任何非标准操作都可能导致隐式损坏甚至永久故障。您需要参考及时更新的光模块的数据表或用户手册&#xff0c;以熟悉其特性和锁定机制。 准备工作 常见事项 拆卸和插入SFP光模块可能会缩短其使用寿命&#xff0c;因…

Git工具的详细使用

一、环境说明 [rootgit ~]# getenforce Disabled [rootgit ~]# systemctl status firewalld ● firewalld.service - firewalld - dynamic firewall daemonLoaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)Active: inactive (d…

Selenium浏览器自动化测试框架详解

selenium简介 介绍 Selenium [1] 是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中&#xff0c;就像真正的用户在操作一样。支持的浏览器包括IE&#xff08;7, 8, 9, 10, 11&#xff09;&#xff0c;Mozilla Firefox&#xff0c;Safari&#xff0c;Google C…

【转】linux设置密钥登录(只允许密钥登录)

转, 原文: https://www.cnblogs.com/dyj--php/p/9656016.html ----------------- 一.root用户使用这条命令看看家目录有没有(.ssh文件夹),cd .ssh,如果存在就会进入这个文件夹,不存在就(makedir .ssh),修改.ssh这个文件夹权限(chmod 700 .ssh),查看.ssh文件夹下是…

嵌入式作业2.1 汇编练习

目录原始参考代码(main.s)作业一、翻译汇编成C语言二、修改参考代码 原始参考代码(main.s) 汇编代码: //===================================================================== //文件名称:main.s //功能概要:汇编编程调用GPIO构件控制小灯闪烁(利用printf输出提示信…

window10 安装 Redis

一、下载压缩包(免安装) 地址: https://github.com/tporadowski/redis/releases二、解压解压路径自定义 Logs目录,手动添加的,用于保存redis的日志记录 (下面再补充)下图为解压后的文件三、注册Redis服务以管理员权限打开cmd窗口,执行以下命令# 安装redis服务 redis-se…

Camera基础知识四

MIPI-CSI2的PHY层定义了CSI传输介质的电气特性、帧格式以及时钟等,如下:DPHY Lane States:Escape Mode跟csi无关,是DSI用的LP切换到HS模式切换:差分信号一般100mv - 300mv HS_SETTLE,这段时间,1.2V降到100-300mv需要时间稳定下来。HS_ZERO表示发送为0。 一旦MIPITX发送0…

Spring Cloud 十:Spring Cloud与微前端

Spring Cloud 一&#xff1a;Spring Cloud 简介 Spring Cloud 二&#xff1a;核心组件解析 Spring Cloud 三&#xff1a;API网关深入探索与实战应用 Spring Cloud 四&#xff1a;微服务治理与安全 Spring Cloud 五&#xff1a;Spring Cloud与持续集成/持续部署&#xff08;CI/C…

Fiddler(6)AutoResponder

Fiddler最实用的功能, 它可以抓取在线页面保存到本地进行调试, 大大减少了在线调试的困难, 可以让我们修改服务器端返回的数据的

WinRadius 配置指南

WinRadius 配置指南 1 RADIUS概述 RADIUS 是一种用于在需要认证其链接的网络访问服务器(NAS)和共享认证服务器之间进行认证、授权和记帐信息的文档协议。 RADIUS在运维审计系统中,主要体现的是认证功能。 2 设置WinRadius服务器的操作步骤 (1)运行WinRadius。在真实计算机…

Camera基础知识三

参考资料:极客笔记 侵权联删Camera sensor状态机:状态机:POWER OFF、hardware standby、software、streaming 没电的时候就是power off状态,上电了进入hardware standby状态,xshutdown也就是reset,进入software standby状态。PLL寄存器配置进去之后就进入streaming状态Ca…

C语言例4-15:从键盘输入一个整数,求其绝对值并输出。

代码如下&#xff1a; //从键盘输入一个整数&#xff0c;求其绝对值并输出。 #include<stdio.h> int main(void) {int n;printf("输出一个整数&#xff1a; \n");scanf("%d",&n); //从键盘输入一个整数保存至变量nif(n<0) //…

Linux相关命令(1)

1、找出文件夹下包含 “aaa” 同时不包含 “bbb”的文件&#xff0c;然后把他们重新生成一下。要求只能用一行命令。 find ./ -type f -name "*aaa*" ! -name "*bbb*" -exec touch {} \;文件系统操作命令 df&#xff1a;列出文件系统的整体磁盘使用情况 …

Linux更换默认终端

在更换不同版本的gcc/g++时,提到了update-alternatives这个默认程序,这里同样要用。 下载完终端以后, sudo update-alternatives --config x-terminal-emulator然后运行即可