找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 8113|回复: 23
打印 上一主题 下一主题
收起左侧

提醒人们喝热饮的记忆杯垫制作(原理图+源代码+制作过程)

  [复制链接]
跳转到指定楼层
楼主
ID:94097 发表于 2015-10-30 15:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式


这次作品的设计初衷是源自个人的生活经验,希望和我有着一样麻烦的技术宅会喜欢这个设计。当代快节奏的工作生活中,忙忙碌碌总使得我们疲惫不堪,一杯热咖啡,一杯温水也许是现代都市人最便捷的放松方式。对于长期坐在电脑前的技术宅来说,一杯热饮除了可以补充我们必须的水分,也可以使我们适当的小憩。

笔者作为职业码农,却常常遇到这样的困扰:早上冲好的咖啡,放着放着就凉了,同事胃不好,需要喝温水,可一忙就忘记了,常常是整杯水都放凉了才想起。想必每个人都有这样的经历,这次的设计,就是给大家解决这一问题,除了可以节约水资源,还能及时提醒人们饮用热饮,喜欢喝热饮的朋友,以后不必再因为冷却的热饮而苦皱眉头了!
工作原理:
值得补充的是,这次的杯垫是用废弃的光盘制作的(无意中给华硕做广告了),中间的硬币就是导热材料,下面涂了硅脂,和DS18B20粘在一起。DS18B20就是这次设计的核心,通过感应温度、并记录温度达到提醒人们喝热饮的功能。在使用非隔热杯子的前提下(材料不限,只要不是隔热的),杯子内液体的温度势必会影响杯子表层温度,虽然我们不确定杯子表层温度的具体数值,但可以肯定的是,杯子的温度是和里面液体的温度是正比的。根据这个原理,当使用者觉得某个时刻的热饮温度刚刚好适合自己饮用时,就把杯子放到杯垫上,稍等五六秒钟,给DS18B20一点时间来升温,然后按下“记忆”键,此时杯子外部的温度就被记录到了单片机的eeprom里了,即便是断电后,此数据仍会存在。
当下次冲好了一杯咖啡,就可以把杯子放到杯垫上面了,温度传感器会将采集到的温度T值与eeprom里的数值A做比较,当A-1 < T < A+1 时,杯垫侧面的八个二极管就会闪烁,以此来提示主人喝咖啡!
温度的差值也可以根据设计者自行改变,比如在比较寒冷的地区,TA的差值可以通过改变程序来实现,我在南方,实际测试的时候发现TA的值在正负1之间就足够了。
记忆键在向单片机记录温度数据的时候,也会擦除之前的数据,这样一个按钮就可以完成杯垫的操作。
作为单片机系统来说,其实就是DS18B20eeprom的应用,国产的stc单片机大多数都自带了一定大小的eeprom,这就给设计者带来了极大的方便。为了让电路更加简洁,这次选用的是STC11F04E1T单片机,具备4K的程序存储空间和1Keeprom空间,20管脚的封装设计大大减小了PCB面积。下面就是原理图:
程序设计:
这里要做出说明的是,大多数DS18B20程序代码都是12T单片机下设计的,而1T单片机指令速度要比12T单片机快很多,这就导致了DS18B20程序不能直接拿来调用。笔者根据stc的官方资料,通过计算指令外加逻辑分析仪测试的方式,得出的结论是,11系列的1T单片机要比12T单片机指令快6.5倍左右,根据这个数据来修改原始DS18B20程序的延时程序和eeprom程序,这样就能保证系统的稳定性。
STC的官方资料很明确的给出了eeprom的原始程序,笔者根据自己的理解,对官方程序作了一些改动,为了使程序更加简洁,应用了C语言的宏定义,自己也是做了对应的库文件,方便实用。现在的程序代码略长,我整理后会补发。原理图我是用proteus画的,并不是实物中的STC11F04E单片机,但端口是通用的,只需要根据原理图对应STC11F04E单片机连线即可。程序公开情况请关注工作室腾讯微博:Chinked-out@136678431)。
制作过程:
一、准备工作
1

