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

[复制链接]
查看8 | 回复0 | 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 工控币)
回复

使用道具 举报

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

本版积分规则