标题:
STM8S105+SHT21温湿度计源程序(编程平台IAR)
[打印本页]
作者:
trenlyn
时间:
2020-12-24 15:15
标题:
STM8S105+SHT21温湿度计源程序(编程平台IAR)
本设计采用的是I2C总线,OLED屏、SHT21、DS1302连接在I2C总线上。一共使用了3个IO口,分别是PB5[I2C_SDA] ,PB4[I2C_SCL] ,PB3[用于DS1302的RET]。 硬件电路如图。采用的是STM8S105K4最小系统板。
全部程序都在附件里,解压后用IAR3.10版本以上可直接打开。
制作出来的实物图如下:
01.jpg
(147.49 KB, 下载次数: 49)
下载附件
2020-12-24 15:06 上传
单片机源程序如下:
#include <iostm8s105k4.h>
#include "delay.h"
#include "i2c.h"
#include "oled.h"
#include "sht2x.h"
#include "clock.h"
u8 year,month,date,hour,minute,second;
s16 sT;
u16 sRH;
u8 DATA[2];
void check_key(void);
void init_sys(void);
void HSE_CLK_INIT(void);
void Readclock(void);
void ShowTH(void);
void ShowClock(void);
void init_sys(void)
{
//------GPIO-----------------
PB_DDR_DDR3 = 1;
PB_CR1_C13 = 1;
PD_DDR_DDR5 = 1;
PD_CR1_C15 = 1;
//------UART-----------------
UART2_BRR1 = 0x34; //波特率9600 BRR = 0341H
UART2_BRR2 = 0x01; //
UART2_CR1 = 0x08; //一个起始位,8个数据 UARTD=0;UART使能
UART2_CR2 = 0x08; //发送使能 TEN = 1;
UART2_CR3 = 0x00; //1个停止位 STOP[1:0]=00
}
void HSE_CLK_INIT(void) //外部时钟使能
{
CLK_DeInit();
CLK_HSECmd(ENABLE);
while(SET != CLK_GetFlagStatus(CLK_FLAG_HSERDY));
CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV1);
CLK_ClockSwitchCmd(ENABLE);
CLK_ClockSwitchConfig(CLK_SWITCHMODE_AUTO , CLK_SOURCE_HSE , DISABLE ,CLK_CURRENTCLOCKSTATE_ENABLE);
}
void Readclock(void)
{
uint8_t tmp;
tmp = DS1302Read(DS1302_SECOND_READ);
second = (tmp/16)*10+(tmp%16);
tmp = DS1302Read(DS1302_MINUTE_READ);
minute = (tmp/16)*10+(tmp%16);
tmp = DS1302Read(DS1302_HOUR_READ);
hour = (tmp/16)*10+(tmp%16);
tmp = DS1302Read(DS1302_DATE_READ);
date = (tmp/16)*10+(tmp%16);
tmp = DS1302Read(DS1302_MONTH_READ);
month = (tmp/16)*10+(tmp%16);
tmp = DS1302Read(DS1302_YEAR_READ);
year = (tmp/16)*10+(tmp%16);
}
void ShowTH(void)
{
u8 tmp;
OLED_ShowChinese(4, 0, 2, 16); //温
OLED_ShowChinese(22, 0, 4, 16); //度
OLED_ShowChinese(104,0, 13,16); //℃
OLED_ShowChinese(4, 3, 3, 16); //湿
OLED_ShowChinese(22, 3, 4, 16); //度
OLED_ShowString (100,3,"%Rh",16); //%Rh
//显示温度值
if(sT>=100)
{
tmp = sT/10;
OLED_ShowString(52,0," ",16);
OLED_ShowNum(60,0,tmp,2,16);
OLED_ShowString(76,0,".",16);
tmp = sT%100;
OLED_ShowNum(84,0,tmp,1,16);
}
else
{
if(sT>=10)
{
tmp = sT/10;
OLED_ShowString(52,0," ",16);
OLED_ShowNum(68,0,tmp, 1,16);
OLED_ShowString(76,0,".",16);
tmp = sT%10;
OLED_ShowNum(84,0,tmp,1,16);
}
else
{
if(sT>=0)
{
tmp = sT*(-1);
OLED_ShowString(52,0," 0",16);
OLED_ShowString(76,0,".",16);
OLED_ShowNum(84,0,tmp,1,16);
}
else
{
if(sT>-10)
{
OLED_ShowString(60,0,"-",16);
tmp = 0;
OLED_ShowNum(68,0,tmp,1,16);
OLED_ShowString(76,0,".",16);
tmp = sT*(-1);
OLED_ShowNum(84,0,tmp,1,16);
}
else
{
if(sT>-100)
{
OLED_ShowString(60,0,"-",16);
tmp = sT/(-10);
OLED_ShowNum(68,0,tmp,1,16);
OLED_ShowString(76,0,".",16);
tmp = sT*(-1);
OLED_ShowNum(84,0,tmp,1,16);
}
else
{
OLED_ShowString(52,0,"-",16);
tmp = sT/(-10);
OLED_ShowNum(60,0,tmp,2,16);
OLED_ShowString(76,0,".",16);
tmp = sT%100*(-1);
OLED_ShowNum(84,0,tmp,1,16);
}
}
}
}
}
//显示湿度值
tmp = sRH/10;
OLED_ShowNum (60,3,tmp,2,16);
OLED_ShowString(76,3,".", 16);
tmp = sRH%100;
OLED_ShowNum (84,3,tmp,1,16);
}
void ShowClock(void)
{
Readclock();
// (列,行,数字,位数,大小)
OLED_ShowNum(20,7,20, 2, 8);
OLED_ShowNum(32,7,year,2, 8);
OLED_ShowString(44,7,"/", 8);
OLED_ShowNum(50,7,month,2,8);
OLED_ShowString(62,7,"/", 8);
OLED_ShowNum(68,7,date,2, 8);
OLED_ShowNum(90,7,hour,2, 8);
OLED_ShowString(102,7,":",8);
OLED_ShowNum(108,7,minute,2,8);
}
void main(void)
{
init_sys();
HSE_CLK_INIT();
I2C_Initial();
Init_DS1302();
OLED_Init(); //初始化OLED
OLED_ColorTurn(0); //0正常显示,1 反色显示
OLED_DisplayTurn(0); //0正常显示, 1 屏幕翻转显示
OLED_Clear();
SHT2x_SoftReset(); //温湿度传感器软复位
rim();
while(1)
{
SHT2x_MeasurePoll(TEMP,DATA);
_delay_ms(10);
sT = SHT2x_CalcTemperatureC(DATA[0]<<8|DATA[1]);
_delay_ms(500);
SHT2x_MeasurePoll(HUMI,DATA);
_delay_ms(10);
sRH = SHT2x_CalcRH(DATA[0]<<8|DATA[1]);
ShowTH(); //显示温湿度
ShowClock(); //显示日期时间
_delay_ms(500);
}
}
……………………
…………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有程序51hei提供下载:
温湿度计.7z
(721.68 KB, 下载次数: 39)
2020-12-24 15:42 上传
点击文件名下载附件
下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1