2024/1/2作业

成果

代码

main .c====================

#include "sqi.h"

#include "si7006.h"

unsigned int num[10] = {0xFC, 0x60, 0xDA,0xF2,0x66,0xB6,0xBE,0XE0,0xFE,0xF6};

//unsigned int wei[5]={0x10,0x20,0x40,0x80,0xF0};

unsigned short hum;

short tem;

extern void printf(const char *fmt, ...);

int main()

{

    int a,b,c,d;

   key1_it_config();

   si7006_init();

   SPI_init();

   /*

     int i,j;

   while(1){

    for(i=0;i<10;i++)

    {

        for(j=0;j<5;j++)

        {

            SPI_write(wei[j]);

      SPI_write(num[i]);

      NSS_OUTPUT_L();

      delay(20);

      NSS_OUTPUT_H();

      delay(100);

        }

    if(j==5)

   {

     j=0;

   }

    }

   }*/


 

   while (1)

   {

     hum=si7006_read_hum_data(0x40,0xE5);

     tem=si7006_read_temp_data(0x40,0xE5);

     hum=125*hum/65536-6;

     tem=175.72*tem/65536-46.85;

     printf("hum=%d\n",hum);

     printf("tem=%d\n",tem);

     //获取数据的各个数

     a=hum/10;

     b=hum%10;

     c=tem/10;

     d=tem%10;

     for(int i=0;i<10000;i++)

     {

      SPI_write(0x80);

      SPI_write(num[a]);

      NSS_OUTPUT_L();

      delay(1);

      NSS_OUTPUT_H();

   

      SPI_write(0x40);

      SPI_write(num[b]);

      NSS_OUTPUT_L();

      delay(1);

      NSS_OUTPUT_H();

   

      SPI_write(0x20);

      SPI_write(num[c]);

      NSS_OUTPUT_L();

      delay(1);

      NSS_OUTPUT_H();

     

      SPI_write(0x10);

      SPI_write(num[d]);

      NSS_OUTPUT_L();

      delay(1);

      NSS_OUTPUT_H();

      delay(2000);

     }

   }

}

iic.c=============================

#include"iic.h"

#include"sqi.h"

void i2c_init(void)//i2c初始化

{

    RCC->MP_AHB4ENSETR|=(0x1<<5);

    GPIOF->MODER &=(~(0xF<<28));

    GPIOF->MODER |=(0x5<<28);

    GPIOF->OTYPER &=(~(0x3<<14));

    GPIOF->OSPEEDR|=(0xF<<28);

    GPIOF->PUPDR &=(~(0xF<<28));

    //空闲拉高

    I2C_SDA_H;

    I2C_SCL_H;

}

void i2c_start(void)//起始信号发送

{

   SET_SDA_OUT;

   //空闲拉高

   I2C_SCL_H;

   I2C_SDA_H;

   //形成下降沿

   delay(20);

   I2C_SDA_L;

   delay(20);

   I2C_SCL_L;

}

void i2c_stop(void)//终止信号发送

{

    SET_SDA_OUT;

   

   I2C_SCL_L;

    delay(20);

    I2C_SDA_L;

   delay(20);

   I2C_SCL_H;

   delay(20);

   I2C_SDA_H;

}

void i2c_write_byte(unsigned char data)//写入一个字节

{

SET_SDA_OUT;

unsigned int i;

for(i=0;i<8;i++)

{

    I2C_SCL_L;

    delay(20);

    if(data&0x80)

    {

        I2C_SDA_H;

    }else

    {

        I2C_SDA_L;

    }

    delay(20);

    I2C_SCL_H;

    delay(20);

    delay(20);

    data=data<<1;

}


 

}

unsigned char i2c_read_byte(unsigned char ack)//读取一个字节

