找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2395|回复: 8
收起左侧

单片机18b20程序,我想改成用dht11.萌新求助

[复制链接]
ID:267512 发表于 2018-1-2 15:46 | 显示全部楼层 |阅读模式
这是用51做的万年历,可以显示温度,时间,日期,用的传感器是18b20,我想改成用dht11,可是程序该怎么改啊
  1. #include <reg52.h>          //调用单片机头文件
  2. #define uchar unsigned char  //无符号字符型 宏定义 变量范围0~255
  3. #define uint  unsigned int  //无符号整型 宏定义 变量范围0~65535
  4. #include "eeprom52.h"
  5. #include "nongli.h"
  6. bit flag_200ms ;
  7. bit flag_100ms ;
  8. sbit beep = P3^7;   //蜂鸣器定义
  9. bit flag_beep_en;
  10. uint clock_value;     //用作闹钟用的
  11. sbit dq   = P3^1;   //18b20 IO口的定义

  12. uint temperature ;    //温度变量
  13. uchar flag_nl;        //农历 阳历显示标志位

  14. uchar menu_1,menu_2;
  15. uchar key_time,flag_value;      //用做连加的中间变量
  16. bit key_500ms  ;
  17. uchar n_nian,n_yue,n_ri;  //农历显示的函数

  18. #include "ds1302.h"
  19. #include "lcd1602.h"

  20. /******************把数据保存到单片机内部eeprom中******************/
  21. void write_eeprom()
  22. {
  23. SectorErase(0x2000);
  24. byte_write(0x2000, fen1);
  25. byte_write(0x2001, shi1);
  26. byte_write(0x2002, open1);
  27. byte_write(0x2058, a_a);
  28. }
  29. /******************把数据从单片机内部eeprom中读出来*****************/
  30. void read_eeprom()
  31. {
  32. fen1  = byte_read(0x2000);
  33. shi1  = byte_read(0x2001);
  34. open1  = byte_read(0x2002);
  35. a_a      = byte_read(0x2058);
  36. }
  37. /**************开机自检eeprom初始化*****************/
  38. void init_eeprom()
  39. {
  40. read_eeprom();  //先读
  41. if(a_a != 1)  //新的单片机初始单片机内问eeprom
  42. {
  43.   fen1  = 3;
  44.   shi1  = 8;
  45.   open1  = 1;
  46.   a_a = 1;
  47.   write_eeprom();    //保存数据
  48. }
  49. }
  50. /***********************18b20初始化函数*****************************/
  51. void init_18b20()
  52. {
  53. bit q;
  54. dq = 1;    //把总线拿高
  55. delay_uint(1);     //15us
  56. dq = 0;    //给复位脉冲
  57. delay_uint(80);  //750us
  58. dq = 1;    //把总线拿高 等待
  59. delay_uint(10);  //110us
  60. q = dq;    //读取18b20初始化信号
  61. delay_uint(20);  //200us
  62. dq = 1;    //把总线拿高 释放总线
  63. }
  64. /*************写18b20内的数据***************/
  65. void write_18b20(uchar dat)
  66. {
  67. uchar i;
  68. for(i=0;i<8;i++)
  69. {      //写数据是低位开始
  70.   dq = 0;    //把总线拿低写时间隙开始
  71.   dq = dat & 0x01; //向18b20总线写数据了
  72.   delay_uint(5);  // 60us
  73.   dq = 1;    //释放总线
  74.   dat >>= 1;
  75. }
  76. }
  77. /*************读取18b20内的数据***************/
  78. uchar read_18b20()
  79. {
  80. uchar i,value;
  81. for(i=0;i<8;i++)
  82. {
  83.   dq = 0;    //把总线拿低读时间隙开始
  84.   value >>= 1;  //读数据是低位开始
  85.   dq = 1;    //释放总线
  86.   if(dq == 1)   //开始读写数据
  87.    value |= 0x80;
  88.   delay_uint(5);  //60us 读一个时间隙最少要保持60us的时间
  89. }
  90. return value;   //返回数据
  91. }
  92. /*************读取温度的值 读出来的是小数***************/
  93. uint read_temp()
  94. {
  95. uint value;
  96. uchar low;      //在读取温度的时候如果中断的太频繁了,就应该把中断给关了,否则会影响到18b20的时序
  97. init_18b20();     //初始化18b20
  98. write_18b20(0xcc);    //跳过64位ROM
  99. write_18b20(0x44);    //启动一次温度转换命令
  100. delay_uint(50);     //500us
  101. init_18b20();     //初始化18b20

  102. write_18b20(0xcc);    //跳过64位ROM
  103. write_18b20(0xbe);    //发出读取暂存器命令

  104. EA = 0;
  105. low = read_18b20();    //读温度低字节
  106. value = read_18b20();  //读温度高字节
  107. EA = 1;
  108. value <<= 8;     //把温度的高位左移8位
  109. value |= low;     //把读出的温度低位放到value的低八位中
  110. value *= 0.625;        //转换到温度值 小数
  111. return value;     //返回读出的温度 带小数
  112. }

  113. /******************1ms 延时函数*******************/
  114. void delay_1ms(uint q)
  115. {
  116. uint i,j;
  117. for(i=0;i<q;i++)
  118.   for(j=0;j<120;j++);
  119. }
  120. /******************写星期函数*******************/
  121. void write_week(uchar hang,uchar add,uchar week)//写星期函数
  122. {
  123. if(hang==1)   
  124.   write_com(0x80+add);
  125. else
  126.   write_com(0x80+0x40+add);   
  127. switch(week)
  128. {
  129.   case 1:write_data('M');//星期数为1时,显示
  130.       write_data('O');
  131.       write_data('N');
  132.       break;
  133.    
  134.   case 2:write_data('T');//星期数据为2时显示
  135.       write_data('U');
  136.       write_data('E');
  137.       break;
  138.   
  139.   case 3:write_data('W');//星期数据为3时显示
  140.       write_data('E');
  141.       write_data('D');
  142.       break;
  143.   
  144.   case 4:write_data('T');//星期数据为4是显示
  145.       write_data('H');
  146.       write_data('U');
  147.       break;
  148.   
  149.   case 5:write_data('F');//星期数据为5时显示
  150.       write_data('R');
  151.       write_data('I');
  152.       break;
  153.   
  154.   case 6:write_data('S');//星期数据为6时显示
  155.       write_data('T');
  156.       write_data('A');
  157.       break;
  158.   
  159.   case 0:write_data('S');//星期数据为7时显示
  160.       write_data('U');
  161.       write_data('N');
  162.       break;
  163. }
  164. }
  165. /*************时钟显示***************/
  166. void init_1602_ds1302()
  167. {
  168. write_sfm2_ds1302(1,1,shi);     //显示时
  169. write_sfm2_ds1302(1,4,fen);     //显示分
  170. write_sfm2_ds1302(1,7,miao);    //显示秒
  171. write_week(2,12,week);
  172. // write_sfm1(1,14,week);      //显示星期
  173. write_sfm3_18B20(1,11,temperature);    //显示温度
  174. if(flag_nl == 0)  //显示阳历
  175. {
  176.   write_sfm2_ds1302(2,2,nian);   //显示年
  177.   write_sfm2_ds1302(2,5,yue);    //显示月
  178.   write_sfm2_ds1302(2,8,ri);    //显示日  
  179. }
  180. else     //显示农历
  181. {
  182.   write_sfm2_ds1302(2,2,n_nian); //显示年
  183.   write_sfm2_ds1302(2,5,n_yue); //显示月
  184.   write_sfm2_ds1302(2,8,n_ri); //显示日
  185.   
  186. }


  187.   
  188. }            
  189. /*************定时器0初始化程序***************/
  190. void init_time0()   
  191. {
  192. EA   = 1;     //开总中断
  193. TMOD = 0X01;   //定时器0、工作方式1
  194. ET0  = 1;    //开定时器0中断
  195. TR0  = 1;    //允许定时器0定时
  196. }
  197. /*************闹钟报警函数***************/
  198. void menu_dis()
  199. {
  200. static uchar mm,value;
  201. if(flag_100ms == 1)    //100ms执行一次
  202. {
  203.   flag_100ms = 0;
  204.   if(open1 == 1) //如果闹钟打开
  205.   {
  206.    if((miao == 0) && (fen == fen1) && (shi == shi1))
  207.    {  
  208.     flag_beep_en = 1; //有报警 打开蜂鸣器响的标志位   
  209.    }  
  210.    if(flag_beep_en == 1) //闹钟以被打开
  211.    {
  212.     clock_value++;
  213.     if(clock_value <= 30)  
  214.      beep = ~beep;    //蜂鸣器叫3秒
  215.     else if(clock_value > 30)
  216.     {
  217.      beep = 1;      //蜂鸣器停1秒
  218.      if(clock_value > 40)
  219.      {
  220.       clock_value = 0;
  221.      }
  222.     }
  223.     //  1 分钟后自动关闭闹钟
  224.     value ++;
  225.     if(value >= 10)
  226.     {
  227.      value = 0;
  228.      mm++;
  229.      if(mm >= 60)
  230.      {
  231.       mm = 0;
  232.       flag_beep_en = 0;
  233.       beep = 1;
  234.      }
  235.     }     
  236.    }
  237.   }
  238. }
  239. }

  240. /********************独立按键程序*****************/
  241. uchar key_can;  //按键值
  242. void key()  //独立按键程序
  243. {
  244. static uchar key_new;
  245. key_can = 20;                   //按键值还原
  246. P3 |= 0x78;                     //对应的按键IO口输出为1
  247. if((P3 & 0x78) != 0x78)  //按键按下
  248. {
  249.   delay_1ms(1);       //按键消抖动
  250.   if(((P3 & 0x78) != 0x78) && (key_new == 1))
  251.   {      //确认是按键按下
  252.    key_new = 0;
  253.    switch(P3 & 0x78)
  254.    {
  255.     case 0x70:  key_can = 4;  break;  //得到按键值
  256.     case 0x68:  key_can = 3;  break;  //得到按键值
  257.     case 0x58:  key_can = 2;  break;  //得到按键值
  258.     case 0x38:  key_can = 1;  break;  //得到按键值
  259.    }
  260. //   write_sfm2(1,0,key_can);     //显示按键值
  261.   }   
  262. }
  263. else
  264.   key_new = 1;
  265. }

  266. /**********************设置函数************************/
  267. void key_with()
  268. {
  269. if(key_can == 1) //设置键
  270. {
  271.   menu_1++;
  272.   if(menu_1 == 1)   //设置时间
  273.   {
  274.    menu_2 = 1;
  275.    write_string(1,0,"    :  :    W:  ");   
  276.    write_string(2,0," 20  -  -       ");
  277.   }
  278.   if(menu_1 == 2)   //设置闹钟
  279.   {
  280.    menu_2 = 1;
  281.    write_string(1,0,"   set clock    ");   
  282.    write_string(2,0,"    Y  00:00      ");
  283.   }
  284.   if(menu_1 > 2)    //回到正常显示
  285.   {
  286.    menu_1 = 0;
  287.    write_guanbiao(1,2,0);  //关闭光标
  288.    init_1602_dis_csf();      //初始化液晶显示  
  289.   }
  290. }
  291. if(key_can == 2) //选择键
  292. {
  293.   flag_200ms = 1;
  294.   if(menu_1 == 1)    //设置时间
  295.   {
  296.    menu_2 ++;
  297.    if(menu_2 > 7)
  298.     menu_2 = 1;
  299.   }
  300.   if(menu_1 == 2)   //设置闹钟
  301.   {
  302.    menu_2 ++;
  303.    if(menu_2 > 3)
  304.     menu_2 = 1;   
  305.   }
  306. }
  307. if(menu_1 == 1)
  308. {
  309.   if(menu_2 == 1)    //设置时
  310.   {
  311.    if(key_can == 3) //加
  312.    {
  313.     shi+=0x01;
  314.     if((shi & 0x0f) >= 0x0a)
  315.      shi = (shi & 0xf0) + 0x10;
  316.     if(shi >= 0x24)
  317.      shi = 0;
  318.    }  
  319.    if(key_can == 4) //减
  320.    {
  321.     if(shi == 0x00)
  322.      shi = 0x24;
  323.     if((shi & 0x0f) == 0x00)
  324.      shi = (shi | 0x0a) - 0x10;
  325.     shi -- ;
  326.    }      
  327.   }
  328.   if(menu_2 == 2)    //设置分
  329.   {
  330.    if(key_can == 3) //加
  331.    {
  332.     fen+=0x01;
  333.     if((fen & 0x0f) >= 0x0a)
  334.      fen = (fen & 0xf0) + 0x10;
  335.     if(fen >= 0x60)
  336.      fen = 0;
  337.    }  
  338.    if(key_can == 4) //减   
  339.    {
  340.     if(fen == 0x00)
  341.      fen = 0x5a;
  342.     if((fen & 0x0f) == 0x00)
  343.      fen = (fen | 0x0a) - 0x10;
  344.     fen -- ;
  345.    }
  346.   }
  347.   if(menu_2 == 3)    //设置秒
  348.   {
  349.    if(key_can == 3) //加
  350.    {
  351.     miao+=0x01;
  352.     if((miao & 0x0f) >= 0x0a)
  353.      miao = (miao & 0xf0) + 0x10;
  354.     if(miao >= 0x60)
  355.      miao = 0;
  356.    }
  357.    if(key_can == 4) //减   
  358.    {
  359.     if(miao == 0x00)
  360.      miao = 0x5a;
  361.     if((miao & 0x0f) == 0x00)
  362.      miao = (miao | 0x0a) - 0x10;
  363.     miao -- ;   
  364.    }
  365.   }
  366.   if(menu_2 == 4)    //设置星期
  367.   {
  368.    if(key_can == 3) //加
  369.    {
  370.        week+=0x01;
  371.     if((week & 0x0f) >= 0x0a)
  372.      week = (week & 0xf0) + 0x10;
  373.     if(week >= 0x08)
  374.      week = 1;
  375.    }  
  376.    if(key_can == 4) //减   
  377.    {
  378.     if(week == 0x01)
  379.      week = 0x08;
  380.     if((week & 0x0f) == 0x00)
  381.      week = (week | 0x0a) - 0x10;
  382.     week -- ;
  383.    }
  384.   }
  385.   if(menu_2 == 5)    //设置年
  386.   {
  387.    if(key_can == 3) //加
  388.    {
  389.        nian+=0x01;
  390.     if((nian & 0x0f) >= 0x0a)
  391.      nian = (nian & 0xf0) + 0x10;
  392.     if(nian >= 0x9a)
  393.      nian = 1;
  394.    }  
  395.    if(key_can == 4) //减   
  396.    {
  397.     if(nian == 0x01)
  398.      nian = 0x9a;
  399.     if((nian & 0x0f) == 0x00)
  400.      nian = (nian | 0x0a) - 0x10;
  401.     nian -- ;  
  402.    }
  403.   }
  404.   if(menu_2 == 6)    //设置月
  405.   {
  406.    if(key_can == 3) //加
  407.    {
  408.        yue+=0x01;
  409.     if((yue & 0x0f) >= 0x0a)
  410.      yue = (yue & 0xf0) + 0x10;
  411.     if(yue >= 0x13)
  412.      yue = 1;
  413.    }  
  414.    if(key_can == 4) //减   
  415.    {
  416.     if(yue == 0x01)
  417.      yue = 0x13;
  418.     if((yue & 0x0f) == 0x00)
  419.      yue = (yue | 0x0a) - 0x10;
  420.     yue -- ;     
  421.    }
  422.   }
  423.   if(menu_2 == 7)    //设置日
  424.   {
  425.    if(key_can == 3) //加
  426.    {
  427.       ri+=0x01;
  428.    if((ri & 0x0f) >= 0x0a)
  429.     ri = (ri & 0xf0) + 0x10;
  430.    if(ri >= 0x32)
  431.     ri = 0;   
  432.    }  
  433.    if(key_can == 4) //减   
  434.    {
  435.     if(ri == 0x01)
  436.      ri = 0x32;
  437.     if((ri & 0x0f) == 0x00)
  438.      ri = (ri | 0x0a) - 0x10;
  439.     ri -- ;   
  440.    }
  441.   }
  442.   write_sfm2_ds1302(1,2,shi);    //显示时
  443.   write_sfm2_ds1302(1,5,fen);    //显示分
  444.   write_sfm2_ds1302(1,8,miao);    //显示秒
  445.   write_sfm1(1,14,week);    //显示星期     
  446.   write_sfm2_ds1302(2,3,nian);    //显示年
  447.   write_sfm2_ds1302(2,6,yue);    //显示月
  448.   write_sfm2_ds1302(2,9,ri);    //显示日
  449.   switch(menu_2)    // 光标显示
  450.   {
  451.    case 1:  write_guanbiao(1,2,1);  break;
  452.    case 2:  write_guanbiao(1,5,1);  break;
  453.    case 3:  write_guanbiao(1,8,1);  break;
  454.    case 4:  write_guanbiao(1,14,1);  break;
  455.    case 5:  write_guanbiao(2,3,1);  break;
  456.    case 6:  write_guanbiao(2,6,1);  break;
  457.    case 7:  write_guanbiao(2,9,1);  break;
  458.   }
  459.   write_time();    //把时间写进去
  460. }
  461. /***************设置闹钟*********************/
  462. if(menu_1 == 2)
  463. {
  464.   if(menu_2 == 1)    //设置闹钟开关
  465.   {
  466.    if(key_can == 3)
  467.    {
  468.     open1 = 1;   //闹钟开
  469.    }  
  470.    if(key_can == 4)
  471.    {
  472.     open1 = 0;   //闹钟关
  473.    }      
  474.   }
  475.   if(menu_2 == 2)    //设置闹钟时
  476.   {
  477.    if(key_can == 3) //加
  478.    {
  479.        shi1+=0x01;
  480.     if((shi1 & 0x0f) >= 0x0a)
  481.      shi1 = (shi1 & 0xf0) + 0x10;
  482.     if(shi1 >= 0x24)
  483.      shi1 = 0;
  484.    }  
  485.    if(key_can == 4) //减   
  486.    {
  487.     if(shi1 == 0x00)
  488.      shi1 = 0x5a;
  489.     if((shi1 & 0x0f) == 0x00)
  490.      shi1 = (shi1 | 0x0a) - 0x10;
  491.     shi1 -- ;
  492.    }
  493.   }
  494.   if(menu_2 == 3)    //设置秒
  495.   {
  496.    if(key_can == 3) //加
  497.    {
  498.        fen1+=0x01;
  499.     if((fen1 & 0x0f) >= 0x0a)
  500.      fen1 = (fen1 & 0xf0) + 0x10;
  501.     if(fen1 >= 0x60)
  502.      fen1 = 0;
  503.    }
  504.    if(key_can == 4) //减   
  505.    {
  506.     if(fen1 == 0x00)
  507.      fen1 = 0x5a;
  508.     if((fen1 & 0x0f) == 0x00)
  509.      fen1 = (fen1 | 0x0a) - 0x10;
  510.     fen1 -- ;   
  511.    }
  512.   }
  513.   if(open1 == 1)
  514.    write_string(2,4,"Y");
  515.   else
  516.    write_string(2,4,"N");
  517.   write_sfm2_ds1302(2,7,shi1);    //显示闹钟时
  518.   write_sfm2_ds1302(2,10,fen1);    //显示闹钟分
  519.   switch(menu_2)    // 光标显示
  520.   {
  521.    case 1:  write_guanbiao(2,4,1);  break;
  522.    case 2:  write_guanbiao(2,7,1);  break;
  523.    case 3:  write_guanbiao(2,10,1);  break;
  524.   }
  525.   write_eeprom();     //保存闹钟时间
  526. }   
  527. }
  528. /*****************主函数********************/
  529. void main()
  530. {
  531. beep = 0;                  //开机叫一声   
  532. delay_1ms(150);
  533. P0 = P1 = P2 = P3 = 0xff;  //单片机IO口初始化为1
  534. init_time0();   //初始化定时器
  535. init_ds1302();   //ds1302初始化
  536. init_1602();   //lcd1602初始化
  537. init_1602_dis_csf(); //lcd1602初始化显示
  538. init_eeprom();       //开始初始化保存的数据
  539. temperature = read_temp(); //先读出温度的值
  540. delay_1ms(650);
  541. temperature = read_temp(); //先读出温度的值
  542. while(1)
  543. {
  544.   key();    //按键程序
  545.   if(key_can < 10)
  546.   {
  547.    if(flag_beep_en == 0)  //只有闹钟关了的时候才能进入设置
  548.     key_with();
  549.    else
  550.    {
  551.     flag_beep_en = 0;  //按下任意键可关闭闹钟
  552.     beep = 1;
  553.     clock_value = 0;
  554.     read_time();
  555.    }
  556.    if(menu_1 == 0)
  557.    {
  558.     if(key_can == 4)  //减键
  559.     {
  560.      flag_nl = ~flag_nl;    //切换农历和阳历的显示标志位
  561.      if(flag_nl == 0)
  562.       write_string(2,0,"2013");
  563.      else  
  564.       write_string(2,0,"N ");
  565.     }
  566.    }
  567.   }
  568.   
  569.   if(flag_200ms == 1)
  570.   {
  571.    flag_200ms = 0;
  572.    if(menu_1 == 0)
  573.    {
  574.     read_time();    //读时间
  575.     temperature = read_temp(); //先读出温度的值
  576.     init_1602_ds1302();   //显示时钟
  577.    }
  578.   }
  579.   menu_dis();    //闹钟报警函数
  580.   delay_1ms(1);
  581. }
  582. }
  583. /**************定时器0中断程序*****************/
  584. void time0() interrupt 1
  585. {   
  586. static uchar value;
  587. TH0 = 0X3C;
  588. TL0 = 0XB0;    //50ms
  589. value ++;   
  590. if((value % 2) == 0)  //100ms  
  591.   flag_100ms = 1;  
  592. if(value >= 6)    //200ms
  593. {
  594.   value = 0;
  595.   flag_200ms = 1;
  596. }
  597. }
