嵌入式十一周实验

这篇博客介绍了两个嵌入式实验,包括使用STM32F103通过I2C协议采集AHT20温湿度传感器数据,并通过串口输出;以及使用SPI接口与7针OLED显示屏交互,显示学号、姓名及温湿度信息。文章详细阐述了I2C和SPI协议、OLED工作原理及实验步骤,同时也分享了实验过程中的问题和解决方案。
摘要由CSDN通过智能技术生成

目录

实验一:温湿度采集

一、实验内容:

二、实验器材:

三、实验步骤:

实验总结:

 实验二:使用OLED

 实验内容:

实验器材:

 SPI简介:

(二)OLED简介

实验二:使用OLED


实验一:温湿度采集

一、实验内容:

学习I2C总线通信协议,使用STM32F103完成基于I2C协议的AHT20温湿度传感器的数据采集,并将采集的温度-湿度值通过串口输出。具体任务:

1)解释什么是“软件I2C”和“硬件I2C”? (阅读野火配套教材的第23章“I2C--读写EEPROM”原理章节)

2)阅读AHT20数据手册,编程实现:每隔2秒钟采集一次温湿度数据,并通过串口发送到上位机(win10)。

二、实验器材:

stm32f10芯片、AHT20温湿度传感器、computer

三、实验步骤:

1.12C协议

I2C 通讯协议(Inter-Integrated Circuit)是由 Phiilps 公司开发的,由于它引脚少,硬件实现简单,可扩展性强,不需要 USART、CAN 等通讯协议的外部收发设备,现在被广泛地使用在系统内多个集成电路(IC)间的通讯。

2.软件12C

将芯片的两个GPIO引脚分别用作SCL及SDA,按照I2C的时序要求,直接控制引脚的输出信号(若是接收数据时则读取 SDA 电平),就可以实现I2C通讯。由于是直接控制GPIO引脚的高低电平产生通讯时序,需要由CPU控制每个时刻的引脚状态,所以称为“软件模拟协议”方式即软件I2C方式。

3.硬件12C

硬件I2C对应芯片上的I2C外设,具有相应的I2C驱动电路,其所使用的I2C管脚也是专用的,因而效率要远高于软件模拟的I2C,但是程序较为繁琐。硬件I2C是直接调用内部寄存器进行配置。
对于硬件I2C来说,它需要I2C片上外设专门负责实现I2C通讯协议,只要配置好该外设,它就会自动根据协议要求产生I2C的通讯信号,收发数据并缓存起来,CPU只要检测该外设的状态和访问数据寄存器,就能完成数据收发。这种由硬件外设处理I2C协议的方式减轻了CPU的工作负担,并且使软件开发更简单

4.温湿度采集

a.主要代码

main.c

#include "delay.h"
#include "usart.h"
#include "bsp_i2c.h"


int main(void)
{	
	delay_init();     //?¨®¨º¡Ào¡¥¨ºy3?¨º??¡¥	  
	uart_init(115200);	 //¡ä??¨²3?¨º??¡¥?a115200
	IIC_Init();
		while(1)
	{
		printf("ζÈʪ¶ÈÏÔʾ");
		read_AHT20_once();
		delay_ms(1500);
  }
}

AHT20芯片读取数据read_AHT20函数

#ifndef __BSP_I2C_H
#define __BSP_I2C_H

#include "sys.h"
#include "delay.h"
#include "usart.h"
//ê1ó?IIC1 1ò??M24C02,OLED,LM75AD,HT1382    PB6,PB7
 
#define SDA_IN()  {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)8<<28;}
#define SDA_OUT() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)3<<28;}
 
//IO2ù×÷oˉêy	 
#define IIC_SCL    PBout(6) //SCL
#define IIC_SDA    PBout(7) //SDA	 
#define READ_SDA   PBin(7)  //ê?è?SDA 


//IIC?ùóD2ù×÷oˉêy
void IIC_Init(void);                //3?ê??ˉIICμ?IO?ú				 
void IIC_Start(void);				//·¢?íIIC?aê?D?o?
void IIC_Stop(void);	  			//·¢?íIICí£?1D?o?
void IIC_Send_Byte(u8 txd);			//IIC·¢?íò???×??ú
u8 IIC_Read_Byte(unsigned char ack);//IIC?áè?ò???×??ú
u8 IIC_Wait_Ack(void); 				//IICμè′yACKD?o?
void IIC_Ack(void);					//IIC·¢?íACKD?o?
void IIC_NAck(void);				//IIC2?·¢?íACKD?o?
 
void IIC_WriteByte(uint16_t addr,uint8_t data,uint8_t device_addr);
uint16_t IIC_ReadByte(uint16_t addr,uint8_t device_addr,uint8_t ByteNumToRead);//??′??÷μ??·£??÷?tμ??·£?òa?áμ?×??úêy  


void  read_AHT20_once(void);
void  reset_AHT20(void);
void  init_AHT20(void);	
void  startMeasure_AHT20(void);
void  read_AHT20(void);
uint8_t  Receive_ACK(void);
void  Send_ACK(void);
void  SendNot_Ack(void);
void I2C_WriteByte(uint8_t  input);
uint8_t I2C_ReadByte(void);	
void  set_AHT20sendOutData(void);
void  I2C_Start(void);
void  I2C_Stop(void);
#endif

硬件连线:

编译烧录结果:

四、实验总结:

有现成的代码操作起来也不是很难,就是对原理的理解有些看不明白,12C协议我都是直接借鉴的前辈的经验之谈,自己对其的理解聊胜于无。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值