STC15 + DS1302 +DHT11+DS18B20+I2C OLED时钟
Posted perseverance52
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STC15 + DS1302 +DHT11+DS18B20+I2C OLED时钟相关的知识,希望对你有一定的参考价值。
STC15 + DS1302 +DHT11+DS18B20+I2C OLED时钟
- 📺效果展示:
- 本案例基于
STC15F2K60S2
型号单片机,晶振采用的是内部22.1184
Mhz
🛠接线说明
- OLED I2C接口: SDA:P0^1,SCL=P0^0;
- DS1302 I2C接口:SCL=P0^3; SDA=P0^2;
- DHT11数据引脚:P0^4
- DS18b20数据引脚:P0^5
✨以上均采用3.3V供电。
⛳屏幕说明
- 本案例采用的是1.3寸SH1106 OLED屏幕,如果改成0.96寸ssd1306 OLED屏幕,需做如下修改:
oled12864.h
头文件
#define X_WIDTH 132 //如果使用0.96 ssd1306:改为128;1.3 sh1106:132
oled12864.c
头文件
/*********************OLED初始化************************************/
void OLED_Init(void)
Delayus(500);//初始化之前的延时很重要!
OLED_WrCmd(0xae);//--turn off oled panel
OLED_WrCmd(0x02);//---set low column address如果使用0.96 ssd1306:改为0x00;1.3 sh1106:0x02
- 🌴工程架构
📋时间设置说明
- 在第一次烧录时,在
ds1302.c
文件中,找到DS1302_Time[]=23,02,07,13,27,30,2;//设置时间
将当前时间配置到数组当中,并在main.c主函数中启用SetRTC();
函数,编译烧录一次,然后,注释掉设置时间的函数,在编译烧录一遍才行。
📝主程序代码
#include "delay.h"
#include "oled12864.h"
#include "ds18b20.h"
#include "DHT11.h"
#include "ds1302.h"
sbit led1 = P0 ^ 6;
sbit led2 = P0 ^ 7;
uint8 a, wendu;
uint16 b, c;
bit rtc_flag = 0;
unsigned char dspbuf[14] ; //显示缓冲区
void riqi(void);
void shijian(void);
/*********************定时器函数************************************/
void Timer0Init() //2毫秒@22.1184MHz
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x33; //设置定时初始值
TH0 = 0x53; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
void Timer1Init() //2MS@22.1184MHz
AUXR |= 0x40; //定时器时钟1T模式
TMOD &= 0x0F; //设置定时器模式
TL1 = 0x33; //设置定时初始值
TH1 = 0x53; //设置定时初始值
TF1 = 0; //清除TF1标志
TR1 = 1; //定时器1开始计时
void timer0() interrupt 1
TL0 = 0x33; //设置定时初始值
TH0 = 0x53; //设置定时初始值
TF0 = 0;
b++;
if (b > 500)
b = 0;
led1 = ~led1;
led2 = ~led2;
void timer1() interrupt 3 //定时器1的中断
TL1 = 0x9A; //设置定时初始值
TH1 = 0xA9; //设置定时初始值
c++;
if (c > 500)
c = 0;
rtc_flag = 1;
void main()
unsigned char *p_rtc;
Timer0Init();//初始化定时器0
Timer1Init();//初始化定时器1
EA = 1; //开启总中断
ET0 = 1; //开启定时器0中断
ET1 = 1; //开启定时器1中断
Delayus(6000);
P0M0 = 0X00;
P0M1 = 0X00;
P1M0 = 0X00;
P1M1 = 0X00;
P2M0 = 0X00;
P2M1 = 0X00;
P3M0 = 0X00;
P3M1 = 0X00;
P4M0 = 0X00;
P4M1 = 0X00;
P5M0 = 0X00;
P5M1 = 0X00;
P6M0 = 0X00;
P6M1 = 0X00;
OLED_Init();
OLED_Fill(0xff);
delayms(200);
OLED_Fill(0x00);
delayms(200);
OLED_CLS();
// SetRTC();//第一次烧录时需要启用设置时间到DS1302中
while (1)
if (rtc_flag)
rtc_flag = 0;
p_rtc = ReadRTC();
dspbuf[0] = p_rtc[0];
dspbuf[1] = p_rtc[1];
dspbuf[2] = p_rtc[2];
dspbuf[3] = p_rtc[3];
dspbuf[4] = p_rtc[4];
dspbuf[5] = p_rtc[5];
dspbuf[6] = p_rtc[6];
dspbuf[7] = p_rtc[7];
dspbuf[8] = p_rtc[8];
dspbuf[9] = p_rtc[9];
dspbuf[10] = p_rtc[10];
dspbuf[11] = p_rtc[11];
dspbuf[12] = p_rtc[12];
dspbuf[13] = p_rtc[13];
temget();
wendu = temget();
DHT11_receive();
shijian();
riqi();
void riqi(void)
OLED_P8x16Ch(0, 0, dspbuf[12]);//年
OLED_P8x16Ch(8, 0, dspbuf[13]);
OLED_P8x16Ch(16, 0, 13);
OLED_P8x16Ch(24, 0, dspbuf[8]);//月
OLED_P8x16Ch(32, 0, dspbuf[9]);
OLED_P8x16Ch(40, 0, 13);
OLED_P8x16Ch(48, 0, dspbuf[6]);//日
OLED_P8x16Ch(56, 0, dspbuf[7]);
OLED_P8x16Ch(80, 0, 12);
OLED_P8x16Ch(88, 0, wendu % 100 / 10);
OLED_P8x16Ch(96, 0, wendu % 10);
OLED_P8x16Ch(104, 0, 11);
OLED_P8x16Ch(112, 0, RH / 10);
OLED_P8x16Ch(120, 0, RH % 10);
void shijian(void)
OLED_P16x32Ch(0, 2, dspbuf[0]);//时
OLED_P16x32Ch(16, 2, dspbuf[1]);
OLED_P16x32Ch(32, 2, 10);
OLED_P16x32Ch(48, 2, dspbuf[2]);//分
OLED_P16x32Ch(64, 2, dspbuf[3]);
OLED_P16x32Ch(80, 2, 10);
OLED_P16x32Ch(96, 2, dspbuf[4]);//秒
OLED_P16x32Ch(112, 2, dspbuf[5]);
OLED_P16x16Ch(32, 6, 24);//星期
OLED_P16x16Ch(48, 6, 25);
if (dspbuf[11] == 0)OLED_P16x16Ch(64, 6, 26);
else OLED_P16x16Ch(64, 6, dspbuf[11]);
📚程序源码
复制这段内容后打开百度网盘手机App,操作更方便哦
链接: https://pan.baidu.com/s/1jRfIYepwktORAw6mGK2sMA
提取码: x2fa
以上是关于STC15 + DS1302 +DHT11+DS18B20+I2C OLED时钟的主要内容,如果未能解决你的问题,请参考以下文章
STC15W408AS读取DHT11温湿度+OLED显示+数据串口打印
STC15单片机+DHT11+LCD1602+PCF8574转IIC接口温度显示
STC15W408AS+LCD1602+PCF8574转IIC接口+DHT11数据显示
STC15W408AS读取DHT11温湿度+OLED显示+数据串口打印修订版