本文共 5407 字,大约阅读时间需要 18 分钟。
开发硬件:
开发软件:
下载好后解压,在文件路径:
X;\0.96inch_SPI_OLED_Module_SSD1306_MSP096X_V1.0\1-Demo\Demo_STM32\0.96inch_OLED_Demo_STM32F103RCT6_Hardware_4-wire_SPI\PROJECT
中找到keil5工程文件,打开 在厂家的 Demo 程序中有许多的演示部分,我们都不需要,要显示自己的姓名学号和滚动显示内容,只需要用到下面的部分
AHT20接收数据和显示函数
void read_AHT20_once(void){ //延时 10 微妙 delay_ms(10); //传输数据前进行启动传感器和软复位 reset_AHT20(); delay_ms(10); //查看使能位 init_AHT20(); delay_ms(10); //触发测量 startMeasure_AHT20(); delay_ms(80); //读数据 read_AHT20(); delay_ms(5);}void reset_AHT20(void){ //数据传输开始信号 I2C_Start(); //发送数据 I2C_WriteByte(0x70); //接收 ACK 信号 ack_status = Receive_ACK(); //发送软复位命令(重启传感器系统) I2C_WriteByte(0xBA); //接收 ACK 信号 ack_status = Receive_ACK(); //停止 I2C 协议 I2C_Stop();}//0x70 —> 0111 0000 前七位表示 I2C 地址,第八位为0,表示 write//0xE1 —> 看状态字的校准使能位Bit[3]是否为 1//0x08 0x00 —> 0xBE 命令的两个参数,详见 AHT20 参考手册void init_AHT20(void){ //传输开始 I2C_Start(); //写入 0x70 数据 I2C_WriteByte(0x70); //接收 ACK 信号 ack_status = Receive_ACK(); //写入 0xE1 数据 I2C_WriteByte(0xE1); ack_status = Receive_ACK(); //写入 0x08 数据 I2C_WriteByte(0x08); ack_status = Receive_ACK(); //写入 0x00 数据 I2C_WriteByte(0x00); ack_status = Receive_ACK(); //停止 I2C 协议 I2C_Stop();}//0x70 —> 0111 0000 前七位表示 I2C 地址,第八位为0,表示 write//0xAC —> 触发测量//0x33 0x00 —> 0xAC 命令的两个参数,详见 AHT20 参考手册void startMeasure_AHT20(void){ //启动 I2C 协议 I2C_Start(); I2C_WriteByte(0x70); ack_status = Receive_ACK(); I2C_WriteByte(0xAC); ack_status = Receive_ACK(); I2C_WriteByte(0x33); ack_status = Receive_ACK(); I2C_WriteByte(0x00); ack_status = Receive_ACK(); I2C_Stop();}void read_AHT20(void){ uint8_t i; //初始化 readByte 数组 for(i=0; i<6; i++) { readByte[i]=0; } I2C_Start(); //通过发送 0x71 可以获取一个字节的状态字 I2C_WriteByte(0x71); ack_status = Receive_ACK(); //接收 6 个 8 bit的数据 readByte[0]= I2C_ReadByte(); //发送 ACK 信号 Send_ACK(); readByte[1]= I2C_ReadByte(); Send_ACK(); readByte[2]= I2C_ReadByte(); Send_ACK(); readByte[3]= I2C_ReadByte(); Send_ACK(); readByte[4]= I2C_ReadByte(); Send_ACK(); readByte[5]= I2C_ReadByte(); //发送 NACK 信号 SendNot_Ack(); I2C_Stop(); //温湿度的二进制数据处理 //0x68 = 0110 1000 //0x08 = 0000 1000 if( (readByte[0] & 0x68) == 0x08 ) { H1 = readByte[1]; //H1 左移 8 位并与 readByte[2] 相或 H1 = (H1<<8) | readByte[2]; H1 = (H1<<8) | readByte[3]; //H1 右移 4 位 H1 = H1>>4; H1 = (H1*1000)/1024/1024; T1 = readByte[3]; //与运算 T1 = T1 & 0x0000000F; T1 = (T1<<8) | readByte[4]; T1 = (T1<<8) | readByte[5]; T1 = (T1*2000)/1024/1024 - 500; AHT20_OutData[0] = (H1>>8) & 0x000000FF; AHT20_OutData[1] = H1 & 0x000000FF; AHT20_OutData[2] = (T1>>8) & 0x000000FF; AHT20_OutData[3] = T1 & 0x000000FF; } else { AHT20_OutData[0] = 0xFF; AHT20_OutData[1] = 0xFF; AHT20_OutData[2] = 0xFF; AHT20_OutData[3] = 0xFF; } Show_OLED();}//转化字符串输出到 OLED 上void Show_OLED(void){ t = T1/100; switch(t) { case 0:break; case 1:strTemp1 = "1";break; case 2:strTemp1 = "2";break; case 3:strTemp1 = "3";break; case 4:strTemp1 = "4";break; case 5:strTemp1 = "5";break; case 6:strTemp1 = "6";break; case 7:strTemp1 = "7";break; case 8:strTemp1 = "8";break; case 9:strTemp1 = "9";break; } t = (T1/10)%10; switch(t) { case 0:strTemp2 = "0";break; case 1:strTemp2 = "1";break; case 2:strTemp2 = "2";break; case 3:strTemp2 = "3";break; case 4:strTemp2 = "4";break; case 5:strTemp2 = "5";break; case 6:strTemp2 = "6";break; case 7:strTemp2 = "7";break; case 8:strTemp2 = "8";break; case 9:strTemp2 = "9";break; } t = T1%10; switch(t) { case 0:strTemp3 = "0";break; case 1:strTemp3 = "1";break; case 2:strTemp3 = "2";break; case 3:strTemp3 = "3";break; case 4:strTemp3 = "4";break; case 5:strTemp3 = "5";break; case 6:strTemp3 = "6";break; case 7:strTemp3 = "7";break; case 8:strTemp3 = "8";break; case 9:strTemp3 = "9";break; } t = H1/100; switch(t) { case 0:break; case 1:strHumi1 = "1";break; case 2:strHumi1 = "2";break; case 3:strHumi1 = "3";break; case 4:strHumi1 = "4";break; case 5:strHumi1 = "5";break; case 6:strHumi1 = "6";break; case 7:strHumi1 = "7";break; case 8:strHumi1 = "8";break; case 9:strHumi1 = "9";break; } t = H1/100; switch(t) { case 0:strHumi2 = "0";break; case 1:strHumi2 = "1";break; case 2:strHumi2 = "2";break; case 3:strHumi2 = "3";break; case 4:strHumi2 = "4";break; case 5:strHumi2 = "5";break; case 6:strHumi2 = "6";break; case 7:strHumi2 = "7";break; case 8:strHumi2 = "8";break; case 9:strHumi2 = "9";break; } t = H1/100; switch(t) { case 0:strHumi3 = "0";break; case 1:strHumi3 = "1";break; case 2:strHumi3 = "2";break; case 3:strHumi3 = "3";break; case 4:strHumi3 = "4";break; case 5:strHumi3 = "5";break; case 6:strHumi3 = "6";break; case 7:strHumi3 = "7";break; case 8:strHumi3 = "8";break; case 9:strHumi3 = "9";break; } GUI_ShowString(40,32," ",16,1); GUI_ShowString(40,48," ",16,1); GUI_ShowCHinese(0,32,16,"温度:",1); GUI_ShowString(40,32,strTemp1,16,1); GUI_ShowString(48,32,strTemp2,16,1); GUI_ShowString(56,32,".",16,1); GUI_ShowString(64,32,strTemp3,16,1); GUI_ShowCHinese(72,32,16,"℃",1); GUI_ShowCHinese(0,48,16,"湿度:",1); GUI_ShowString(40,48,strHumi1,16,1); GUI_ShowString(48,48,strHumi2,16,1); GUI_ShowString(56,48,".",16,1); GUI_ShowString(64,48,strHumi3,16,1); GUI_ShowCHinese(72,48,16,"%",1);}
在main函数里加入显示函数
效果
转载地址:http://anpqi.baihongyu.com/