{

     unsigned int i;

     unsigned char dat;

     SET_SDA_IN;

     for ( i = 0; i < 8; i++)

     {

        I2C_SCL_L;

        delay(20);

        delay(20);

        I2C_SCL_H;

        delay(20);

        dat=dat<<1;

        if (I2C_SDA_READ)

        {

            dat|=1;

        }else{

            dat &=(~0x1);

        }

        delay(20);

     }

     if(ack)

     {

          i2c_nack();

     }else{

        i2c_ack();

     }

     return dat;

     

}

unsigned char i2c_wait_ack(void)//等待应答信号

{

    I2C_SCL_L;

    I2C_SDA_H;

    delay(20);

    SET_SDA_IN;

    delay(20);

    delay(20);

    I2C_SCL_H;

    if (I2C_SDA_READ)

    {

        return 1;

    }

      I2C_SCL_L;

      return 0;

   

}

void i2c_ack(void)//发送应答信号

{

    SET_SDA_OUT;

    I2C_SCL_L;

    delay(20);

    I2C_SDA_L;

    delay(20);

    I2C_SCL_H;

    delay(20);

    delay(20);

    I2C_SCL_L;

}

void i2c_nack(void)//发送信号信号

{

    SET_SDA_OUT;

    I2C_SCL_L;

    delay(20);

    I2C_SDA_H;

    delay(20);

    I2C_SCL_H;

    delay(20);

    delay(20);

    I2C_SCL_L;

}

si7006.c=======================================================================

#include "sqi.h"

#include "si7006.h"

#include "iic.h"

void si7006_init(void)

{

    i2c_init();

    i2c_start();

    i2c_write_byte(0x40<<1|0);

    i2c_wait_ack();

    i2c_write_byte(0xE6);

    i2c_wait_ack();

    i2c_write_byte(0x3A);

    i2c_wait_ack();

    i2c_stop();

}

unsigned short si7006_read_hum_data(unsigned char slave_addr,unsigned char cmd_code )

{

  unsigned short dat;

  unsigned char dat_h,dat_l;

  i2c_start();

  i2c_write_byte(slave_addr<<1|0);

  i2c_wait_ack();

  i2c_write_byte(cmd_code);

  i2c_wait_ack();

  i2c_start();

  i2c_write_byte(slave_addr<<1|1);

  i2c_wait_ack();

  delay(100);

  dat_h=i2c_read_byte(0);

  dat_l=i2c_read_byte(1);

  i2c_stop();

  dat=(dat_h<<8)|dat_l;

  return dat;


 

}

 short si7006_read_temp_data(unsigned char slave_addr,unsigned char cmd_code)

 {

  unsigned short dat;

  unsigned char dat_h,dat_l;

  i2c_start();

  i2c_write_byte(slave_addr<<1|0);

  i2c_wait_ack();

  i2c_write_byte(cmd_code);

  i2c_wait_ack();

  i2c_start();

  i2c_write_byte(slave_addr<<1|1);

  i2c_wait_ack();

  delay(100);

  dat_h=i2c_read_byte(0);

  dat_l=i2c_read_byte(1);

  i2c_stop();

  dat=(dat_h<<8)|dat_l;

  return dat;

 }

spi.c=================================================

#include "sqi.h"

void delay(unsigned int ms)

{

    int i,j;

    for(i=0;i<ms;i++)

    {

        for(j=0;j<100;j++);

    }

}

//初始化

void SPI_init(void)

{

    //设置时钟使能

    RCC->MP_AHB4ENSETR |= (0x1<<4);

    //设置输出

    //pe12 sck 输出

    GPIOE->MODER &= (~(0x03<<24));

    GPIOE->MODER |= (0x01<<24);

    GPIOE->OTYPER &=(~(0x3<<24));

    GPIOE->PUPDR &=(~(0x3<<24));

    //pe13 miso 输入

    GPIOE->MODER &= (~(0x03<<26));

    GPIOE->MODER |= (0x00<<26);

     GPIOE->OTYPER &=(~(0x3<<26));

    GPIOE->PUPDR &=(~(0x3<<26));

    //pe14 mosi 输出

    GPIOE->MODER &= (~(0x03<<28));

    GPIOE->MODER |= (0x01<<28);

     GPIOE->OTYPER &=(~(0x3<<28));

    GPIOE->PUPDR &=(~(0x3<<28));

    //pe11 nss 输出

    GPIOE->MODER &= (~(0x03<<22));

    GPIOE->MODER |=(0x01<<22);

     GPIOE->OTYPER &=(~(0x3<<28));

    GPIOE->PUPDR &=(~(0x3<<28));

    //pe12 pe11输出低电平

    SOCK_OUTPUT_L();

    NSS_OUTPUT_L();

}

