自己用制冷片做的冷热杯电路开源,源代码部分开源。

2020-01-17 19:03发布

本帖最后由 ziluobu 于 2013-8-9 17:29 编辑

设计了2板电路,多次修改、优化单片机代码。
功能特点:
一、可以加温,加温到40以上,让你在冬天不再喝冷水。
二、可以制冷,将水制冷至相对室温低16度,夏天感受冰爽的感觉。
三、可以精确恒温,制定一个温度值始终恒温到那个值,比如42度,这样冬天不管任何时候都可以喝道温温的水,尤其对有小孩的家庭实用,弄一个小奶瓶放到杯子里,随时都可以给宝宝喝到温暖的奶或水。
四、我是根据某宝 冷热杯 的功能做的,但是我的功能比他的多很多,包括通过PWM防止H桥翻转时损伤制冷片,实时温度显示,USB充电接口,逆向发电电路等。
五、本来想用制冷片的特性做热水发电,但是发现功能不实用。
六、USB接口设计反了,所以焊到背面了,大家注意。
七、电路我全部开源,代码我只开源部分,虽然不是很复杂但是我不希望我的成果被别人拿来做其它用途,可以下载我的HEX文件,也可以自己开发代码。
八、23楼有部分源代码。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
66条回答
ziluobu
2020-01-21 15:03
DS18B20部分
/**************************************
;WWW.STCMCU.COM
;Mobile:13922805190
;0755-82948412
温度传感器DS18B20测试程序
主芯片  : STC12C5A60S2 (1T)
工作频率: 12.000MHz
**************************************/
/*
#include "REG51.H"
#include "INTRINS.H"
*/
typedef unsigned char BYTE;

sbit DQ = 0xB6;                     //DS18B20的数据口位P3.6
BYTE TPH;                           //存放温度值的高字节
BYTE TPL;                           //存放温度值的低字节
BYTE TMPE;                          //存放温度高低位字节
void DelayXus(BYTE n);
void DS18B20_Reset();
void DS18B20_WriteByte(BYTE dat);
BYTE DS18B20_ReadByte();
int DS18B20_Read();
BYTE mark=0;

int DS18B20_Read()
{
    int ret;
        DS18B20_Reset();                //设备复位
    DS18B20_WriteByte(0xCC);        //跳过ROM命令
    DS18B20_WriteByte(0x44);        //开始转换命令
    while (!DQ);                    //等待转换完成

    DS18B20_Reset();                //设备复位
    DS18B20_WriteByte(0xCC);        //跳过ROM命令
    DS18B20_WriteByte(0xBE);        //读暂存存储器命令
    TPL = DS18B20_ReadByte();       //读温度低字节
    TPH = DS18B20_ReadByte();       //读温度高字节
        ret =  TPH << 8;
        ret |= TPL;
        //TMPE=TPH<<4;
        //TMPE|=TPL>>4;
        //ret=TMPE;
        /*
        if(ret<0x0fff)   //如果为正数
                   mark=0;
           else                               //如果为负数
    {
             ret=~ret+1;
        mark=1;
    }
        */
        ret=ret*(0.625);
        ret=ret/10;
        return ret;
}
/*
void main()
{
    DS18B20_Reset();                //设备复位
    DS18B20_WriteByte(0xCC);        //跳过ROM命令
    DS18B20_WriteByte(0x44);        //开始转换命令
    while (!DQ);                    //等待转换完成

    DS18B20_Reset();                //设备复位
    DS18B20_WriteByte(0xCC);        //跳过ROM命令
    DS18B20_WriteByte(0xBE);        //读暂存存储器命令
    TPL = DS18B20_ReadByte();       //读温度低字节
    TPH = DS18B20_ReadByte();       //读温度高字节

    while (1);
}
*/
/**************************************
延时X微秒(STC12C5A60S2@12M)
不同的工作环境,需要调整此函数
此延时函数是使用1T的指令周期进行计算,与传统的12T的MCU不同
**************************************/
void DelayXus(BYTE n)
{
    while (n--)
    {
        _nop_();
        _nop_();
    }
}

/**************************************
复位DS18B20,并检测设备是否存在
**************************************/
void DS18B20_Reset()
{
    CY = 1;
    while (CY)
    {
        DQ = 0;                     //送出低电平复位信号
        DelayXus(240);              //延时至少480us
        DelayXus(240);
        DQ = 1;                     //释放数据线
        DelayXus(60);               //等待60us
        CY = DQ;                    //检测存在脉冲
        DelayXus(240);              //等待设备释放数据线
        DelayXus(180);
    }
}

/**************************************
从DS18B20读1字节数据
**************************************/
BYTE DS18B20_ReadByte()
{
    BYTE i;
    BYTE dat = 0;

    for (i=0; i<8; i++)             //8位计数器
    {
        dat >>= 1;
        DQ = 0;                     //开始时间片
        DelayXus(1);                //延时等待
        DQ = 1;                     //准备接收
        DelayXus(1);                //接收延时
        if (DQ) dat |= 0x80;        //读取数据
        DelayXus(60);               //等待时间片结束
    }

    return dat;
}

/**************************************
向DS18B20写1字节数据
**************************************/
void DS18B20_WriteByte(BYTE dat)
{
    char i;

    for (i=0; i<8; i++)             //8位计数器
    {
        DQ = 0;                     //开始时间片
        DelayXus(1);                //延时等待
        dat >>= 1;                  //送出数据
        DQ = CY;
        DelayXus(60);               //等待时间片结束
        DQ = 1;                     //恢复数据线
        DelayXus(1);                //恢复延时
    }
}

一周热门 更多>