找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 10831|回復(fù): 13
打印 上一主題 下一主題
收起左側(cè)

51單片機gy906測溫,語音播報,eepromc存儲,原理圖

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:687422 發(fā)表于 2020-3-10 18:26 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
這是去年我做的一個小設(shè)計,主要是用來測量體溫。今年由于疫情影響情況特殊,就想分享一下這個設(shè)計,但是某寶找材料才發(fā)現(xiàn)一個問題,都漲價了,有點難受。之前也在51黑下過資料,這次把資料發(fā)上來大家一起分享學(xué)習(xí)。實物圖:
沒有涉及PCB,用的洞洞板。第一次發(fā)帖。東西做出來有點丑,大家莫見怪。

主要功能:
通過按鍵控制測溫,按一次檢測一次。自動存儲三次數(shù)據(jù),可t通過按鍵切換顯示。并可通過OLED顯示和語音播報溫度。
系統(tǒng)供電采用,USB供電,也可以通過干電池,或者鋰電池。
主要使用元器件。
主控用的是51單片機,溫度傳感器用的是GY906,顯示用的是0.96寸0LED,通訊方式采用IIC,語音播報用的現(xiàn)成的模塊。



語音播報采用串口通訊,比較簡單。直接
  1. printf("你好");
復(fù)制代碼

就可以直接播報你好。
主要原理圖:

主要來說說GY906和eeprom
直接上代碼吧。
先來測溫的
  1. #include "reg52.h"
  2. #include "GY906.h"

  3. #define  Nack_counter  10

  4. //************ 數(shù)據(jù)定義****************
  5. bdata uchar flag;//可位尋址數(shù)據(jù)
  6. sbit bit_out=flag^7;
  7. sbit bit_in=flag^0;
  8. unsigned char DataH,DataL,Pecreg;



  9. void delay(uint a)
  10. {                        
  11.         uint b;
  12.         for(;a>0;a--)
  13.                 for(b=125;b>0;b--);
  14. }


  15. void i2c_Init(void)
  16. {
  17.         SCL=1;
  18.         SDA=1;
  19.         _nop_();
  20.         _nop_();
  21.         _nop_();
  22.         _nop_();
  23.         SCL=0;
  24.         delay(1);
  25.         SCL=1;
  26. }

  27. //************************************
  28. void   start_bit(void)
  29. {
  30.    SDA=1;
  31.    _nop_();_nop_();_nop_();_nop_();_nop_();
  32.    SCL=1;
  33.    _nop_();_nop_();_nop_();_nop_();_nop_();
  34.    SDA=0;
  35.    _nop_();_nop_();_nop_();_nop_();_nop_();
  36.    SCL=0;
  37.    _nop_();_nop_();_nop_();_nop_();_nop_();

  38. }
  39. //------------------------------
  40. void   stop_bit(void)
  41. {

  42.    SCL=0;
  43.    _nop_();_nop_();_nop_();_nop_();_nop_();
  44.    SDA=0;
  45.    _nop_();_nop_();_nop_();_nop_();_nop_();
  46.    SCL=1;
  47.    _nop_();_nop_();_nop_();_nop_();_nop_();
  48.    SDA=1;
  49. }
  50. //--------- 發(fā)送一個字節(jié)---------
  51. void  tx_byte(uchar dat_byte)
  52. {
  53.    char i,n,dat;
  54.    n=Nack_counter;
  55. TX_again:
  56.    dat=dat_byte;
  57.    for(i=0;i<8;i++)
  58.    {
  59.      if(dat&0x80)
  60.       bit_out=1;
  61.      else
  62.       bit_out=0;
  63.      send_bit();
  64.      dat=dat<<1;
  65.    }
  66.    
  67.       receive_bit();
  68.    if(bit_in==1)
  69.    {
  70.     stop_bit();
  71.     if(n!=0)
  72.     {n--;goto Repeat;}
  73.     else
  74.      goto exit;
  75.    }
  76.    else
  77.     goto exit;
  78. Repeat:
  79.     start_bit();
  80.     goto TX_again;
  81. exit: ;
  82. }
  83. //-----------發(fā)送一個位---------
  84. void  send_bit(void)
  85. {
  86.   if(bit_out==0)
  87.   
  88.        SDA=0;
  89.   else
  90.      SDA=1;
  91.   _nop_();
  92.   SCL=1;
  93.   _nop_();_nop_();_nop_();_nop_();
  94.   _nop_();_nop_();_nop_();_nop_();
  95.   SCL=0;
  96.   _nop_();_nop_();_nop_();_nop_();
  97.   _nop_();_nop_();_nop_();_nop_();
  98. }
  99. //---------- 接收一個字節(jié)--------
  100. uchar rx_byte(void)
  101. {
  102.   uchar i,dat;
  103.   dat=0;
  104.   for(i=0;i<8;i++)
  105.   {
  106.     dat=dat<<1;
  107.     receive_bit();
  108.     if(bit_in==1)
  109.      dat=dat+1;
  110.   }
  111.   send_bit();
  112.   return dat;
  113. }

  114. //---------- 接收一個位----------
  115. void receive_bit(void)
  116. {
  117.   SDA=1;bit_in=1;
  118.   SCL=1;
  119.   _nop_();_nop_();_nop_();_nop_();
  120.   _nop_();_nop_();_nop_();_nop_();
  121.   bit_in=SDA;
  122.   _nop_();
  123.   SCL=0;
  124.   _nop_();_nop_();_nop_();_nop_();
  125.   _nop_();_nop_();_nop_();_nop_();
  126. }
  127. ////------------ 延時--------------
  128. //void   delay(uint N)
  129. //{
  130. //  uint i;
  131. //  for(i=0;i<N;i++)
  132. //  
  133. //     _nop_();
  134. //}
  135. //------------------------------
  136. float memread(void)
  137. {
  138.         float  wendu_change;
  139.   start_bit();
  140.   tx_byte(0xB4);  //Send SlaveAddress ==============================
  141.   //tx_byte(0x00);
  142.   tx_byte(0x07);  //Send Command
  143.   //------------
  144.   start_bit();
  145.   tx_byte(0x01);
  146.   bit_out=0;
  147.   DataL=rx_byte();
  148.   bit_out=0;
  149.   DataH=rx_byte();
  150.   bit_out=1;
  151.   Pecreg=rx_byte();
  152.   stop_bit();
  153.         wendu_change = (DataH*256+DataL)*0.02-273.15;
  154.   return(wendu_change);
  155. }
