標(biāo)題: 51單片機(jī)gy906測溫,語音播報(bào),eepromc存儲,原理圖 [打印本頁]

作者: 果子面包1    時(shí)間: 2020-3-10 18:26
標(biāo)題: 51單片機(jī)gy906測溫,語音播報(bào),eepromc存儲,原理圖
這是去年我做的一個(gè)小設(shè)計(jì),主要是用來測量體溫。今年由于疫情影響情況特殊,就想分享一下這個(gè)設(shè)計(jì),但是某寶找材料才發(fā)現(xiàn)一個(gè)問題,都漲價(jià)了,有點(diǎn)難受。之前也在51黑下過資料,這次把資料發(fā)上來大家一起分享學(xué)習(xí)。實(shí)物圖:
沒有涉及PCB,用的洞洞板。第一次發(fā)帖。東西做出來有點(diǎn)丑,大家莫見怪。

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



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

就可以直接播報(bào)你好。
主要原理圖:

主要來說說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ā)送一個(gè)字節(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ā)送一個(gè)位---------
  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. //---------- 接收一個(gè)字節(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. //---------- 接收一個(gè)位----------
  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. ////------------ 延時(shí)--------------
  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; /* 寫入硬件延時(shí) */
  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)

作者: 296351090    時(shí)間: 2020-3-13 11:44
想問下這個(gè)測體溫誤差大嗎,看資料說mlx在36到40度精度是±0.5度,醫(yī)療型號能好點(diǎn)但是太貴了,不知道實(shí)際效果怎樣,糾結(jié)
作者: 春陰釀寒    時(shí)間: 2020-6-1 13:10
原理圖能詳細(xì)一點(diǎn)嗎?有沒有大一點(diǎn)的
作者: 白曉黑    時(shí)間: 2020-9-18 21:53
材料都是什么?
作者: 黃賀駿    時(shí)間: 2020-11-25 01:23
為什么編譯不了
作者: 51hei團(tuán)團(tuán)    時(shí)間: 2020-11-25 04:15
黃賀駿 發(fā)表于 2020-11-25 01:23
為什么編譯不了

可以編譯啊 0個(gè)錯(cuò)誤呢

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

51hei.png

作者: Hzr666    時(shí)間: 2020-12-4 20:02
為什么溫度無法實(shí)時(shí)顯示
作者: 學(xué)生1    時(shí)間: 2021-2-9 16:55
內(nèi)容詳盡,設(shè)計(jì)符合當(dāng)下熱點(diǎn),做單片機(jī)設(shè)計(jì)的可以作為參考資料
作者: 123332215    時(shí)間: 2021-2-10 12:33
這個(gè)應(yīng)該用什么軟件運(yùn)行?
作者: ljfljfljf123    時(shí)間: 2021-6-12 18:44
讀不出溫度,一直是-26
作者: kzdazhuzi    時(shí)間: 2021-8-11 16:08
MLX90614可以進(jìn)行仿真嗎,為什么我在Proteus里面沒法仿真呀
作者: 王源01    時(shí)間: 2021-12-13 09:15
有全部的原理圖嗎?
作者: nb_y    時(shí)間: 2022-11-18 19:51
我有個(gè)GY-906測溫模塊的問題想跟你請教一下,可以嗎?
作者: czmmzc    時(shí)間: 2023-5-26 21:09
kzdazhuzi 發(fā)表于 2021-8-11 16:08
MLX90614可以進(jìn)行仿真嗎,為什么我在Proteus里面沒法仿真呀

確實(shí)沒有辦法仿真




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1