1、像图1中这样,给DS18B20接好导线,并做好绝缘。

2
2、利用易拉罐,剪出两个直径在3.5CM左右的圆形
3
3、准备图3中这种较厚的双面胶,五金店里都有卖,很便宜
4、根据原理图焊接好的电路板,由于电路很简单,这里我就不做过多解释了。
二、组装
4
1、像图4这样,用双面胶粘好温度传感器和一个金属原片
5
2、如图5,把刚刚步骤中的圆片粘在光盘上,注意是温度传感器在光盘中间的圆孔位置。
6
3、把光盘反过来,由于另一面已经固定好了,就可以直接涂硅脂了,可以多涂点,保证下一步的顺利
7
4、然后把四周涂有502胶水的金属圆片像图中那样粘在光盘中间(因为大多数杯子的底部都是凹进去的,所以为了增加接触面,可以用有一定厚度的金属,比如一元硬币,视频中的实物就是硬币)
8 9

待胶水干后,就可以在光盘的地面操作了,将电池盒(7号)和电路板粘在光盘上,用前文说的这种双面胶效果很好的,不仅粘的结实,还可以调整高度,保证光盘翻过来放置时是水平的。

源代码:
  1. #include "stc11fxx.h"
  2. #include "INTRINS.H"
  3. #include "basic.h"
  4. #include "STC11Fxx_IAP.H"
  5. #define Address        0x0200

  6. sbit DQ=P3^7;
  7. sbit key1 = P3^5;       
  8. sbit key2 = P3^4;
  9. sbit key3 = P3^3;              
  10. Word temp,t1,t2;                 
  11. Byte m,n,w,p;
  12. void delay(Word i);
  13. void Init_DS18B20();
  14. Byte ReadOneChar();
  15. Byte WriteOneChar(Byte dat);
  16. void tmpchange();
  17. void tmp();
  18. void display();
  19. void UartInit();
  20. void Delay500ms();
  21. void Delay150ms();
  22. void Delay50ms();
  23. void IAP_Wait ();
  24. Byte IAP_Read (Word addr);
  25. void IAP_Program (Word addr,Byte dat);
  26. void IAP_Erase (Word addr);
  27. void key();
  28. void Delay180ms();

  29. void main()
  30. {
  31.   Delay180ms();
  32. // P1=0x00;
  33.   w=IAP_Read(Address);
  34.    do
  35.    {
  36.      tmpchange();      
  37.      tmp();  
  38.          display();
  39.      P1=temp;
  40.          key();
  41.    }
  42.      while(1);
  43. }
  44. /*        延时子程序                   */  
  45. void delay(Word i)      //delay   
  46.    {
  47.       while(i--);
  48.    }  
  49. /*          初始化ds18b2子函数*                 */
  50. void Init_DS18B20()
  51.   {                                                                                
  52.      DQ = 0;               //单片机将DQ拉低
  53.      delay(390);            //精确延时 大于 480us
  54.      DQ = 1;               //拉高总线
  55.          delay(130);
  56.   }
  57. /*              读字节子函数                     */
  58. Byte ReadOneChar()
  59.   {
  60.      Byte i = 0;
  61.      Byte dat = 0;
  62.    for (i=8;i>0;i--)
  63.     {
  64.       DQ = 0;              // 给脉冲信号
  65.       dat>>=1;             // 数据右移一位
  66.       DQ = 1;              // 给脉冲信号
  67.       if(DQ)               // DQ为1
  68.       dat|=0x80;          // 读出数据
  69.       delay(45);            // 延时
  70.      }
  71.    return(dat);
  72.   }
  73. /*               写字节子函数                    */
  74. Byte WriteOneChar(Byte dat)
  75.   {
  76.     Word i = 0;
  77.     for (i=8; i>0; i--)
  78.      {
  79.        DQ = 0;
  80.        DQ = dat&0x01;   //写入一位数据
  81.        delay(45);
  82.        DQ = 1;
  83.        dat>>=1;        //右移一位数据
  84.      }
  85.          return(dat);
  86.   }
  87. /*         发送温度转换命令               */
  88. void tmpchange()          // DS18B20 begin change   
  89. {
  90.   Init_DS18B20();             // 初始化DS18B20
  91.   WriteOneChar(0xcc);         // 跳过序列号命令
  92.   WriteOneChar(0x44);         // 发送温度转换命令
  93. }
  94. /*            读出温度函数                */
  95. void tmp()                    //get the temperature
  96. {
  97.   Init_DS18B20();             // 初始化ds18b2子函数  
  98.   WriteOneChar(0xcc);         // 跳过ROM命令
  99.   WriteOneChar(0xbe);         // 发送读取数据命令
  100.   m=ReadOneChar(); // 连续读两个字节数据
  101.   n=ReadOneChar();
  102.   temp=n;
  103.   temp<<=8;                                                
  104.   temp=temp|m;     // 两字节合成一个整型变量。
  105.   temp=temp>>4;
  106. }  
  107. void Delay180ms()                //@11.0592MHz
  108. {
  109.         unsigned char i, j, k;

  110.         i = 8;
  111.         j = 145;
  112.         k = 99;
  113.         do
  114.         {
  115.                 do
  116.                 {
  117.                         while (--k);
  118.                 } while (--j);
  119.         } while (--i);
  120. }
  121. void IAP_Wait ()
  122. {
  123. IAP_CONTR = 0;
  124. IAP_CMD   = 0;
  125. IAP_TRIG  = 0;
  126. IAP_ADDRH = 0;
  127. IAP_ADDRL = 0;
  128. }
  129. Byte IAP_Read (Word addr)
  130. {
  131. Byte dat;

  132. Set_IAP_CMD(Read);                          
  133. Set_IAP_addr;
  134. Set_IAP_On;

  135. dat=IAP_DATA;

  136. IAP_Wait();

  137. return dat;
  138. }
  139. void IAP_Program (Word addr,Byte dat)
  140. {
  141.   Set_IAP_CMD(Program);
  142.   Set_IAP_addr;

  143.   IAP_DATA=dat;

  144.   Set_IAP_On;

  145.   IAP_Wait();

  146. }
  147. void IAP_Erase (Word addr)
  148. {
  149.   Set_IAP_CMD(Erase);
  150.   Set_IAP_addr;
  151.   Set_IAP_On;

  152.   IAP_Wait();

  153. }
  154. void key()
  155. {
  156.   if(key1==0)
  157.   {
  158.    Delay180ms();
  159.    if(key1==0)
  160.    {
  161.         IAP_Erase(Address);         
  162.     IAP_Program(Address,temp);  
  163.     p=IAP_Read(Address);
  164.    }
  165.   }
  166.    loop:if(key2==0)
  167.   {
  168.     p=IAP_Read(Address);
  169.         P1=p;
  170.     goto loop;
  171.   }
  172. }
  173. void display()
  174.   {
  175.   //loop2:
  176.    w=IAP_Read(Address);
  177.    tmpchange();      //温度转换
  178.    tmp();
  179.    t1=temp;
  180.    Delay150ms();
  181.    tmpchange();      //温度转换
  182.    tmp();
  183.    if(temp<t1)
  184.    {
  185.    if((w-1)<temp&&temp<(w+1))
  186.   {
  187.    loop2:
  188.    P1=0xaa;
  189.    Delay150ms();
  190.    P1=0x55;
  191.    Delay150ms();
  192.    goto loop2;
  193.   }
  194.   }
  195.   }
  196.   
  197. void Delay150ms()                //@11.0592MHz
  198. {
  199.         unsigned char i, j, k;

  200.         i = 7;
  201.         j = 78;
  202.         k = 167;
  203.         do
  204.         {
  205.                 do
  206.                 {
  207.                         while (--k);
  208.                 } while (--j);
  209.         } while (--i);
  210. }
  211. void Delay50ms()                //@11.0592MHz
  212. {
  213.         unsigned char i, j, k;

  214.         i = 3;
  215.         j = 26;
  216.         k = 223;
  217.         do
  218.         {
  219.                 do
  220.                 {
  221.                         while (--k);
  222.                 } while (--j);
  223.         } while (--i);
  224. }
