找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 9118|回复: 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, 下载次数: 336)

评分

参与人数 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, 下载次数: 105)

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 单片机教程网

快速回复 返回顶部 返回列表