本帖最后由 ziluobu 于 2013-8-9 17:29 编辑
设计了2板电路,多次修改、优化单片机代码。
功能特点:
一、可以加温,加温到40以上,让你在冬天不再喝冷水。
二、可以制冷,将水制冷至相对室温低16度,夏天感受冰爽的感觉。
三、可以精确恒温,制定一个温度值始终恒温到那个值,比如42度,这样冬天不管任何时候都可以喝道温温的水,尤其对有小孩的家庭实用,弄一个小奶瓶放到杯子里,随时都可以给宝宝喝到温暖的奶或水。
四、我是根据某宝 冷热杯 的功能做的,但是我的功能比他的多很多,包括通过PWM防止H桥翻转时损伤制冷片,实时温度显示,USB充电接口,逆向发电电路等。
五、本来想用制冷片的特性做热水发电,但是发现功能不实用。
六、USB接口设计反了,所以焊到背面了,大家注意。
七、电路我全部开源,代码我只开源部分,虽然不是很复杂但是我不希望我的成果被别人拿来做其它用途,可以下载我的HEX文件,也可以自己开发代码。
八、23楼有部分源代码。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
/**************************************
;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); //恢复延时
}
}
一周热门 更多>