復(fù)制代碼
eeprom也比較簡單。
  1. #include "reg52.h"
  2. #include "eepom.h"






  3. /* ================ 打開 ISP,IAP 功能 ================= */
  4. void ISP_IAP_enable(void)
  5. {
  6.          EA = 0;       /* 關(guān)中斷   */
  7.          ISP_CONTR = ISP_CONTR & 0x18;       /* 0001,1000 */
  8.          ISP_CONTR = ISP_CONTR | WaitTime; /* 寫入硬件延時 */
  9.          ISP_CONTR = ISP_CONTR | 0x80;       /* ISPEN=1  */
  10. }
  11. /* =============== 關(guān)閉 ISP,IAP 功能 ================== */
  12. void ISP_IAP_disable(void)
  13. {
  14.          ISP_CONTR = ISP_CONTR & 0x7f; /* ISPEN = 0 */
  15.          ISP_TRIG = 0x00;
  16.          EA   =   1;   /* 開中斷 */
  17. }
  18. /* ================ 公用的觸發(fā)代碼 ==================== */
  19. void ISPgoon(void)
  20. {
  21.          ISP_IAP_enable();   /* 打開 ISP,IAP 功能 */
  22.          ISP_TRIG = 0x46;  /* 觸發(fā)ISP_IAP命令字節(jié)1 */
  23.          ISP_TRIG = 0xb9;  /* 觸發(fā)ISP_IAP命令字節(jié)2 */
  24.          _nop_();
  25. }
  26. /* ==================== 字節(jié)讀 ======================== */
  27. unsigned char byte_read(unsigned int byte_addr)
  28. {
  29.         EA = 0;
  30.          ISP_ADDRH = (unsigned char)(byte_addr >> 8);/* 地址賦值 */
  31.          ISP_ADDRL = (unsigned char)(byte_addr & 0x00ff);
  32.          ISP_CMD   = ISP_CMD & 0xf8;   /* 清除低3位  */
  33.          ISP_CMD   = ISP_CMD | RdCommand; /* 寫入讀命令 */
  34.          ISPgoon();       /* 觸發(fā)執(zhí)行  */
  35.          ISP_IAP_disable();    /* 關(guān)閉ISP,IAP功能 */
  36.          EA  = 1;
  37.          return (ISP_DATA);    /* 返回讀到的數(shù)據(jù) */
  38. }
  39. /* ================== 扇區(qū)擦除 ======================== */
  40. void SectorErase(unsigned int sector_addr)
  41. {
  42.          unsigned int iSectorAddr;
  43.          iSectorAddr = (sector_addr & 0xfe00); /* 取扇區(qū)地址 */
  44.          ISP_ADDRH = (unsigned char)(iSectorAddr >> 8);
  45.          ISP_ADDRL = 0x00;
  46.          ISP_CMD = ISP_CMD & 0xf8;   /* 清空低3位  */
  47.          ISP_CMD = ISP_CMD | EraseCommand; /* 擦除命令3  */
  48.          ISPgoon();       /* 觸發(fā)執(zhí)行  */
  49.          ISP_IAP_disable();    /* 關(guān)閉ISP,IAP功能 */
  50. }
  51. /* ==================== 字節(jié)寫 ======================== */
  52. void byte_write(unsigned int byte_addr, unsigned char original_data)
  53. {
  54.          EA  = 0;
  55. //         SectorErase(byte_addr);
  56.          ISP_ADDRH = (unsigned char)(byte_addr >> 8);  /* 取地址  */
  57.          ISP_ADDRL = (unsigned char)(byte_addr & 0x00ff);
  58.          ISP_CMD  = ISP_CMD & 0xf8;    /* 清低3位 */
  59.          ISP_CMD  = ISP_CMD | PrgCommand;  /* 寫命令2 */
  60.          ISP_DATA = original_data;   /* 寫入數(shù)據(jù)準(zhǔn)備 */
  61.          ISPgoon();       /* 觸發(fā)執(zhí)行  */
  62.          ISP_IAP_disable();     /* 關(guān)閉IAP功能 */
  63.          EA =1;
  64. }



