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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3682|回復: 2
打印 上一主題 下一主題
收起左側

STC8A8K單片機+DHT11+DS1302+DS18B20源程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:335397 發表于 2020-5-8 23:16 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
傳感器的接口可以自己修改定義,這里就不放圖了。

單片機源程序如下:
  1. #include "stc8.h"
  2. #include "spi.h"
  3. #include "uart.h"
  4. #include "delay.h"
  5. #include "18b20.h"
  6. #include "stdio.h"


  7. #define uchar unsigned char
  8. #define uint unsigned int



  9. /***********                DHT11定義                *******************/

  10. sbit dht_dat=P4^1; //dht11的IO口
  11. uchar dht_num=0; //用于while 循環中計數,超時則跳出循環
  12. uchar dht_d1=0,dht_d2=0;        //依次為濕度整數部分和濕度小數部分
  13. uchar dht_t1=0,dht_t2=0;  //依次為溫度整數部和小數部分
  14. uchar dht_j=0;        //和校驗,可以選擇是否使用,具體參照數據手冊


  15. /************        DS1302定義        ********/

  16. //---定義ds1302使用的IO口---//
  17. sbit SCLK=P2^5;
  18. sbit DSIO=P2^4;
  19. sbit rst=P2^3;

  20. //---定義全局函數---//
  21. void Ds1302Write(u8 addr, u8 dat);
  22. u8 Ds1302Read(u8 addr);
  23. void Ds1302Init();
  24. void Ds1302ReadTime();                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           

  25. //---加入全局變量--//
  26. extern u8 TIME[7];        //加入全局變量

  27. u8 code READ_RTC_ADDR[7] = {0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d};
  28. u8 code WRITE_RTC_ADDR[7] = {0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c};

  29. //---DS1302時鐘初始化2017年2月17日星期五20點16分00秒。---//
  30. //---存儲順序是秒分時日月周年,存儲格式是用BCD碼---//

  31. u8 TIME[7] = {0x00,0x16, 0x11, 0x20, 0x03, 0x03, 0x19};
  32. u8 sec,min,hour,sec1,min1,hour1,ri,ri1,yue,yue1,nian,nian1,zhou,zhou1;

  33. /*********        函數聲明        ************/
  34. void dht_init();
  35. uchar read_date();
  36. void get_temp();
  37. void Ds1302Write(u8 addr, u8 dat);
  38. u8 Ds1302Read(u8 addr);
  39. void Ds1302Init();
  40. void Ds1302ReadTime();
  41. void pors(void);
  42. void display();//顯示函數

  43. /********                主函數                ********/
  44. int main()
  45. {        
  46.          double temp;
  47.          char displaytemp[16];

  48.          dht_init();                                                //dht11初始化        
  49.          uart_init();                                                //串口初始化
  50.          Lcd_Init();                             //初始化OLED  
  51.    Ds1302Init();                                        //ds1302初始化        
  52.          
  53.          LCD_Clear(WHITE);
  54.          BACK_COLOR=WHITE;
  55.          
  56.          display();

  57.          while(1)
  58.          {
  59.                  /*******ds18b20*****/
  60.                                 
  61.                  temp=readtemp();//讀取溫度
  62.                  LCD_ShowChinese(20,150,14,16,BLACK);   //水
  63.                  LCD_ShowChinese(35,150,0,16,BLACK);   //溫
  64.                  LCD_ShowString(50,150,":",BLACK);                        //:
  65.                  sprintf(displaytemp,"%7.3f",temp);//打印溫度值
  66.                  LCD_ShowString(65,150,displaytemp,RED);        //
  67.                  LCD_ShowChinese(130,150,8,16,RED);   //℃
  68.                 /*******ds1302*******/                 
  69.                  pors();
  70.                  Ds1302ReadTime();
  71.                  LCD_ShowString(20,45,"20",RED);        //
  72.                  LCD_ShowNum(35,45,nian1,1,RED);        //
  73.                  LCD_ShowNum(40,45,nian,1,RED);        //顯示年
  74.                  
  75.                  LCD_ShowNum(75,45,yue1,1,RED);        //
  76.                  LCD_ShowNum(85,45,yue,1,RED);        //顯示月
  77.                  
  78.                  LCD_ShowNum(115,45,ri1,1,RED);        //
  79.                  LCD_ShowNum(125,45,ri,1,RED);        //顯示日
  80.                  
  81.                  LCD_ShowNum(205,45,zhou,1,RED);        //顯示周
  82.                  
  83.                  LCD_ShowNum(75,80,hour1,1,RED);        
  84.                  LCD_ShowNum(85,80,hour,1,RED);        //時
  85.                  
  86.                  LCD_ShowNum(115,80,min1,1,RED);        
  87.                  LCD_ShowNum(125,80,min,1,RED);        //分
  88.                  
  89.                  LCD_ShowNum(155,80,sec1,1,RED);        
  90.                  LCD_ShowNum(165,80,sec,1,RED);        //秒
  91.                         
  92.                  /*******dht11******/
  93.                  get_temp();//讀取溫濕度
  94.                  LCD_ShowNum(80,115,dht_t1,2,RED);        //顯示溫度整數
  95.                  LCD_ShowNum(100,115,dht_t2,1,RED);        //顯示濕度小數
  96.                   LCD_ShowNum(180,115,dht_d1,2,RED);        //顯示濕度整數
  97.                  LCD_ShowNum(200,115,dht_d2,1,RED);        //顯示濕度小數
  98.    }
  99. }


  100. /*********************************************************


  101.                                                                         DS1302

  102. **********************************************************/
  103. /*******************************************************************************
  104. * 函 數 名         : Ds1302Write
  105. * 函數功能                   : 向DS1302命令(地址+數據)
  106. * 輸    入         : addr,dat
  107. * 輸    出         : 無
  108. *******************************************************************************/

  109. void Ds1302Write(u8 addr, u8 dat)
  110. {
  111.         u8 n;
  112.         rst = 0;
  113.         _nop_();

  114.         SCLK = 0;//先將SCLK置低電平。
  115.         _nop_();
  116.         rst = 1; //然后將RST(CE)置高電平。
  117.         _nop_();

  118.         for (n=0; n<8; n++)//開始傳送八位地址命令
  119.         {
  120.                 DSIO = addr & 0x01;//數據從低位開始傳送
  121.                 addr >>= 1;
  122.                 SCLK = 1;//數據在上升沿時,DS1302讀取數據
  123.                 _nop_();
  124.                 SCLK = 0;
  125.                 _nop_();
  126.         }
  127.         for (n=0; n<8; n++)//寫入8位數據
  128.         {
  129.                 DSIO = dat & 0x01;
  130.                 dat >>= 1;
  131.                 SCLK = 1;//數據在上升沿時,DS1302讀取數據
  132.                 _nop_();
  133.                 SCLK = 0;
  134.                 _nop_();        
  135.         }        
  136.                  
  137.         rst = 0;//傳送數據結束
  138.         _nop_();
  139. }

  140. /*******************************************************************************
  141. * 函 數 名         : Ds1302Read
  142. * 函數功能                   : 讀取一個地址的數據
  143. * 輸    入         : addr
  144. * 輸    出         : dat
  145. *******************************************************************************/

  146. u8 Ds1302Read(u8 addr)
  147. {
  148.         u8 n,dat,dat1;
  149.         rst = 0;
  150.         _nop_();

  151.         SCLK = 0;//先將SCLK置低電平。
  152.         _nop_();
  153.         rst = 1;//然后將RST(CE)置高電平。
  154.         _nop_();

  155.         for(n=0; n<8; n++)//開始傳送八位地址命令
  156.         {
  157.                 DSIO = addr & 0x01;//數據從低位開始傳送
  158.                 addr >>= 1;
  159.                 SCLK = 1;//數據在上升沿時,DS1302讀取數據
  160.                 _nop_();
  161.                 SCLK = 0;//DS1302下降沿時,放置數據
  162.                 _nop_();
  163.         }
  164.         _nop_();
  165.         for(n=0; n<8; n++)//讀取8位數據
  166.         {
  167.                 dat1 = DSIO;//從最低位開始接收
  168.                 dat = (dat>>1) | (dat1<<7);
  169.                 SCLK = 1;
  170.                 _nop_();
  171.                 SCLK = 0;//DS1302下降沿時,放置數據
  172.                 _nop_();
  173.         }

  174.         rst = 0;
  175.         _nop_();        //以下為DS1302復位的穩定時間,必須的。
  176.         SCLK = 1;
  177.         _nop_();
  178.         DSIO = 0;
  179.         _nop_();
  180.         DSIO = 1;
  181.         _nop_();
  182.         return dat;        
  183. }

  184. /*******************************************************************************
  185. * 函 數 名         : Ds1302Init
  186. * 函數功能                   : 初始化DS1302.
  187. * 輸    入         : 無
  188. * 輸    出         : 無
  189. *******************************************************************************/

  190. void Ds1302Init()
  191. {
  192.         u8 n;
  193.         Ds1302Write(0x8E,0X00);                 //禁止寫保護,就是關閉寫保護功能
  194.         for (n=0; n<7; n++)//寫入7個字節的時鐘信號:分秒時日月周年
  195.         {
  196.                 Ds1302Write(WRITE_RTC_ADDR[n],TIME[n]);        
  197.         }
  198.         Ds1302Write(0x8E,0x80);                 //打開寫保護功能
  199. }

  200. /*******************************************************************************
  201. * 函 數 名         : Ds1302ReadTime
  202. * 函數功能                   : 讀取時鐘信息
  203. * 輸    入         : 無
  204. * 輸    出         : 無
  205. *******************************************************************************/

  206. void Ds1302ReadTime()
  207. {
  208.         u8 n;
  209.         for (n=0; n<7; n++)//讀取7個字節的時鐘信號:分秒時日月周年
  210.         {
  211.                 TIME[n] = Ds1302Read(READ_RTC_ADDR[n]);
  212.         }
  213.                
  214. }

  215. /***********數據處理***********************/
  216. void pors(void)
  217. {
  218.                 u8 dat1,dat2;
  219.           Ds1302ReadTime();
  220.         
  221.     dat1=TIME[0]/16;   //對秒做進制處理
  222.     dat2=TIME[0]%16;
  223.     sec=(((TIME[0]/16*10)+(TIME[0]%16)))%10;
  224.                 sec1=(((TIME[0]/16*10)+(TIME[0]%16)))/10;
  225.    
  226.         
  227.           dat1=TIME[1]/16;   //對分做進制處理
  228.     dat2=TIME[1]%16;
  229.     min=(((TIME[1]/16*10)+(TIME[1]%16)))%10;
  230.                 min1=(((TIME[1]/16*10)+(TIME[1]%16)))/10;
  231.    
  232.         
  233.           dat1=TIME[2]/16;   //對小時做進制處理
  234.     dat2=TIME[2]%16;
  235.     hour=(((TIME[2]/16*10)+(TIME[2]%16)))%10;
  236.     hour1=(((TIME[2]/16*10)+(TIME[2]%16)))/10;
  237.                
  238.                 dat1=TIME[3]/16;   //對日做進制處理
  239.     dat2=TIME[3]%16;
  240.     ri=(((TIME[3]/16*10)+(TIME[3]%16)))%10;
  241.     ri1=(((TIME[3]/16*10)+(TIME[3]%16)))/10;
  242.                
  243.                 dat1=TIME[4]/16;   //對月做進制處理
  244.     dat2=TIME[4]%16;
  245.     yue=(((TIME[4]/16*10)+(TIME[4]%16)))%10;
  246.     yue1=(((TIME[4]/16*10)+(TIME[4]%16)))/10;
  247.                
  248.                 dat1=TIME[6]/16;   //對年做進制處理
  249.     dat2=TIME[6]%16;
  250.     nian=(((TIME[6]/16*10)+(TIME[6]%16)))%10;
  251.     nian1=(((TIME[6]/16*10)+(TIME[6]%16)))/10;
  252.                
  253.                 dat1=TIME[5]/16;   //對周做進制處理
  254.     dat2=TIME[5]%16;
  255.     zhou=(((TIME[5]/16*10)+(TIME[5]%16)))%10;
  256.     zhou1=(((TIME[5]/16*10)+(TIME[5]%16)))/10;
  257. }
  258.         
  259. /*********************************************************


  260.                                                                         DHT11

  261. **********************************************************/
  262. /*****************************************/
  263. void dht_init()
  264. {
  265.                 int a;
  266.                 for(a=0;a<1000;a++)
  267.                 {
  268.                         Delay1ms();
  269.                 }                                                                                                //DHT11上電前準備時間,大概1s
  270.    dht_dat=1;             //  總線準備
  271. }
  272. uchar read_date()        //接收一個8位數據,先高位后低位
  273. {
  274.         uchar i,dat;
  275.         for(i=0;i<8;i++)   //循環8次,把判斷有“1”輸入到dat中,然后輸出一個八位的數據
  276.         {
  277.                 dht_num=2;
  278.                 while((dht_dat==0)&&(dht_num++)); //dht_dat 數據線由DH11拉低準備發送數據
  279.                 delay_10us();
  280.                 delay_10us();
  281.                 delay_10us();
  282.                 delay_10us();
  283.                 dat=dat<<1;
  284.                 if(dht_dat==1)
  285.                 {
  286.                         dht_num=2;
  287.                         dat=dat|0x01;  //如果DQ的數據是高電平1,則把1放到dat的最低位
  288.                         while((dht_dat==1)&&(dht_num++));
  289.                 }
  290.         }
  291.         return dat;        
  292. }

  293. void get_temp()        //給DHT11一個開始信號,然后讀取一次數據,共五個8位字節
  294. {                int a;
  295.                
  296.                 dht_dat=0;
  297.                 for(a=0;a<25;a++)
  298.                 {
  299.                         Delay1ms();
  300.                 }        
  301.                 dht_dat=1;        //單片機給起始脈沖信號

  302.                 delay_10us();
  303.                 delay_10us();
  304.                 delay_10us();
  305.                 delay_10us();
  306.                 dht_dat=1;         //稍作延時,等待DHT11返回響應(響應為低電平)
  307.                 if(dht_dat==0)         //有響應才接收數據,否則不處理
  308.                 {
  309.                                                 dht_num=2;
  310.                                                 while((dht_dat==0)&&(dht_num++));
  311.                                                 dht_num=2;
  312.                                                 while((dht_dat==1)&&(dht_num++));
  313.                                                 dht_d1=read_date();
  314.                                                 dht_d2=read_date();
  315.                                                 dht_t1=read_date();
  316.                                                 dht_t2=read_date();
  317. ……………………

  318. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

所有資料51hei提供下載:
STC8A8K dht11 ds1302 ds18b20.zip (207.17 KB, 下載次數: 111)


評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發
ID:314894 發表于 2020-11-15 16:05 | 只看該作者
程序太垃圾了,
回復

使用道具 舉報

板凳
ID:151348 發表于 2023-1-31 20:14 | 只看該作者
借用了delay、DS18B20和DHT11的程序,把DHT11.c文件里面的delay(1000)函數用delay.c文件中的Delay800ms()代替,delay(25)用3個Delay10ms()代替,delay(10)用戶Delay10ms()代替即可,其余的沒問題,good job!
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 免费a级毛片在线播放 | 成人午夜av | 超碰精品在线观看 | 精品久久久久久久久久久 | 视频在线亚洲 | 91麻豆蜜桃一区二区三区 | 欧美精产国品一二三区 | 免费观看的av毛片的网站 | 操操操av| 中文字幕一级毛片 | 亚洲色综合 | www国产成人免费观看视频,深夜成人网 | 99精品国产成人一区二区 | 国产91久久精品一区二区 | 草久久 | 天天操天天射天天舔 | 美女视频网站久久 | 亚洲精品一区在线观看 | 国产精品久久av | 综合色播 | 视频一区二区在线观看 | 天天干成人网 | 成人中文网 | 免费精品 | 成人精品视频 | 久久国产精品免费一区二区三区 | 草久久久 | 性高湖久久久久久久久3小时 | 久久久久久免费毛片精品 | 蜜桃精品视频在线 | 日韩精品久久久 | 激情欧美日韩一区二区 | 亚洲精品电影网在线观看 | 久久久久国产一区二区三区四区 | 免费一区| 亚洲天堂影院 | 日韩一区二区三区视频在线观看 | 日韩一区二区三区精品 | 99热精品在线观看 | 日韩欧美精品一区 | www.一区二区 |