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.1184Mhz

🛠接线说明

  • 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显示+数据串口打印修订版

STC15W408AS读取DHT11温湿度+数据串口打印详解

温湿度dht11元器件可以直接接在stc15单片机上用吗,需不需要做成模块?