//spi发送数据

void SPI_write(unsigned char dat)

{

   unsigned char i;

   for ( i = 0; i < 8; i++)

   {

       if(dat&0x01)

       {

          //MOSI高位

          MOSI_OUTPUT_H();

       }else{

          //MOSI低位

         MOSI_OUTPUT_L();

       }

       dat>>=1;

     //时钟线先初始低

     //初始化为低有数据输入时为高

     SOCK_OUTPUT_L();

     delay(200);

     SOCK_OUTPUT_H();

     delay(200);

   }

}

========================iic.h

#ifndef __IIC_H__

#define __IIC_H__

#include "stm32mp1xx_gpio.h"

#include "stm32mp1xx_rcc.h"

#define SET_SDA_OUT do{GPIOF->MODER &= (~(0x3<<30));GPIOF->MODER |=(0x1<<30);} while (0);

#define SET_SDA_IN  do{GPIOF->MODER &= (~(0x3<<30));}while(0);

#define I2C_SCL_H do{GPIOF->BSRR |= (0x1 << 14);} while (0);

#define I2C_SCL_L do{GPIOF->BRR |= (0x1 << 14);} while (0);

#define I2C_SDA_H do{GPIOF->BSRR |= (0x1 << 15);} while (0);

#define I2C_SDA_L do{GPIOF->BRR |= (0x1 << 15);} while (0);

#define I2C_SDA_READ  (GPIOF->IDR &(0x1 << 15))

void i2c_init(void);//i2c初始化

void i2c_start(void);//起始信号发送

void i2c_stop(void);//终止信号发送

void i2c_write_byte(unsigned char data);//写入一个字节

unsigned char i2c_read_byte(unsigned char ack);//读取一个字节

unsigned char i2c_wait_ack(void);//等待应答信号

void i2c_ack(void);//发送应答信号

void i2c_nack(void);//发送信号信号

#endif

si70006.h===============================

#ifndef __SI7006_H

#define __SI7006_H

#include "iic.h"

#define SI7006_SLAVE 0x40

void si7006_init(void);

unsigned short si7006_read_hum_data(unsigned char slave_addr, unsigned char cmd_code);

short si7006_read_temp_data(unsigned char slave_addr, unsigned char cmd_code);

#endif

spi.h======================================

#ifndef __SQI_HEAD__

#define __SQI_HEAD__

#include "stm32mp1xx_gpio.h"

#include "stm32mp1xx_rcc.h"

//delay时钟函数

void delay(unsigned int ms);

//MOSI对应的引脚输出高低电平的信号PE14

#define MOSI_OUTPUT_H() do{GPIOE->ODR |= (0x1<<14);}while(0)

#define MOSI_OUTPUT_L() do{GPIOE->ODR &= (~(0x1<<14));}while(0)

//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 SOCK_OUTPUT_H() do{GPIOE->ODR |= (0x1<<12);}while(0)

#define SOCK_OUTPUT_L() do{GPIOE->ODR &= (~(0x1<<12));}while(0)

//初始化

void SPI_init(void);

//spi发送数据

void SPI_write(unsigned char dat);

#endif

面试题

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++day5作业

全局变量&#xff0c;int monster 10000;定义英雄类hero&#xff0c;受保护的属性string name&#xff0c;int hp,int attck&#xff1b;公有的无参构造&#xff0c;有参构造&#xff0c;虚成员函数 void Atk(){blood-0;}&#xff0c;法师类继承自英雄类&#xff0c;私有属性 …

