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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

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

  [復制鏈接]
跳轉到指定樓層
樓主
這是去年我做的一個小設計,主要是用來測量體溫。今年由于疫情影響情況特殊,就想分享一下這個設計,但是某寶找材料才發現一個問題,都漲價了,有點難受。之前也在51黑下過資料,這次把資料發上來大家一起分享學習。實物圖:
沒有涉及PCB,用的洞洞板。第一次發帖。東西做出來有點丑,大家莫見怪。

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



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

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

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

  3. #define  Nack_counter  10

  4. //************ 數據定義****************
  5. bdata uchar flag;//可位尋址數據
  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. //--------- 發送一個字節---------
  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. //-----------發送一個位---------
  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. //---------- 接收一個字節--------
  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. }
復制代碼
eeprom也比較簡單。
  1. #include "reg52.h"
  2. #include "eepom.h"






  3. /* ================ 打開 ISP,IAP 功能 ================= */
  4. void ISP_IAP_enable(void)
  5. {
  6.          EA = 0;       /* 關中斷   */
  7.          ISP_CONTR = ISP_CONTR & 0x18;       /* 0001,1000 */
  8.          ISP_CONTR = ISP_CONTR | WaitTime; /* 寫入硬件延時 */
  9.          ISP_CONTR = ISP_CONTR | 0x80;       /* ISPEN=1  */
  10. }
  11. /* =============== 關閉 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. /* ================ 公用的觸發代碼 ==================== */
  19. void ISPgoon(void)
  20. {
  21.          ISP_IAP_enable();   /* 打開 ISP,IAP 功能 */
  22.          ISP_TRIG = 0x46;  /* 觸發ISP_IAP命令字節1 */
  23.          ISP_TRIG = 0xb9;  /* 觸發ISP_IAP命令字節2 */
  24.          _nop_();
  25. }
  26. /* ==================== 字節讀 ======================== */
  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();       /* 觸發執行  */
  35.          ISP_IAP_disable();    /* 關閉ISP,IAP功能 */
  36.          EA  = 1;
  37.          return (ISP_DATA);    /* 返回讀到的數據 */
  38. }
  39. /* ================== 扇區擦除 ======================== */
  40. void SectorErase(unsigned int sector_addr)
  41. {
  42.          unsigned int iSectorAddr;
  43.          iSectorAddr = (sector_addr & 0xfe00); /* 取扇區地址 */
  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();       /* 觸發執行  */
  49.          ISP_IAP_disable();    /* 關閉ISP,IAP功能 */
  50. }
  51. /* ==================== 字節寫 ======================== */
  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;   /* 寫入數據準備 */
  61.          ISPgoon();       /* 觸發執行  */
  62.          ISP_IAP_disable();     /* 關閉IAP功能 */
  63.          EA =1;
  64. }



復制代碼

主函數主要是通過按鍵來執行相應的操作即可。
篇幅有限,文件在下面,自行下載吧。



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

評分

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

查看全部評分

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

可以編譯啊 0個錯誤呢

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

51hei.png
回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

確實沒有辦法仿真
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩欧美综合在线视频 | 在线播放中文字幕 | 男女网站视频 | 日韩在线播放中文字幕 | 欧美日韩一区二区三区四区 | 国产精品久久国产精品 | 日本成年免费网站 | 秋霞在线一区二区 | 亚洲天堂精品一区 | 成人在线免费看 | 日韩一级免费观看 | 一区二区三区国产 | 国产一区二区在线看 | 久久久久久国产精品 | 国内久久 | 亚洲高清成人在线 | 一区二区三区国产在线观看 | 日韩精品一区在线 | 日韩在线精品视频 | 亚洲一区二区三区免费观看 | av免费网| 国产在线观看 | 亚洲在线 | 国产精品一区久久久 | 成人深夜福利 | 欧美精品一区在线发布 | 精品99在线| 91精品国产综合久久香蕉麻豆 | 涩涩导航 | 秋霞a级毛片在线看 | 午夜视频在线观看网站 | 中文字幕在线观看国产 | 欧美婷婷 | 美日韩视频 | 国产成人99久久亚洲综合精品 | 亚洲精品在线视频 | 欧美不卡网站 | 99re热这里只有精品视频 | 色婷婷综合网 | 精品二区视频 | 欧美精品一区二区免费 |