久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3008|回復: 8
打印 上一主題 下一主題
收起左側(cè)

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

[復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:267512 發(fā)表于 2018-1-2 15:46 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
這是用51做的萬年歷,可以顯示溫度,時間,日期,用的傳感器是18b20,我想改成用dht11,可是程序該怎么改啊
  1. #include <reg52.h>          //調(diào)用單片機頭文件
  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;        //農(nóng)歷 陽歷顯示標志位

  14. uchar menu_1,menu_2;
  15. uchar key_time,flag_value;      //用做連加的中間變量
  16. bit key_500ms  ;
  17. uchar n_nian,n_yue,n_ri;  //農(nóng)歷顯示的函數(shù)

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

  20. /******************把數(shù)據(jù)保存到單片機內(nèi)部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. /******************把數(shù)據(jù)從單片機內(nèi)部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)  //新的單片機初始單片機內(nèi)問eeprom
  42. {
  43.   fen1  = 3;
  44.   shi1  = 8;
  45.   open1  = 1;
  46.   a_a = 1;
  47.   write_eeprom();    //保存數(shù)據(jù)
  48. }
  49. }
  50. /***********************18b20初始化函數(shù)*****************************/
  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內(nèi)的數(shù)據(jù)***************/
  65. void write_18b20(uchar dat)
  66. {
  67. uchar i;
  68. for(i=0;i<8;i++)
  69. {      //寫數(shù)據(jù)是低位開始
  70.   dq = 0;    //把總線拿低寫時間隙開始
  71.   dq = dat & 0x01; //向18b20總線寫數(shù)據(jù)了
  72.   delay_uint(5);  // 60us
  73.   dq = 1;    //釋放總線
  74.   dat >>= 1;
  75. }
  76. }
  77. /*************讀取18b20內(nèi)的數(shù)據(jù)***************/
  78. uchar read_18b20()
  79. {
  80. uchar i,value;
  81. for(i=0;i<8;i++)
  82. {
  83.   dq = 0;    //把總線拿低讀時間隙開始
  84.   value >>= 1;  //讀數(shù)據(jù)是低位開始
  85.   dq = 1;    //釋放總線
  86.   if(dq == 1)   //開始讀寫數(shù)據(jù)
  87.    value |= 0x80;
  88.   delay_uint(5);  //60us 讀一個時間隙最少要保持60us的時間
  89. }
  90. return value;   //返回數(shù)據(jù)
  91. }
  92. /*************讀取溫度的值 讀出來的是小數(shù)***************/
  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);    //啟動一次溫度轉(zhuǎn)換命令
  100. delay_uint(50);     //500us
  101. init_18b20();     //初始化18b20

  102. write_18b20(0xcc);    //跳過64位ROM
  103. write_18b20(0xbe);    //發(fā)出讀取暫存器命令

  104. EA = 0;
  105. low = read_18b20();    //讀溫度低字節(jié)
  106. value = read_18b20();  //讀溫度高字節(jié)
  107. EA = 1;
  108. value <<= 8;     //把溫度的高位左移8位
  109. value |= low;     //把讀出的溫度低位放到value的低八位中
  110. value *= 0.625;        //轉(zhuǎn)換到溫度值 小數(shù)
  111. return value;     //返回讀出的溫度 帶小數(shù)
  112. }

  113. /******************1ms 延時函數(shù)*******************/
  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. /******************寫星期函數(shù)*******************/
  121. void write_week(uchar hang,uchar add,uchar week)//寫星期函數(shù)
  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');//星期數(shù)為1時,顯示
  130.       write_data('O');
  131.       write_data('N');
  132.       break;
  133.    
  134.   case 2:write_data('T');//星期數(shù)據(jù)為2時顯示
  135.       write_data('U');
  136.       write_data('E');
  137.       break;
  138.   
  139.   case 3:write_data('W');//星期數(shù)據(jù)為3時顯示
  140.       write_data('E');
  141.       write_data('D');
  142.       break;
  143.   
  144.   case 4:write_data('T');//星期數(shù)據(jù)為4是顯示
  145.       write_data('H');
  146.       write_data('U');
  147.       break;
  148.   
  149.   case 5:write_data('F');//星期數(shù)據(jù)為5時顯示
  150.       write_data('R');
  151.       write_data('I');
  152.       break;
  153.   
  154.   case 6:write_data('S');//星期數(shù)據(jù)為6時顯示
  155.       write_data('T');
  156.       write_data('A');
  157.       break;
  158.   
  159.   case 0:write_data('S');//星期數(shù)據(jù)為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     //顯示農(nóng)歷
  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. /*************鬧鐘報警函數(shù)***************/
  198. void menu_dis()
  199. {
  200. static uchar mm,value;
  201. if(flag_100ms == 1)    //100ms執(zhí)行一次
  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. /**********************設置函數(shù)************************/
  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. /*****************主函數(shù)********************/
  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();       //開始初始化保存的數(shù)據(jù)
  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;    //切換農(nóng)歷和陽歷的顯示標志位
  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();    //鬧鐘報警函數(shù)
  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. }