复制代码

回复

使用道具 举报

ID:267512 发表于 2018-1-2 15:46 | 显示全部楼层
自己顶一下
回复

使用道具 举报

ID:215444 发表于 2018-1-2 16:41 | 显示全部楼层
把DS18B20的C和H改成DHT11的C和H,但是函数名不要改,形参,要根据自己程序改 比如把init_dht11();改成 init_ds1302();  大概就这个意思吧,就是披着羊皮(18b20)的狼(dht11);
回复

使用道具 举报

ID:123289 发表于 2018-1-2 19:37 | 显示全部楼层
1、读通18b20手册
2、读通dht11手册
回复

使用道具 举报

ID:270391 发表于 2018-1-2 20:29 | 显示全部楼层
不太懂
回复

使用道具 举报

ID:164602 发表于 2018-1-3 08:13 | 显示全部楼层
这里有个DHT11模块的程序,你看看。
#include <reg51.h>
#include <intrins.h>

sbit  P2_0  = P2^0 ;//温湿度传感器的数据接口

sbit SMG_q = P1^0;        //定义数码管阳级控制脚(千位)
sbit SMG_b = P1^1;        //定义数码管阳级控制脚(百位)
sbit SMG_s = P1^2;        //定义数码管阳级控制脚(十位)
sbit SMG_g = P1^3;        //定义数码管阳级控制脚(个位)

