1.2作业

温湿度数据通过中断处理显示到数码管中

main.c

#include "spi.h"#include"si7006.h"int main(){int i=0,j=0,m=0,n=0;int num[10] = {0xFC,0x60,0xDA,0xF2,0x66,0xB6,0x3E,0xE0,0xFE,0xF6};SPI_init();unsigned short hum;short tem;//进行si7006的初始化si7006_init();while(1){//读取湿度hum=si7006_read_hum_data(0X40,0XE5);//读取温度tem=si7006_read_temp_data(0X40,0XE3);//将温度数据和湿度数据按照转换公式进行转换hum=125*hum/65536-6;tem=175.72*tem/65536-46.85;//将获取到的数据打印到串口i=hum/10;j=hum%10;m=tem/10;n=tem%10;for(int s=0;s<5000;s++){SPI_write(0x80);  // 发送数码管的位 SPI_write(num[i]);  // 发送数码管的段NSS_OUTPUT_L();delay_ms(1);NSS_OUTPUT_H();   // 锁存的时钟从低到高的变化SPI_write(0x40);  // 发送数码管的位 SPI_write(num[j]);  // 发送数码管的段NSS_OUTPUT_L();delay_ms(1);NSS_OUTPUT_H();   // 锁存的时钟从低到高的变化SPI_write(0x20);  // 发送数码管的位 SPI_write(num[m]);  // 发送数码管的段NSS_OUTPUT_L();delay_ms(1);NSS_OUTPUT_H();   // 锁存的时钟从低到高的变化SPI_write(0x10);  // 发送数码管的位 SPI_write(num[n]);  // 发送数码管的段NSS_OUTPUT_L();delay_ms(1);NSS_OUTPUT_H();   // 锁存的时钟从低到高的变化}}return 0;}

spi.c