復(fù)制代碼

主函數(shù)主要是通過按鍵來執(zhí)行相應(yīng)的操作即可。
篇幅有限,文件在下面,自行下載吧。



代碼: 人體測溫度.zip (89.23 KB, 下載次數(shù): 341)

評分

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

查看全部評分

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

使用道具 舉報

沙發(fā)
ID:705251 發(fā)表于 2020-3-13 11:44 | 只看該作者
想問下這個測體溫誤差大嗎,看資料說mlx在36到40度精度是±0.5度,醫(yī)療型號能好點但是太貴了,不知道實際效果怎樣,糾結(jié)
回復(fù)

使用道具 舉報

板凳
ID:418578 發(fā)表于 2020-6-1 13:10 | 只看該作者
原理圖能詳細(xì)一點嗎?有沒有大一點的
回復(fù)

使用道具 舉報

地板
ID:820761 發(fā)表于 2020-9-18 21:53 | 只看該作者
材料都是什么?
回復(fù)

使用道具 舉報

5#
ID:843724 發(fā)表于 2020-11-25 01:23 | 只看該作者
為什么編譯不了
回復(fù)

使用道具 舉報

6#
ID:328014 發(fā)表于 2020-11-25 04:15 | 只看該作者

可以編譯啊 0個錯誤呢

51hei.png (6.24 KB, 下載次數(shù): 152)

51hei.png
回復(fù)

使用道具 舉報

7#
ID:849454 發(fā)表于 2020-12-4 20:02 | 只看該作者
為什么溫度無法實時顯示
回復(fù)

使用道具 舉報

8#
ID:811405 發(fā)表于 2021-2-9 16:55 | 只看該作者
內(nèi)容詳盡,設(shè)計符合當(dāng)下熱點,做單片機設(shè)計的可以作為參考資料
回復(fù)

使用道具 舉報

9#
ID:871734 發(fā)表于 2021-2-10 12:33 | 只看該作者
這個應(yīng)該用什么軟件運行?
回復(fù)

使用道具 舉報

10#
ID:169891 發(fā)表于 2021-6-12 18:44 | 只看該作者
讀不出溫度,一直是-26
回復(fù)

使用道具 舉報

11#
ID:959370 發(fā)表于 2021-8-11 16:08 | 只看該作者
MLX90614可以進(jìn)行仿真嗎,為什么我在Proteus里面沒法仿真呀
回復(fù)

使用道具 舉報

12#
ID:990898 發(fā)表于 2021-12-13 09:15 | 只看該作者
有全部的原理圖嗎?
回復(fù)

使用道具 舉報

13#
ID:1052693 發(fā)表于 2022-11-18 19:51 | 只看該作者
我有個GY-906測溫模塊的問題想跟你請教一下,可以嗎?
回復(fù)

使用道具 舉報

14#
ID:697056 發(fā)表于 2023-5-26 21:09 | 只看該作者
kzdazhuzi 發(fā)表于 2021-8-11 16:08
MLX90614可以進(jìn)行仿真嗎,為什么我在Proteus里面沒法仿真呀

確實沒有辦法仿真
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表