unsigned char ly_disdate[4]={0,0,0,0};
unsigned char  U8FLAG;
unsigned char  U8temp;
unsigned char  U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
unsigned char  U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
unsigned char  U8comdata;
unsigned char  outdata[5];            
unsigned char  indata[5];
unsigned char  count, count_r=0;
unsigned char str[5]={"RS232"};

code unsigned char table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
                                                        0x88,0x83,0xc6,0xa1,0x86,0x8e};

void delay(void)
{               
        unsigned char i=10;
        while(i--);
}


void Delay(unsigned int j)
{
        unsigned char i;
        for(;j>0;j--)
        {        
                for(i=0;i<27;i++);
        }
}

void  Delay_10us(void)
{
        unsigned char i;
        i--;
        i--;
        i--;
        i--;
        i--;
        i--;
}
       
void COM (void)
{
        unsigned char i;
        for(i=0;i<8;i++)          
        {
                U8FLAG=2;       
                while((!P2_0)&&U8FLAG++);
                Delay_10us();
                Delay_10us();                               
                Delay_10us();
                U8temp=0;
                if(P2_0)U8temp=1;
                U8FLAG=2;
                while((P2_0)&&U8FLAG++);
                if(U8FLAG==1)break;
                U8comdata<<=1;
                U8comdata|=U8temp;
        }
}