复制代码

原理图与完整源代码下载: 记忆杯垫(含源代码).zip (70.19 KB, 下载次数: 172)



评分

参与人数 1黑币 +4 收起 理由
stu + 4 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏14 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:94875 发表于 2015-11-6 15:13 | 只看该作者
感谢楼主 51黑论坛有你更精彩!!!
回复

使用道具 举报

板凳
ID:74079 发表于 2015-11-9 16:07 | 只看该作者
感谢楼主
回复

使用道具 举报

地板
ID:92231 发表于 2015-11-16 11:10 来自手机 | 只看该作者
我改用stc15f104w八脚制作,体积很小,DQ3.4,key3.3,beep3.5,led3.2,试验成功,感谢楼主开源!
回复

使用道具 举报

5#
ID:92231 发表于 2015-11-16 11:13 来自手机 | 只看该作者
菜鸟一个,这段时间学习用DS18B20制作温控编程,这例子很有参考价值
回复

使用道具 举报

6#
ID:114802 发表于 2016-4-17 20:53 | 只看该作者
很好的创意,可以试着做一个
回复

使用道具 举报

7#
ID:98607 发表于 2016-4-18 19:21 | 只看该作者
谢谢分享
回复

使用道具 举报

8#
ID:118924 发表于 2016-5-6 19:24 | 只看该作者
请问这里面的74HC245的作用是什么呢
回复

