单片机串口控制

1.使用微控制器输入串口指令控制LED灯亮灭

main.c

#include "uart4.h"int main()
{led_init(); //初始化LED相关寄存器char buf[128];while(1){gets(buf);if(mystrcmp(buf,"LED1_on") == 0){led_ctl(1,1); //当在串口工具中输入"LED1_on"时控制LED1打开puts("灯已经打开\n");}else if(mystrcmp(buf,"LED1_off") == 0){led_ctl(1,0);当在串口工具中输入"LED1_off"时控制LED1关闭puts("灯已经关闭\n");}else{puts(buf);}}
}

uart4.h

#include "uart4.h"//串口初始化
void uart4_init()
{//使能UART4外设时钟RCC->MP_APB1ENSETR |= (0x1<<16);//使能GPIOB/GPIOG外设时钟RCC->MP_AHB4ENSETR |= (0x1<<1);RCC->MP_AHB4ENSETR |= (0x1<<6);//设置PB2/PG11复用为UART4功能//PB2GPIOB->MODER &= (~(0x3<<4));GPIOB->MODER |= (0x2<<4);GPIOB->AFRL &= (~(0xf<<8));GPIOB->AFRL |= (0x8<<8);//PG11GPIOG->MODER &= (~(0x3<<22));GPIOG->MODER |= (0x2<<22);GPIOG->AFRH &= (~(0xf<<12));GPIOG->AFRH |= (0x6<<12);//禁用串口UE=0USART4->CR1 &= (~(0x1<<0));//设置8bit数据位USART4->CR1 &= (~(0x1<<12));USART4->CR1 &= (~(0x1<<28));//设置没有校验位USART4->CR1 &= (~(0x1<<10));//设置不分频USART4->PRESC &= (~(0xf<<0));//设置16倍过采样USART4->CR1 &= (~(0x1<<15));//设置1bit停止位USART4->CR2 &= (~(0x3<<12));//设置115200波特率USART4->BRR =0x22b;//使能发送器USART4->CR1 |= (0X1<<3);//使能接收器USART4->CR1 |= (0X1<<2);//使能串口USART4->CR1 |= 0x1;}
//封装单个字符的发送函数
void putchar(char ch)
{//判断发送数据寄存器是否为空//不为空则等待while (!(USART4->ISR&(0x1<<7)));//为空。向发送数据寄存器写入USART4->TDR=ch;//等待送完成while (!(USART4->ISR&(0x1<<6)));}//单个字符的接收
char getchar()
{//判断接收数据寄存器是否有数据//没有数据则等待while (!(USART4->ISR&(0x1<<5)));//有数据就将数据读取返回return USART4->RDR;
}//封装字符串的输入
void gets(char *s)
{//循环调用单个字符接收while(1){*s=getchar();if(*s == '\r'){//s++;*s='\0';break;}putchar(*s);s++;}//*s = '\0';putchar('\n');putchar('\r');//等待读取到回车键\r,字符串接收}//字符串输出
void puts(char *s)
{//循环调用单个字符的发送//直到遇到\0结束//最后末尾发送一个换行一个回车while(*s){putchar(*s);s++;}putchar('\0');putchar('\n');putchar('\r');
}int mystrcmp(char *s1,char *s2)
{while(*s1==*s2){if(*s1=='\0'||*s2=='\0'){break;}s1++;s2++;}return (*s1 - *s2);
}void led_init()
{//GPIO初始化//外设时钟//*((unsigned int *)0x50000A28) |= (0x3 <<4);RCC->MP_AHB4ENSETR |= (0x3 <<4);//*((unsigned int *)0x50006000) &= (~(0x3 << 20));//*((unsigned int *)0x50006000) |= (0x1 << 20);GPIOE->MODER &= (~(0x3 << 20));GPIOE->MODER |= (0x1 << 20);//*((unsigned int *)0x50007000) &= (~(0x3 << 20));//*((unsigned int *)0x50007000) |= (0x1 << 20);GPIOF->MODER &= (~(0x3 << 20));GPIOF->MODER |= (0x1 << 20);//*((unsigned int *)0x50006000) &= (~(0x3 << 16));//*((unsigned int *)0x50006000) |= (0x1 << 16);GPIOE->MODER &= (~(0x3 << 16));GPIOE->MODER |= (0x1 << 16);//*((unsigned int *)0x50006004) &= (~(0x1 << 10));//*((unsigned int *)0x50007004) &= (~(0x1 << 10));//*((unsigned int *)0x50006004) &= (~(0x1 << 8));GPIOE->OTYPER &= (~(0x1 << 10));GPIOF->OTYPER &= (~(0x1 << 10));GPIOE->OTYPER &= (~(0x1 << 8));//*((unsigned int *)0x50006008) &= (~(0x3 << 20));//*((unsigned int *)0x50007008) &= (~(0x3 << 20));//*((unsigned int *)0x50006008) &= (~(0x3 << 16));GPIOE->OSPEEDR &= (~(0x3 << 20));GPIOF->OSPEEDR &= (~(0x3 << 20));GPIOE->OSPEEDR &= (~(0x3 << 16));//*((unsigned int *)0x5000600c) &= (~(0x3 << 20));//*((unsigned int *)0x5000700c) &= (~(0x3 << 20));//*((unsigned int *)0x5000600c) &= (~(0x3 << 16));GPIOE->PUPDR &= (~(0x3 << 20));GPIOF->PUPDR &= (~(0x3 << 20));GPIOE->PUPDR &= (~(0x3 << 16));
}void led_ctl(int which,int cmd)
{switch(which){case 1:if(cmd == 0){GPIOE->ODR &= (~(0x1<<10));}else if(cmd == 1){GPIOE->ODR |= (0x1<<10);}break;case 2:if(cmd == 0){GPIOF->ODR &= (~(0x1<<10));}else if(cmd == 1){GPIOF->ODR |= (0x1<<10);}break;case 3:if(cmd == 0){GPIOE->ODR &= (~(0x1<<8));}else if(cmd == 1){GPIOE->ODR |= (0x1<<8);}break;}
}

2.单片机串口控制风扇开关

 

 

char buf[32];while (1){memset(buf,0,sizeof(buf));HAL_UART_Receive(&huart1,(uint8_t *)buf,10,10000);if(strcmp(buf,"fan_on")==0){HAL_GPIO_WritePin(GPIOC,GPIO_PIN_6,GPIO_PIN_SET);//风扇是PC6引脚printf("the fan is on\n\r");}else if(strcmp(buf,"fan_off")==0){HAL_GPIO_WritePin(GPIOC,GPIO_PIN_6,GPIO_PIN_RESET);printf("the fan is off\n\r");}else{HAL_UART_Transmit(&huart1,(uint8_t *)buf,strlen(buf),5);}

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

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

相关文章

物联网开发利器:基于web的强大的可拖拽组态软件

随着互联网、物联网技术的快速发展&#xff0c;BY组态基于多年研发积累和私有部署实践打磨、以及对业务场景的深入理解&#xff0c;推出了适用于物联网应用场景的轻量型web组态软件。 该产品采用 B/S 架构&#xff0c;提供 web 管理界面&#xff0c;软件包大小仅 50MB&#xf…

【开源免费】基于SpringBoot+Vue.JS保密信息学科平台(JAVA毕业设计)

本文项目编号 T 112 &#xff0c;文末自助获取源码 \color{red}{T112&#xff0c;文末自助获取源码} T112&#xff0c;文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…

ceph文件系统

ceph文件系统&#xff1a;高度可扩展&#xff0c;分布式的存储文件系统&#xff0c;旨在提高性能&#xff0c;高可靠性和高可用的对 象存储&#xff0c;块存储&#xff0c;文件系统的存储。使用分布式的算法保证数据的高可用和一致性。 ceph的组件 1、MON&#xff1a;ceph m…

MySQL 入门大全:运算符

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/literature?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;…

Px4 V2.4.8飞控Mavlink命令控制说明

首先&#xff0c;可以使用两种方法连接飞控&#xff0c;使用虚拟机&#xff08;LINUX&#xff09;或使用地面站&#xff08;QGC&#xff09;连接。 在px4的代码文件位置打开命令终端&#xff0c;输入连接命令&#xff1a; ./Tools/mavlink_shell.py 在控制台使用help来获取所有…

【Vim Masterclass 笔记05】第 4 章:Vim 的帮助系统与同步练习

文章目录 Section 4&#xff1a;The Vim Help System&#xff08;Vim 帮助系统&#xff09;S04L14 Getting Help1 打开帮助系统2 退出帮助系统3 查看具体命令的帮助文档4 查看帮助文档中的主题5 帮助文档间的上翻、下翻6 关于 linewise7 查看光标所在术语名词的帮助文档8 关于退…

java Redisson 实现限流每秒/分钟/小时限制N个

1.引入maven包: <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><dependency><groupId>org.redisson</groupId><artifactId>red…

C# 标准数字格式字符串

总目录 前言 当前文章为 C# 中的格式设置(格式化字符串) 大全 中的一个小章节。 一、概述 1. 基本信息 标准数字格式字符串用于格式化通用数值类型。标准数字格式字符串采用 [format specifier][precision specifier] 的形式 format specifier 格式说明符&#xff0c;负责指…

网络分析工具-tcpdump

文章目录 前言一、tcpdump基础官网链接命令选项详解常规过滤规则tcpdump输出 一、tcpdump实践HTTP协议ICMP状态抓包 前言 当遇到网络疑难问题的时候&#xff0c;抓包是最基本的技能&#xff0c;通过抓包才能看到网络底层的问题 一、tcpdump基础 tcpdump是一个常用的网络分析工…

【微软,模型规模】模型参数规模泄露:理解大型语言模型的参数量级

模型参数规模泄露&#xff1a;理解大型语言模型的参数量级 关键词&#xff1a; #大型语言模型 Large Language Model #参数规模 Parameter Scale #GPT-4o #GPT-4o-mini #Claude 3.5 Sonnet 具体实例与推演 近日&#xff0c;微软在一篇医学相关论文中意外泄露了OpenAI及Claud…

springboot集成qq邮箱服务

springboot集成qq邮箱服务 1.获取QQ邮箱授权码 1.1 登录QQ邮箱 1.2 开启SMTP服务 找到下图中的SMTP服务区域&#xff0c;如果当前账号未开启的话自己手动开启。 1.3 获取授权码 进入上图中的【管理服务】后&#xff1a;在【安全设置中生成授权码】,也可以直接点击【继续生成…

Windows系统提示ffmpeg.dll丢失怎么解决?

一、了解ffmpeg.dll文件 ffmpeg.dll是FFmpeg项目的一个动态链接库文件&#xff0c;FFmpeg是一个开源的多媒体处理框架&#xff0c;能够解码、编码、转码、混流、过滤和播放几乎所有已知格式的音频和视频文件。当Windows系统提示ffmpeg.dll丢失时&#xff0c;通常意味着某个需要…

直观解读 JuiceFS 的数据和元数据设计(一)

大家读完觉得有意义和帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 1 JuiceFS 高层架构与组件2 搭建极简 JuiceFS 集群 2.1 搭建元数据集群2.2 搭建对象存储&#xff08;MinIO&#xff09; 2.2.1 启动 MinIO server2.2.2 创建 bucket2.3 下载 juicefs 客户端2.4 创…

分布式微服务项目___某污水处理项目

一.分布式微服务项目___污水处理项目 项目地址:https://gitee.com/yanyigege/collaborative-water-springboot.git ​ 1.项目背景 总公司在全国各地有处理污水的项目部,各项目部处理自己的污水,总部需要监控各地分项目部每天处理污水的原料用量,掌握各分部的污水处理情况 ​…

鸿蒙HarmonyOS开发:拨打电话、短信服务、网络搜索、蜂窝数据、SIM卡管理、observer订阅管理

文章目录 一、call模块&#xff08;拨打电话&#xff09;1、使用makeCall拨打电话2、获取当前通话状态3、判断是否存在通话4、检查当前设备是否具备语音通话能力 二、sms模块&#xff08;短信服务&#xff09;1、创建短信2、发送短信 三、radio模块&#xff08;网络搜索&#x…

TVS二极管选型【EMC】

TVS器件并联在电路中&#xff0c;当电路正常工作时&#xff0c;他处于截止状态&#xff08;高阻态&#xff09;&#xff0c;不影响线路正常工作&#xff0c;当线路处于异常过压并达到其击穿电压时&#xff0c;他迅速由高阻态变为低阻态&#xff0c;给瞬间电流提供一个低阻抗导通…

sqlalchemy-access库操作MS Access

因目前项目中数据处理的量稍大&#xff0c;为了方便和业务进行交互&#xff0c;对数据的加工和处理放到微软桌面数据库MS Access中。然后有些地方通过 Python 来操作 MS Access 数据库&#xff0c;用到 sqlalchemy-access库。本文对操作的要点做简单的描述。 之前写过一篇 Pyt…

UnityRenderStreaming使用记录(三)

测试UnityRenderStreaming在Ubuntu24.04.1LTS上的表现 先放上运行图操作系统 Ubuntu24.04.1LTSUnity测试工程环境相关修改遇到的问题 先放上运行图 操作系统 Ubuntu24.04.1LTS 系统下载地址 https://cn.ubuntu.com/download/desktop安装UnityHub https://blog.csdn.net/AWNUXC…

==和===的区别,被坑的一天

在 JavaScript 中&#xff0c; 和 都用于比较两个值&#xff0c;但它们有一个重要的区别&#xff1a; 1. (宽松相等运算符) 进行比较时&#xff0c;会 自动类型转换&#xff08;也叫做强制类型转换&#xff09;&#xff0c;即如果比较的两个值的类型不同&#xff0c;JavaScr…

Git的使用流程(详细教程)

目录 01.Git是什么&#xff1f; 1.1 Git简介 1.2 SVN与Git的最主要的区别 1.3 GIt主要特点 02.Git是干什么的&#xff1f; 2.1.Git概念汇总 2.2 工作区/暂存区/仓库 2.3 Git使用流程 03.Git的安装配置 3.1 Git的配置文件 3.2 配置-初始化用户 3.3 Git可视化…