void RH (void)
{       
        P2_0=0;
        Delay(180);
        P2_0=1;
        Delay_10us();
        Delay_10us();
        Delay_10us();
        Delay_10us();            
        P2_0=1;
        if(!P2_0)
        {
                U8FLAG=2;
                while((!P2_0)&&U8FLAG++);
                U8FLAG=2;
                while((P2_0)&&U8FLAG++);
                COM();
                U8RH_data_H_temp=U8comdata;
                COM();
                U8RH_data_L_temp=U8comdata;
                COM();
                U8T_data_H_temp=U8comdata;
                COM();
                U8T_data_L_temp=U8comdata;
                COM();
                U8checkdata_temp=U8comdata;
                P2_0=1;
                U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);
                if(U8temp==U8checkdata_temp)
                {
                        U8RH_data_H=U8RH_data_H_temp;
                        U8RH_data_L=U8RH_data_L_temp;
                        U8T_data_H=U8T_data_H_temp;
                        U8T_data_L=U8T_data_L_temp;
                        U8checkdata=U8checkdata_temp;
                }i
        }
}
       

void display()
{
        SMG_q=0;
        P0=table[ly_disdate[0]];
        delay();                       
        P0=0XFF;                       
        SMG_q=1;               

        SMG_b=0;               
        P0=table[ly_disdate[1]]-0x80;
        delay();               
        P0=0XFF;               
        SMG_b=1;       

        SMG_s=0;       
        P0=table[ly_disdate[2]];
        delay();                       
        P0=0XFF;                       
        SMG_s=1;               

        SMG_g=0;               
        P0=table[ly_disdate[3]];
        delay();               
        P0=0XFF;               
        SMG_g=1;       
}