HarmonyOS 组件通用属性之通用事件 文档参数讲解(按键事件)

最后 我们来看按键事件 按键事件是指 键盘 遥控器等按键设备交互的时候触发的事件 这边 我们还是以按钮为例 给大家演示一下 我们 event 参数的类型 变成了 KeyEvent 我们还是先看看 里面都有些什么东西 还是打开编辑器文档 组件通用信息 通用事件 下面的 按键事件 首先 这…

RocketMQ(Linux版本5.1.4)

1、停止之前的运行服务 [roottssvr1-c1 rocketmq-all-4.7.0-bin-release]# sh bin/mqshutdown namesrv No mqnamesrv running. [roottssvr1-c1 rocketmq-all-4.7.0-bin-release]# [roottssvr1-c1 rocketmq-all-4.7.0-bin-release]# [roottssvr1-c1 rocketmq-all-4.7.0-bin-r…

探索Java的魅力

从本篇文章开始&#xff0c;小编准备写一个关于java基础学习的系列文章&#xff0c;文章涉及到java语言中的基础组件、实现原理、使用场景、代码案例。看完下面一系列文章&#xff0c;希望能加深你对java的理解。 本篇文章作为本系列的第一篇文章&#xff0c;主要介绍一些java…

【实用工具】FFmpeg常用的命令

前言 FFmpeg是一个强大的多媒体处理工具&#xff0c;可以用于处理音频、视频和图像。 命令格式 ffmpeg {1} {2} -i {3} {4} {5} 上面命令中&#xff0c;五个部分的参数依次如下。 1.全局参数 2.输入文件参数 3.输入文件 4.输出文件参数 5.输出文件 常见命令行参数 -c&…

Power Apps 学习笔记 - IOrganizationService Interface

文章目录 1. IOrganization Interface1.1 基本介绍1.2 方法分析 2. Entity对象2.1 Constructor2.2 Properties2.3 Methods 3. 相关方法3.1 单行查询 Retrive3.2 多行查询 RetriveMultiple3.3 增加 Create3.4 删除 Delete3.5 修改 Update 4. 数据查询的不同实现方式4.1 QueryExp…

vite+Vue3学习笔记(3)——界面设计

1 Element-plus 这是一个基于Vue3的组件库&#xff0c;能够快速构建界面样式。 官网链接&#xff1a; https://element-plus.gitee.io/zh-CN/guide/design.html 1.1 基础组件 1.1.1 安装 项目中的终端输入&#xff1a; npm install --save element-plus 1.1.2 引用 1.1.2.1…

RAG LLM App开发实战

大型语言模型&#xff08;LLM&#xff09;无疑改变了我们与信息交互的方式。 然而&#xff0c;对于我们可以向他们提出的要求&#xff0c;它们也有相当多的限制。 LLM&#xff08;例如 Llama-2-70b、gpt-4 等&#xff09;仅了解他们接受过训练的信息&#xff0c;当我们要求他们…

Python爬虫---selenium基本使用(支持无界面浏览器PhantomJS和Chrome handless)

为什么使用selenium&#xff1f; 使用urllib.request.urlopen()模拟浏览器有时候获取不到数据,所以使用selenium (1) selenium是一个用于web应用程序测试的工具 (2) selenium 测试直接运行在浏览器中&#xff0c;就像真正的用户在操作一样 (3) 支持通过各种driver (FirfoxDri…

手机摄影学习

手机摄影学习 手机摄影前期知识1&#xff0c;成像基本原理2&#xff0c;什么是焦距3&#xff0c;快门&#xff08;简称s&#xff09;4&#xff0c;上面功能之间的相互影响5&#xff0c;焦点6&#xff0c;过爆、欠曝7&#xff0c;cmos&#xff08;感光芯片&#xff09;、测光、聚…

【web】vue 播放后端(flask)发送的 mp3 文件