復制代碼

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發(fā)
ID:267512 發(fā)表于 2018-1-2 15:46 | 只看該作者
自己頂一下
回復

使用道具 舉報

板凳
ID:215444 發(fā)表于 2018-1-2 16:41 | 只看該作者
把DS18B20的C和H改成DHT11的C和H,但是函數(shù)名不要改,形參,要根據(jù)自己程序改 比如把init_dht11();改成 init_ds1302();  大概就這個意思吧,就是披著羊皮(18b20)的狼(dht11);
回復

使用道具 舉報

地板
ID:123289 發(fā)表于 2018-1-2 19:37 | 只看該作者
1、讀通18b20手冊
2、讀通dht11手冊
回復

使用道具 舉報

5#
ID:270391 發(fā)表于 2018-1-2 20:29 | 只看該作者
不太懂
回復

使用道具 舉報

6#
ID:164602 發(fā)表于 2018-1-3 08:13 | 只看該作者
這里有個DHT11模塊的程序,你看看。
#include <reg51.h>
#include <intrins.h>

sbit  P2_0  = P2^0 ;//溫濕度傳感器的數(shù)據(jù)接口

sbit SMG_q = P1^0;        //定義數(shù)碼管陽級控制腳(千位)
sbit SMG_b = P1^1;        //定義數(shù)碼管陽級控制腳(百位)
sbit SMG_s = P1^2;        //定義數(shù)碼管陽級控制腳(十位)
sbit SMG_g = P1^3;        //定義數(shù)碼管陽級控制腳(個位)

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;
                }
        }
}

適用電路:


回復

使用道具 舉報

7#
ID:267512 發(fā)表于 2018-1-3 08:50 | 只看該作者
k455619 發(fā)表于 2018-1-2 16:41
把DS18B20的C和H改成DHT11的C和H,但是函數(shù)名不要改,形參,要根據(jù)自己程序改 比如把init_dht11();改成 ini ...

謝謝了,我去試試
回復

使用道具 舉報

8#
ID:270264 發(fā)表于 2018-1-3 11:41 | 只看該作者
感覺好難啊
回復

使用道具 舉報

9#
ID:267512 發(fā)表于 2018-1-3 14:41 | 只看該作者
HC6800-ES-V2.0 發(fā)表于 2018-1-3 08:13
這里有個DHT11模塊的程序,你看看。
#include
#include  

謝謝大佬
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲香蕉在线视频 | 欧美中文字幕在线观看 | 免费爱爱视频 | www久久久| 天堂视频中文在线 | 亚洲精品9999 | 免费特级黄毛片 | 日本亚洲一区二区 | 亚洲成年影院 | 久久99精品久久久久久青青日本 | 国产精品久久久久久久久久久久久久 | 欧美v免费| 久久精品国产一区二区电影 | 国产中的精品av涩差av | 一区二区三区小视频 | va在线| 国产a区| 色偷偷人人澡人人爽人人模 | 超碰97人人人人人蜜桃 | 欧美在线高清 | 久久久一区二区三区 | 一区二区三区在线 | av中文天堂 | 欧美午夜精品 | www成年人视频 | 欧美综合国产精品久久丁香 | 99精品视频免费在线观看 | 99热在线播放 | 亚洲国产一区二区在线 | 午夜一区二区三区 | 国产福利在线 | 国产精品久久久久国产a级 欧美日本韩国一区二区 | 日韩亚洲视频 | 日韩一级在线 | 天天碰日日操 | 在线三级网址 | 久久久久久久久久久高潮一区二区 | 在线成人| 久久a久久| 黄网站免费在线观看 | 日韩国产中文字幕 |