void main()
{       
        unsigned int n=0,i=20000;

        TMOD = 0x20;
        TH1 = 243;     
        TL1 = 243;
        TR1 = 1;         
        SCON = 0x50;
        PCON=0x80;
        ES = 1;
        EA = 1;           
        TI = 0;
        RI = 0;
        SendData(str) ;
        Delay(10);      
        while(1)
        {  
                RH();
                str[0]=U8RH_data_H;
                str[1]=U8RH_data_L;
                str[2]=U8T_data_H;
                str[3]=U8T_data_L;
                str[4]=U8checkdata;
                        Delay(200);
                        SBUF=str[0];
                        Delay(200);       
                        SBUF=str[2];
                        Delay(200);
                       
                i=10000;
                while (i)
                {
                        if (n<5000)
                        {
                                ly_disdate[0]=str[0]/16;
                                ly_disdate[1]=str[0]%16;
                                ly_disdate[2]=str[0]/10;
                                ly_disdate[3]=str[0]%10;
                        }
                        else
                        {
                                ly_disdate[0]=str[2]/16;
                                ly_disdate[1]=str[2]%16;
                                ly_disdate[2]=str[2]/10;
                                ly_disdate[3]=str[2]%10;
                        }
                        n++;
                        i--;
                        if (n==10000)
                        {
                                n=0;
                        }
                        display();
                }
        }
}

