找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 10301|回复: 16
收起左侧

51单片机OLED+dht11显示温度的源程序

  [复制链接]
ID:195329 发表于 2018-4-6 02:01 | 显示全部楼层 |阅读模式
入门51单片机一个多月,参加一个比赛熬夜写出了OLED+DHT11程序。

单片机源程序如下:
  1. #include "REG51.h"
  2. #include "oled.h"
  3. #include<intrins.h>
  4. typedef unsigned char BYTE;
  5. typedef unsigned int WORD;
  6. #define uint unsigned int
  7. #define uchar unsigned char
  8. sbit io=P1^2;//dht11data端接单片机的P1^0口//
  9. sbit IN1 = P1^0;                        
  10. sbit IN2 = P1^1;  //输入电机接口
  11. sbit K1  = P3^0;
  12. sbit K2  = P3^1;          //按键接口
  13. uchar data_byte;

  14. uchar RH,RL,TH,TL;

  15. int count1,a;
  16. void DelayUs2x(unsigned char t)

  17. {

  18.         while(--t);

  19. }

  20. void DelayMs(unsigned char t)

  21. {

  22.         while(t--)

  23.         {

  24. //大致延时1mS

  25.         DelayUs2x(245);

  26.         DelayUs2x(245);

  27.         }

  28. }

  29. void delay(uchar ms) //延时模块//
  30. {

  31.   uchar i;

  32.   while(ms--)                 

  33. for(i=0;i<100;i++);

  34. }

  35. void delay1()//一个for循环大概需要8个多机器周期一个机器周期为1us晶振为12MHz也就是说本函数延时8us多此延时函数必须德稍微精确一点

  36. {

  37.   uchar i;

  38.   for(i=0;i<1;i++);

  39. }

  40. //电机的程序
  41. void ZHUAN(){
  42.        
  43.           IN2=0;
  44.    }


  45. void speed(int cnt,int sd)
  46. {  
  47. if(cnt<sd)  
  48.         {
  49.         IN1=1;
  50.         }
  51. else  
  52.         {
  53.         IN1=0;
  54.         }

  55. }  
  56. void turn(int cnt,int sd)                                   
  57. {  
  58.     ZHUAN();          
  59.         speed(cnt,sd);
  60. }  



  61. void start()//开始信号

  62. {

  63.   io=1;

  64.   delay1();

  65.   io=0;

  66.   delay(25);// 主机把总线拉低必须大于18ms保证DHT11能检测到起始信号

  67.   io=1;    //发送开始信号结束后拉高电平延时20-40us

  68.   delay1();//以下三个延时函数差不多为24us符合要求

  69.   delay1();

  70.   delay1();

  71. }
  72. uchar receive_byte()//接收一个字节//

  73. {

  74.   uchar i,temp;

  75.   for(i=0;i<8;i++)//接收8bit的数据

  76.   {

  77.         while(!io);//等待50us的低电平开始信号结束

  78.         delay1();//开始信号结束之后延时26us-28us以下三个延时函数

  79.          delay1();

  80.         delay1();

  81.         temp=0;//时间为26us-28us表示接收的为数据'0'

  82.         if(io==1)

  83.          temp=1; //如果26us-28us之后还为高电平则表示接收的数据为'1'

  84.     while(io);//等待数据信号高电平'0'为26us-28us'1'为70us

  85.         data_byte<<=1;//接收的数据为高位在前右移

  86.          data_byte|=temp;

  87.   }

  88.   return data_byte;

  89. }
  90. void receive()//接收数据//
  91. {

  92.   uchar T_H,T_L,R_H,R_L,check,num_check,i;

  93.   start();//开始信号//

  94.   io=1;   //主机设为输入判断从机DHT11响应信号

  95.   if(!io)//判断从机是否有低电平响应信号//

  96.   {  
  97.         while(!io);//判断从机发出 80us 的低电平响应信号是否结束//

  98.         while(io);//判断从机发出 80us 的高电平是否结束如结束则主机进入数据接收状态

  99.         R_H=receive_byte();//湿度高位

  100.         R_L=receive_byte();//湿度低位

  101.         T_H=receive_byte();//温度高位

  102.         T_L=receive_byte();//温度低位

  103.         check=receive_byte();//校验位

  104.         io=0; //当最后一bit数据接完毕后从机拉低电平50us//

  105.         for(i=0;i<7;i++)//差不多50us的延时

  106.         delay1();

  107.         io=1;//总线由上拉电阻拉高进入空闲状态

  108.         num_check=R_H+R_L+T_H+T_L;

  109.         if(num_check==check)//判断读到的四个数据之和是否与校验位相同

  110.         {

  111.    RH=R_H;

  112.    RL=R_L;

  113.    TH=T_H;

  114.    TL=T_L;

  115.    check=num_check;
  116.         }
  117.   }
  118. }

  119. int main(void)
  120. {       
  121.         TMOD=0x01;
  122.         EA=1;  
  123.         TH0=(65536-1000)/256;
  124.         TL0=(65536-1000)%256;
  125.         ET0=1;
  126.         TR0=1;
  127.        
  128.         a = 100;
  129.                 OLED_Init();                        //初始化OLED  
  130.                 OLED_Clear() ;
  131.                 OLED_ShowCHinese(36,0,0);
  132.                 OLED_ShowCHinese(54,0,1);
  133.                 OLED_ShowCHinese(72,0,2);
  134.                 OLED_ShowCHinese(0,2,3);
  135.                 OLED_ShowCHinese(18,2,5);
  136.                 OLED_ShowCHinese(0,4,4);
  137.                 OLED_ShowCHinese(18,4,5);
  138.                 OLED_ShowString(37,4,":",16);
  139.                   OLED_ShowString(37,2,":",16);
  140.         while(1)
  141.         {
  142.             turn(count1,a);

  143.                 if(K1==0)

  144.                 {

  145.                         DelayMs(100);

  146.                         if(K1==0)// 去抖动

  147.                         {
  148.                            if(a>=0)
  149.                            a=a-10;
  150.                         }

  151.                         }
  152.                 if(K2==0)

  153. ……………………

  154. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
OLED_DHT11.zip (97.73 KB, 下载次数: 459)

评分

参与人数 2黑币 +55 收起 理由
zkele + 5 赞一个!
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:372098 发表于 2018-7-15 18:25 | 显示全部楼层
写的很好,大赞一个[em04][em04][em04][em04]
回复

使用道具 举报

ID:104846 发表于 2018-7-24 15:19 | 显示全部楼层
赞一个
回复

使用道具 举报

ID:380115 发表于 2018-7-28 10:48 | 显示全部楼层
正在尝试做gy-30数字光传感器用oled显示,有一定参考价值
回复

使用道具 举报

ID:412987 发表于 2018-11-24 22:48 | 显示全部楼层
为何我重新编译以后,下载到单片机就不能用了
回复

使用道具 举报

ID:517217 发表于 2019-4-20 16:46 | 显示全部楼层
刚好用到,谢谢楼主分享
回复

使用道具 举报

ID:575725 发表于 2019-7-1 15:44 | 显示全部楼层
最近正在看这些东西,感谢分享。
回复

使用道具 举报

ID:490458 发表于 2019-7-1 19:28 | 显示全部楼层
学习一下
回复

使用道具 举报

ID:620057 发表于 2019-10-7 13:50 | 显示全部楼层
感谢楼主的分享,找的我焦头烂额
回复

使用道具 举报

ID:692618 发表于 2020-2-13 00:17 | 显示全部楼层
是有字符串和数字都有吗
回复

使用道具 举报

ID:258216 发表于 2020-2-21 14:48 | 显示全部楼层
为何编译后下载到单片机就不能用了
回复

使用道具 举报

ID:704775 发表于 2020-4-20 10:31 | 显示全部楼层
这个电机入口,和led管脚不是重复了吗
回复

使用道具 举报

ID:423286 发表于 2020-5-13 22:41 | 显示全部楼层
谢谢带哥分享。
回复

使用道具 举报

ID:760870 发表于 2020-5-26 12:54 | 显示全部楼层
请问能麻烦楼主发一下io接口吗,我做不了
回复

使用道具 举报

ID:841232 发表于 2020-11-10 20:15 | 显示全部楼层
正好在学习这一块,感谢分享
回复

使用道具 举报

ID:166284 发表于 2020-11-12 17:01 | 显示全部楼层
网页上怎么没有原理图呢?  
回复

使用道具 举报

ID:834280 发表于 2020-11-16 14:04 | 显示全部楼层
HAO 给你点赞
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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