找回密码
 注册

QQ登录

只需一步,快速开始

搜索

stc89c5251单片机基于DHT11的温湿计程序设计,0.96寸OLED显示

[复制链接]
coolice 发表于 2021-7-11 23:55:53 | 显示全部楼层 |阅读模式
本作品采用STC89C52RC单片机最小系统和0.96寸OLED显示屏(IIC)设计,基于DHT11的温湿计(单总线)。实测通过,完美运行。
1.jpg

部分源码:完整源码见文尾附件
  1. void main()
  2. {        
  3.     DHT11_delay_ms(4500);
  4.         OLED_init();//初始化OLED(内存地址模式默认使用水平地址模式,可在初始化程序中更改)
  5.         
  6.         while(1)
  7.         {
  8.                 //打印BMP图片(图片数组,选择图片的取模方式(水平取模:0x00或垂直取模:0x01),是否反色(填0或1))
  9.                 OLED_print_BMP(BMP0,0x00,0);
  10.                 Delay1000ms();
  11.                 OLED_clear();//清屏
  12.                 DHT11_receive();
  13.                 OLED_print_text(0,0,"湿",0);
  14.                 OLED_print_text(0,2,"度",0);
  15.                 OLED_print_text(0,6,"温",0);
  16.                 OLED_print_text(0,8,"度",0);
  17.                 //OLED_print_text(1,0,rec_dat,0);
  18.                   OLED_print_char(1,0,rec_dat[0],0);
  19.                   OLED_print_char(1,1,rec_dat[1],0);
  20.                   OLED_print_char(1,2,rec_dat[2],0);
  21.                   OLED_print_char(1,3,rec_dat[3],0);
  22.                   OLED_print_char(1,4,rec_dat[4],0);
  23.                   OLED_print_char(1,5,rec_dat[5],0);
  24.                   OLED_print_char(1,6,rec_dat[6],0);
  25.                   OLED_print_char(1,7,rec_dat[7],0);
  26.                   OLED_print_char(1,8,rec_dat[8],0);
  27.                  
  28.                 Delay1000ms();
  29.                 OLED_clear();//清屏
  30.                
  31.         }
  32. }

  33. OLED.C

  34. #include <intrins.h>
  35. #include "public.h"
  36. #include "OLED.h"
  37. #include "ASCII.h"
  38. #include "text.h"
  39. #include "port.h"

  40. //使用位操作加快IIC读写速度
  41. u8 bdata Byte_data;
  42. sbit Byte_data7=Byte_data^7;
  43. sbit Byte_data6=Byte_data^6;
  44. sbit Byte_data5=Byte_data^5;
  45. sbit Byte_data4=Byte_data^4;
  46. sbit Byte_data3=Byte_data^3;
  47. sbit Byte_data2=Byte_data^2;
  48. sbit Byte_data1=Byte_data^1;
  49. sbit Byte_data0=Byte_data^0;


  50. void OLED_delay500ms()//12.000MHz
  51. {
  52.         u8 i,j,k;

  53.         i=23;
  54.         j=205;
  55.         k=120;
  56.         do
  57.         {
  58.                 do
  59.                 {
  60.                         while (--k);
  61.                 }while (--j);
  62.         }while (--i);
  63. }


  64. //IIC通信开始
  65. void IIC_start()
  66. {
  67.         OLED_CLK=1;
  68.         OLED_SDA=1;
  69.         OLED_SDA=0;
  70.         OLED_CLK=0;
  71. }

  72. //IIC通信停止
  73. void IIC_stop()
  74. {
  75.         OLED_CLK=1;
  76.         OLED_SDA=0;
  77.         OLED_SDA=1;
  78. }

  79. //IIC写入一个字节(字节)
  80. void IIC_write_Byte(u8 Byte)
  81. {
  82.         OLED_CLK=0;
  83.         Byte_data=Byte;
  84.         
  85.         OLED_SDA=Byte_data7;OLED_CLK=1;OLED_CLK=0;
  86.         OLED_SDA=Byte_data6;OLED_CLK=1;OLED_CLK=0;
  87.         OLED_SDA=Byte_data5;OLED_CLK=1;OLED_CLK=0;
  88.         OLED_SDA=Byte_data4;OLED_CLK=1;OLED_CLK=0;
  89.         OLED_SDA=Byte_data3;OLED_CLK=1;OLED_CLK=0;
  90.         OLED_SDA=Byte_data2;OLED_CLK=1;OLED_CLK=0;
  91.         OLED_SDA=Byte_data1;OLED_CLK=1;OLED_CLK=0;
  92.         OLED_SDA=Byte_data0;OLED_CLK=1;OLED_CLK=0;

  93.         OLED_CLK=1;//IIC应答
  94.         OLED_CLK=0;
  95. }

  96. //MCU向OLED写入一个字节(字节数据,选择字节为命令还是数据)
  97. void MCU_write_OLED_Byte(u8 Byte,u8 command_or_data)
  98. {
  99.         IIC_start();//IIC通信开始
  100.         IIC_write_Byte(0x78);//从机地址
  101.         IIC_write_Byte(command_or_data);
  102.         IIC_write_Byte(Byte);
  103.         IIC_stop();//IIC通信停止
  104. }

  105. //光标的位置,0到7行,0到127列(行,列)
  106. void OLED_cursor_location(u8 row,u8 column)
  107. {
  108.         MCU_write_OLED_Byte(0xB0+row,OLED_COMMAND);//设置行(0~7)
  109.         MCU_write_OLED_Byte(0x10|(column&0xF0)>>4,OLED_COMMAND);//设置显示位置大列(0~7)
  110.         MCU_write_OLED_Byte(0x00|(column&0x0F),OLED_COMMAND);//设置显示位置小列(0~7)
  111. }

  112. //设置内存地址模式(使用水平地址模式:0x00或垂直地址模式:0x01)
  113. void OLED_set_memory_address_mode(u8 mode)
  114. {
  115.         MCU_write_OLED_Byte(0x20,OLED_COMMAND);//设置内存地址模式(使用水平地址模式或垂直地址模式)
  116.         MCU_write_OLED_Byte(mode,OLED_COMMAND);//水平地址模式:0x00,垂直地址模式:0x01,页地址模式:0x02
  117.         MCU_write_OLED_Byte(0x21,OLED_COMMAND);//设置显示位置列初始地址和终止地址
  118.         MCU_write_OLED_Byte(0x00,OLED_COMMAND);//列初始地址
  119.         MCU_write_OLED_Byte(0x7F,OLED_COMMAND);//列终止地址
  120.         MCU_write_OLED_Byte(0x22,OLED_COMMAND);//设置显示位置页初始地址和终止地址
  121.         MCU_write_OLED_Byte(0x00,OLED_COMMAND);//页初始地址
  122.         MCU_write_OLED_Byte(0x07,OLED_COMMAND);//页终止地址
  123. }
复制代码
完整源码: OHT11 OLED(iic).zip (74.83 KB, 售价: 2 E币)
小垃圾 发表于 2021-9-1 09:14:45 | 显示全部楼层
电脑显示 cant open file OLED.h 那些怎么办
 楼主| coolice 发表于 2021-9-1 13:57:19 | 显示全部楼层
小垃圾 发表于 2021-9-1 09:14
电脑显示 cant open file OLED.h 那些怎么办

能打开的,文件都有,如果提示打不开,可以用add existing files to ****添加进项目里,有时候不同电脑的存储位置不一样项目找不到文件了可能会提示这个问题,打不开啥文件就重新添加到项目里就可以了

3.jpg 2.jpg 1.jpg

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|手机版|小黑屋|ELEOK |网站地图

GMT+8, 2024-12-31 01:36

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表