本設計采用的是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
|