void RSINTR() interrupt 4 using 2
{
        unsigned char InPut3;
        if(TI==1)
        {
                TI=0;
                if(count!=5)
                {
                        SBUF= outdata[count];
                        count++;
                }
        }
        if(RI==1)       
        {       
                InPut3=SBUF;
                indata[count_r]=InPut3;
                count_r++;
                RI=0;                                                                 
                if (count_r==5)
                {
                        count_r=0;
                        str[0]=indata[0];
                        str[1]=indata[1];
                        str[2]=indata[2];
                        str[3]=indata[3];
                        str[4]=indata[4];
                        P0=0;
                }
        }
}

适用电路:
1.jpg

回复

使用道具 举报

ID:267512 发表于 2018-1-3 08:50 | 显示全部楼层
k455619 发表于 2018-1-2 16:41
把DS18B20的C和H改成DHT11的C和H,但是函数名不要改,形参,要根据自己程序改 比如把init_dht11();改成 ini ...

谢谢了,我去试试
回复

使用道具 举报

ID:270264 发表于 2018-1-3 11:41 | 显示全部楼层
感觉好难啊
回复

使用道具 举报

ID:267512 发表于 2018-1-3 14:41 | 显示全部楼层
HC6800-ES-V2.0 发表于 2018-1-3 08:13
这里有个DHT11模块的程序,你看看。
#include
#include  

谢谢大佬
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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