#include"spi.h"void delay_us1(unsigned int us)
{int i,j;for(i=0;i<us;i++){for(j=0;j<1;j++);}
}
void delay_ms(int ms)
{int i,j;for(i = 0; i < ms;i++)for (j = 0; j < 1800; j++);
}   
void SPI_init(void)
{//1.使能GPIOE时钟RCC->MP_AHB4ENSETR |= (0x1 << 4);//2.MOSI管脚PE14 设置输出的属性GPIOE->MODER &=(~(0x3<<28));GPIOE->MODER |=(0x1<<28);GPIOE->OTYPER |=(0x1<<14);//推挽输出GPIOE->OSPEEDR &= (~(0x3 << 28));GPIOE->PUPDR &= (~(0x3 << 28));//3.MISO管脚PE13 设置输入的属性GPIOE->MODER &=(~(0x3<<26));GPIOE->OSPEEDR &= (~(0x3 << 26));GPIOE->PUPDR &= (~(0x3 << 26));//4.SCK管脚PE12  设置输出的属性GPIOE->MODER &=(~(0x3<<24));GPIOE->MODER |=(0x1<<24);GPIOE->OTYPER &= (~(0x1 << 12));GPIOE->OSPEEDR &= (~(0x3 << 24));GPIOE->PUPDR &= (~(0x3 << 24));//5.RCK(NSS)管脚  设置输出的属性GPIOE->MODER &=(~(0x3<<22));GPIOE->MODER |=(0x1<<22);GPIOE->OTYPER &= (~(0x1 << 11));GPIOE->OSPEEDR &= (~(0x3 << 22));GPIOE->PUPDR &= (~(0x3 << 22));//默认PE12和PE11输出低电平,方便产生上升沿GPIOE->ODR |=(~(0x3<<11));
}
void SPI_write(unsigned char dat)
{unsigned int i;for(i=0;i<8;i++){if(dat&0X01){//输出高电平MOSI_OUTPUT_H();}else{//输出低电平MOSI_OUTPUT_L();}dat >>= 1;//产生上升沿SCK_OUTPUT_L();delay_us1(5);SCK_OUTPUT_H();delay_us1(5);}}

spi.h

#ifndef __SPI_H__
#define __SPI_H__#include "stm32mp1xx_gpio.h"
#include "stm32mp1xx_rcc.h"
// MOSI对应的引脚输出高低电平的信号PE14
#define  MOSI_OUTPUT_H()    do{GPIOE->ODR |= (0x1 << 14);}while(0)
#define  MOSI_OUTPUT_L()    do{GPIOE->ODR &= (~(0x1 << 14));}while(0)// 对应595芯片的锁存引脚输出高低电平  PE11
#define  NSS_OUTPUT_H()     do{GPIOE->ODR |= (0x1 << 11);}while(0)
#define  NSS_OUTPUT_L()     do{GPIOE->ODR &= (~(0x1 << 11));}while(0)// 时钟信号对应的引脚输出高低电平  PE12
#define  SCK_OUTPUT_H()     do{GPIOE->ODR |= (0x1 << 12);}while(0)
#define  SCK_OUTPUT_L()     do{GPIOE->ODR &= (~(0x1 << 12));}while(0)/** 函数功能: SPI初始化函数,推挽输出,高速,禁止上拉和下拉* 函数参数:无* 函数返回值:无
*/
void SPI_init(void);
/** 函数功能:SPI发送数据的函数* 函数参数:dat : 要发送的数据* 函数返回值:无*
*/
void SPI_write(unsigned char dat);void delay_us1(unsigned int us);
void delay_ms(int ms);
#endif  // __SPI_H__

数码管不同位显示不同数字---计时器

                ​​​​​​​        ​​​​​​​        ​​​​​​​

main.c

#include "spi.h"#include"si7006.h"int main(){int i=0,j=0,m=0,n=0;int num[10] = {0xFC,0x60,0xDA,0xF2,0x66,0xB6,0x3E,0xE0,0xFE,0xF6};SPI_init();while(1){for(int s=0;s<260;s++){SPI_write(0x80);  // 发送数码管的位 SPI_write(num[i]);  // 发送数码管的段NSS_OUTPUT_L();delay_ms(1);NSS_OUTPUT_H();   // 锁存的时钟从低到高的变化SPI_write(0x40);  // 发送数码管的位 SPI_write(num[j]);  // 发送数码管的段NSS_OUTPUT_L();delay_ms(1);NSS_OUTPUT_H();   // 锁存的时钟从低到高的变化SPI_write(0x20);  // 发送数码管的位 SPI_write(num[m]);  // 发送数码管的段NSS_OUTPUT_L();delay_ms(1);NSS_OUTPUT_H();   // 锁存的时钟从低到高的变化SPI_write(0x10);  // 发送数码管的位 SPI_write(num[n]);  // 发送数码管的段NSS_OUTPUT_L();delay_ms(1);NSS_OUTPUT_H();   // 锁存的时钟从低到高的变化}n++;if(n>9){n=0;m++;}}return 0;}

spi.c和spi.h同上

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

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

相关文章

计算机网络 VLAN

路由器将多个局域网连接起来&#xff0c;而交换机将一个局域网里的设备连接起来。 路由器的端口分配局域网的网段&#xff08;子网网段&#xff09;&#xff0c;局域网的内部设备的ip都在这个网段里&#xff0c;再由交换机将数据派发到目的设备&#xff0c;交换机是按照MAC地址…

CMake入门教程【核心篇】编译类型Debug、Release、MinSizeRel、RelWithDebInfo

文章目录 1.说明1.1 Debug 配置1.2 Release 配置1.3 MinSizeRel 配置1.4 RelWithDebInfo 配置 2.提供的编译类型3.示例结论 1.说明 CMake作为一款强大的构建系统&#xff0c;提供了多种编译配置选项。这些配置影响编译过程中的优化级别和调试信息的包含情况。以下是CMake提供的…

技术人员的升级之路:六西格玛黑带培训的力量

在我从一名刚接触质量管理的新人成长为六西格玛黑带的过程中&#xff0c;有一个观念一直伴随着我&#xff0c;那就是改善和卓越不是一个项目&#xff0c;而是一场永无止境的旅程&#xff01; 退一步说&#xff0c;六西格玛管理带来的改变对一个组织有多么深刻呢&#xff1f;它…

10 个值得收藏的顶级手机数据恢复软件【2024年最新】

手机数据恢复&#xff0c;不要担心&#xff0c;今天就给大家分享10款数据恢复软件&#xff01; 现代人的手机中存储了许多重要数据&#xff0c;如照片、视频、消息、联系人等文件&#xff0c;如果手机损坏或数据丢失&#xff0c;这是一件非常烦恼的事情。此时&#xff0c;一款好…

教育CRM系统选型必看,CRM的这四大功能对教育企业来说必不可少

教育行业是出了名的“卷”&#xff0c;对教育企业来说&#xff0c;学生和家长也属于客户&#xff0c;培育与学生、家长的关系是成功的关键。然而&#xff0c;教育机构对CRM管理系统的需求复杂多变&#xff0c;很难找到满意的解决方案。与传统的CRM系统不同&#xff0c;教育机构…

12864液晶使用中遇到问题

碰到一个问题就是我开发板对应的教程里&#xff0c;用的12864显示屏第15和第16引脚分别为CS1和CS2 但是没有配送12864显示屏&#xff0c;店里也没有 市面上其他家的12864显示屏第15引脚为PSB&#xff0c;第16引脚为空 这两种12864有什么区别&#xff1f;我可以买引脚为PSB的这种…

PDF最强处理工具-StirlingPDF

Stirling-PDF 一个功能强大的本地托管的基于 Web 的 PDF 操作工具&#xff0c;这个软件最初是使用 ChatGPT 制作的&#xff0c;持续的版本迭代更新&#xff0c;支持对 PDF 文件执行各种操作&#xff0c;例如拆分合并、转换、重组、添加图像、旋转、压缩等。完全开源免费&#x…

Angular学习-第一天问题记录

一、使用命令搭建脚手架angular-cli 1. npm install angular/cli 2. ng new 项目名称 3. cd 项目名称 4. ng serve --open 二、问题 1.使用npm install angular/cli 命令遇到的问题 npm ERR! code E401 npm ERR! Unable to authenticate, need: BASIC realm"Sonatype Ne…

【Python_PySide6学习笔记(二十四)】菜单栏QMenuBar类的基本用法

菜单栏QMenuBar类的基本用法 菜单栏QMenuBar类的基本用法前言一、QMainWindow 和 QWidget 的区别1、QMainWindow 简介2、QWidget 简介3、QMainWindow 和 QWidget 的区别二、QMenuBar 的常用方法1、获取 QMainWindow 的菜单栏 QMenuBar 对象2、创建 Action3、创建 一级菜单 Menu…

欧拉角和四元数之间的python转换代码

1、欧拉角转换到四元数&#xff0c;转换顺序是ZYX def rpy2quaternion(roll, pitch, yaw):xsin(roll/2)*cos(pitch/2)*cos(yaw/2)-cos(roll/2)*sin(pitch/2)*sin(yaw/2)ycos(roll/2)*sin(pitch/2)*cos(yaw/2)sin(roll/2)*cos(pitch/2)*sin(yaw/2)zcos(roll/2)*cos(pitch/2)*si…

puppeteer入门指南

一、简介 Puppeteer 是一个 Node 库&#xff0c;它提供了一个高级 API 来通过 DevTools 协议控制 Chromium 或 Chrome。 二、使用 1、安装nodejs最新版 2、安装puppeteer-core npm install puppeteer-core 3、编写main.js const puppeteer require(puppeteer-core);(as…

【嵌入式开发 Linux 常用命令系列 1.1-- find 找到文件并替换文件中的字符串】

文章目录 find 找到文件并替换文件中的字符串 find 找到文件并替换文件中的字符串 例如要查找所有 .d 类型的文件并使用 xargs 和 sed 命令替换文件中的特定字符串&#xff0c;你可以在命令行中使用以下命令组合&#xff1a; find . -type f -name "*.d" -print0 |…

pytest命令执行测试用例,捕获输出内容的三种方式

pytest有三种捕获输出的方式&#xff1a; • fd&#xff08;文件描述符&#xff09;级别的捕获&#xff08;默认&#xff09;&#xff1a;所有写入操作系统文件描述符1和2的内容将被捕获。 • sys级别的捕获&#xff1a;只有对Python文件sys.stdout和sys.stderr的写入操作会被…

信号可达1公里以上,Wi-Fi HaLow如何做到比传统Wi-Fi强?

随着物联网&#xff08;IoT&#xff09;技术的蓬勃发展&#xff0c;对于能够支持大量设备、长距离传输且功耗低的无线通信技术的需求日益增长。Wi-Fi HaLow&#xff08;基于IEEE 802.11ah标准&#xff09;是专为物联网需求量身定制的突破性无线解决方案。本文将深入探讨Wi-Fi H…

Zookeeper之Java客户端实战

ZooKeeper应用的开发主要通过Java客户端API去连接和操作ZooKeeper集群。可供选择的Java客户端API有&#xff1a; ZooKeeper官方的Java客户端API。第三方的Java客户端API&#xff0c;比如Curator。 接下来我们将逐一学习一下这两个java客户端是如何操作zookeeper的。 1. ZooKe…

linux top命令中 cpu 利用率/mem 使用率与load average平均负载计算方式

文章目录 1 简介2 CPU% 字段3 MEM% 字段4 load average 平均负载 1 简介 top 命令是 Linux 上一个常用的系统监控工具&#xff0c;它经常用来监控 Linux 的系统状态&#xff0c;是常用的性能分析工具&#xff0c;能够显示较全的系统资源信息&#xff0c;包括系统负载&#xff…

Linux系统文件IO

Linux系统文件IO 每个系统都有自己的专属函数&#xff0c;我们习惯称其为系统函数。系统函数并不是内核函数&#xff0c;因为内核函数是不允许用户使用的&#xff0c;系统函数就充当了二者之间的桥梁&#xff0c;这样用户就可以间接的完成某些内核操作了。 在前面介绍了文件描…

【5G PHY】5G 物理层加速卡介绍

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 本人就职于国际知名终端厂商&#xff0c;负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作&#xff0c;目前牵头6G算力网络技术标准研究。 博客…

vue3项目创建

安装node.js vue --version &#xff08;4.5.0以上&#xff09; npm install -g vue/cli vue create 项目名称 npm run dev 启动 npm run build 打包 ———————— vite 创建工程 npm create vuelatest npm i npm run dev 启动 npm run build 打包 项目结构…

kubectl陈述式资源管理

管理k8s核心资源的三种基本方法 1.陈述式资源管理方法 --主要依赖命令行工具kubectl进行管理 优点 可以满足90%以上的使用场景 对资源的增、删、查操作比较容易 缺点 命令冗长&#xff0c;复杂&#xff0c;难以记忆 特定场景下&#xff0c;无法实现管理需求 对资源的修改麻烦…