使用道具 举报

9#
ID:118924 发表于 2016-5-6 19:26 | 只看该作者
请问这里的74hc245的作用是什么呢
回复

使用道具 举报

10#
ID:120112 发表于 2016-5-11 18:50 | 只看该作者

很好的创意,可以试着做一个
回复

使用道具 举报

11#
ID:118644 发表于 2016-5-13 18:49 | 只看该作者

感谢楼主分享。。
回复

使用道具 举报

12#
ID:112990 发表于 2016-5-15 17:55 | 只看该作者
感谢楼主分享。。
回复

使用道具 举报

13#
ID:379735 发表于 2018-7-27 09:59 | 只看该作者
楼主你好,
教程
回复

使用道具 举报

14#
ID:352696 发表于 2018-9-25 15:59 | 只看该作者
楼主你好,你这个可以当毕设吗
回复

使用道具 举报

15#
ID:409217 发表于 2018-10-13 21:45 | 只看该作者
很给力
回复

使用道具 举报

16#
ID:408289 发表于 2018-10-15 13:51 | 只看该作者
51黑论坛有你更精彩!!!
回复

使用道具 举报

17#
ID:425302 发表于 2018-11-12 21:19 | 只看该作者
很给力
回复

使用道具 举报

18#
ID:426341 发表于 2018-11-15 16:48 | 只看该作者
谢谢楼主,创意不错   等做完了来反馈一下
回复

使用道具 举报

19#
ID:425302 发表于 2018-12-24 17:47 | 只看该作者
楼主大大,我可以用这个当毕业设计吗,谢谢
回复

使用道具 举报

20#
ID:96470 发表于 2018-12-26 17:39 | 只看该作者
这是个好主意,学习。
回复

使用道具 举报

21#
ID:456001 发表于 2018-12-26 23:35 | 只看该作者
51黑论坛有你更精彩!!!
回复

使用道具 举报

22#
ID:472844 发表于 2019-6-8 16:55 | 只看该作者
谢谢分享
回复

使用道具 举报

23#
ID:429772 发表于 2019-6-26 14:40 | 只看该作者
感谢楼主 51黑论坛有你更精彩!!!
回复

使用道具 举报

24#
ID:673647 发表于 2023-3-10 10:05 | 只看该作者
谢谢分享,如果还带保温功能就更好了!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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