文章目录 演示后端&#xff08;flask&#xff09;前端&#xff08;vue3&#xff09;重要说明 演示 后端&#xff08;flask&#xff09; 后端返回的是 mp3 文件的 url&#xff0c;是可以直接在浏览器上打开后播放的处理跨域请求pip install flask-cors后端代码from flask impor…

骑砍战团MOD开发(30)-游戏大地图map.txt

骑砍1战团mod开发-大地图制作方法_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1rz4y1c7wH/ 一.骑砍游戏大地图 骑砍RTS视角游戏大地图 大地图静态模型(map.txt) 军团/城镇图标(module_parties.py). 骑砍大地图的战争迷雾和天气通过API进行管理和控制: # Weather-h…

Selenium框架添加CONNECT以抓取https网站

Selenium框架 Selenium是一个用于Web应用程序测试的强大工具&#xff0c;它提供了一系列的API&#xff0c;可以模拟用户在浏览器中的操作&#xff0c;包括点击、填写表单、导航等。在进行网络提取数据时&#xff0c;https网站的数据提取一直是一个技术难点。Selenium作为一个自…

git 如何撤销历史某次merge

git&#xff0c;如何 撤销某一次历史提交或merge&#xff0c;并保留该版本的后续提交&#xff1f; 场景1&#xff1a; 你有两个功能迭代版本的分支&#xff0c;一个是 15 号上线&#xff0c;一个是25号上线。5号的时候产品突然说&#xff0c;这两个版本一起上&#xff0c;然后…

[Flutter]Json和序列化数据

为较小的项目使用手动序列化数据 手动 JSON 解码是指在 dart:convert 中使用内置的 JSON 解码器。它包括将原始 JSON 字符串传递给 jsonDecode() 方法&#xff0c;然后在产生的 Map<String, dynamic> 计算结果中寻找你需要的值。它没有外部依赖或者特定的设置过程&#…

【数据库原理】(1)数据库技术的发展

数据与信息 数据&#xff1a;数据并非只是数字&#xff0c;像文字、符号、图像、影音等都属于数据的范畴。但一般会用数字来表述客观事物的数量、质量、关系等&#xff0c;便于更加直观的看待问题。 语义&#xff1a;数据还需要结合关联的语义解释才能够清晰的描述事物&#…

【CANopen】关于STM32的CanFestival移植

系列文章目录 文章目录 系列文章目录一、准备工作二、源码移植1、新建CubeMX工程2、移植CanFestival源码3、去除源码中的多余项4、源码修改 三、底层驱动适配四、字典工具1、字典的使用 使用STM32F407单片机 一、准备工作 CanFestival下载 二、源码移植 1、新建CubeMX工程 …

gorm.PrepareStmt模式使用不当问题查询

一、背景 xx服务内存持续上涨。内存占用10%以内&#xff0c;在QPS无明显变化的前提下&#xff0c;内存占用50%左右。 dump了一下heap内存&#xff0c;发现主要是 InitUserCacheRefresh 任务代码占用 正常来说&#xff0c;dao层查完数据库之后&#xff0c;对象应该会释放&…

设计模式:简单工厂模式、工厂方法模式、抽象工厂模式

简单工厂模式、工厂方法模式、抽象工厂模式 1. 为什么需要工厂模式&#xff1f;2. 简单工厂模式2.1. 定义2.2. 代码实现2.3. 优点2.4. 缺点2.5. 适用场景 3. 工厂方法模式3.1. 有了简单工厂模式为什么还需要有工厂方法模式&#xff1f;3.2. 定义3.3. 代码实现3.4. 主要优点3.5.…

Python怎么修改进程名称

目录 一、进程名称的概念 二、Python修改进程名称的方法 三、代码示例与使用说明 四、注意事项 五、适用场景 六、总结 Python是一种强大的编程语言&#xff0c;广泛应用于各种应用程序的开发。在Python中&#xff0c;修改进程名称可以通过多种方式实现。下面我们将深入探…