[讨论] 求毕业设计——基于单片机的(DS18B20)温度自动控制系统

zigo   2009-4-12 14:37 楼主
急啊,这个月16号就要交初稿啊。我电路图都不会画,还要做PCB板。
各位XDJM如果有资料的麻烦发给我啊。linzhao1216@163.com
谢谢!

回复评论 (6)

Re: [求助] 求毕业设计——基于单片机的(DS18B20)温度自动控制系统

可以帮你画个电路PCB图
QQ:182805442
点赞  2009-4-12 20:44

Re: [求助] 求毕业设计——基于单片机的(DS18B20)温度自动控制系统

这个挺好做的啊,自己动动手画一下!
处处留心皆学问!
点赞  2009-4-12 20:46

基于DS18B20+液晶1602构成的高精度温度计

基于DS18B20+液晶1602构成的高精度温度计





下载 基于DS18B20+液晶1602构成的高精度温度计 源程序

/**************************************************
; 伟维电子单片机工作室
;  http://www.mdizi.com
; Copyright 2009 mdizi McuStudio
; All rights Reserved
;作者:周洵名 QQ:491069539 电话:13528913615
;连线图:
; DB0---DPROT.0 DB4---DPROT.4 RS-------------P1.2
; DB1---DPROT.1 DB5---DPROT.5 RW-------------P1.3
; DB2---DPROT.2 DB6---DPROT.6 E--------------P1.4
; DB3---DPROT.3 DB7---DPROT.7 VLCD接10K可调电阻到GND*
; DQ----P1.1

;AT89S52 晶振频率为11.0592MHz 指令周期:1.085069us

本程序在:

本站的单片机学习板上调试完成: 型号:TL-SST89E、TL-AT89S51、TL-SST89H、TL-SST89A、TL-STC89C、TL-Min51

;功能说明:1602液晶显示温度程序,正负温度自动转换。
温度测量范围:-55℃~125℃;
温度测量精度:0.0625℃
显示精度: 0.0625
;********************************************************************************************/
#include "reg52.h"//头文件
#include "intrins.h"
#define uchar unsigned char//宏定义
#define uint unsigned int//宏定义

sbit RS=P1^2;//定义I/O的硬件接口
sbit RW=P1^3;
sbit E=P1^4;
sbit led_7=P1^7;//;;;LED秒闪烁
sbit DQ=P1^1;////定义I/O的硬件接口--温度

uint Temperature;//温度暂存单元
uint Negative_Temperature;//负温度暂存单元
bit Negative_sign=1;//负温度标志
unsigned long TEMP;//长整形单元


#define DPDR P0//并行数据接口定义



uchar code DispTab_1[]={'0','1','2','3','4','5','6','7','8','9',' ','-'};//1602:0-9 数字

uchar DispBuf[6]; //6字节的显示缓冲区
char char_char_1[]={" www.mdizi.com "};//定义字符串

void delay(uint z)//1ms延时
{
uchar x,x1;
for(;z>0;z--)
{
for(x=0;x<114;x++)
{
for(x1=0;x1<1;x1++);
}
}
}

void delay1(uchar x2)//经精准计算,该段程序1次延时时间为 19.53us;多次调用需要重新计算。
{
while(x2>0)
{
x2--;
}

}

void write_Directive(uchar a)//写LCD指令
{
RS=0;
RW=0;
delay(1);
E=0;
DPDR=a;
delay(1);
E=1;
delay(1);
E=0;
delay(1);
}

void write_Data(uchar a)//写LCD数据
{
RS=1;
RW=0;
delay(1);
E=0;
DPDR=a;
delay(1);
E=1;
delay(1);
E=0;
delay(1);

}

void LCD_init()//LCD初始化
{ uchar i;
delay(15);
write_Directive(0x38);
delay(5);
write_Directive(0x38);
delay(5);
write_Directive(0x38);
write_Directive(0x01);
write_Directive(0x02);//初始化后数据地址为0x80;即第一行,第一个位置
write_Directive(0x0c);//不显示光标
//write_Directive(0x0f);//显示光标
write_Directive(0x80+0x40);//第二行第一位地址

for(i=0;i<16;i++)
{
write_Data(char_char_1);//显示字符串" www.mdizi.com "
}
}

void write_Data_String()//显示时间函数
{
uchar i;
unsigned long mm;
DispBuf[0]=TEMP/1000000;//显示百位
mm=TEMP%1000000;

DispBuf[1]=mm/100000;//显示十位
mm=mm%100000;

DispBuf[2]=mm/10000;//显示个位
mm=mm%10000;

DispBuf[3]=mm/1000;//显示小数点:0.1
mm=mm%1000;

DispBuf[4]=mm/100;//显示小数点:0.01
mm=mm%100;

DispBuf[5]=mm/10;//显示小数点:0.001
DispBuf[6]=mm%10;//显示小数点:0.0001

i=DispBuf[0];//百位判断,如果为0,则消隐
if(i==0)
i=10;
else if(Negative_sign==0)//负温度判断,如果为0,则温度为负的,显示负号
i=11;

DispBuf[0]=DispTab_1;//查表,取字符
i=DispBuf[1];
DispBuf[1]=DispTab_1;
i=DispBuf[2];
DispBuf[2]=DispTab_1;
i=DispBuf[3];
DispBuf[3]=DispTab_1;
i=DispBuf[4];
DispBuf[4]=DispTab_1;
i=DispBuf[5];
DispBuf[5]=DispTab_1;
i=DispBuf[6];
DispBuf[6]=DispTab_1;


write_Directive(0x80+0x04);//第一行,第五个位置地址

write_Data(DispBuf[0]);//第一行,第五个位置

write_Data(DispBuf[1]);//第一行,第六个位置
write_Data(DispBuf[2]);//第一行,第八个位置

write_Data('.');//第一行,第七个位置

write_Data(DispBuf[3]);//第一行,第九个位置

write_Data(DispBuf[4]);//第一行,第十个位置

write_Data(DispBuf[5]);//第一行,第十一个位置
write_Data(DispBuf[6]);//第一行,第十二个位置

}

void DB18B20_init()//DB18B20复位
{
DQ=1;
delay1(1);//程序1次延时时间为 19.53us
DQ=0;
delay1(110);//程序110次延时时间为 965.71us
DQ=1;
delay1(1);//程序1次延时时间为 19.53us
while(DQ==1);
if(DQ==0)
led_7=~led_7;//led检测复位正常否,如果DB18B20存在,且正常;led闪烁。
while(DQ==0);
delay1(20);//程序20次延时时间为 197.32us

}

void write_DB18B20(uchar m1)//写DB18B20
{
uchar i,m2;

for(i=0;i<8;i++)
{
m2=m1;
m2=m2&0x01;
DQ=0;
_nop_();
DQ=1;
if(m2==0x01)
DQ=1;
else
DQ=0;
delay1(5);//程序5次延时时间为 54.25us
m1=m1>>1;
DQ=1;

}
}
read_DB18B20()//读DB18B20
{
uint temp_1;
uchar i;
for(i=0;i<16;i++)
{
temp_1=temp_1>>1;
DQ=1;
_nop_();
DQ=0;
_nop_();
DQ=1;
_nop_();
_nop_();
_nop_();
_nop_();
if(DQ==1)
temp_1=temp_1|0x8000;
//else
// temp_1=temp_1|0x0000;
delay1(5);//程序5次延时时间为 54.25us
}
return temp_1;//返回温度值
}

void Negative()//温度为零度以下时,将变换温度
{
Negative_Temperature=Temperature;
Negative_Temperature=Negative_Temperature&0xf800;
if(Negative_Temperature==0xf800)
{
Temperature=~Temperature;
Temperature=Temperature+1;
Negative_sign=0;
}
}

void main()
{

LCD_init();//LCD复位

while(1)
{
DB18B20_init();//DB18B20复位
write_DB18B20(0xcc);//写DB18B20;0xcc 跳过 ROM 指令
write_DB18B20(0x44);//写DB18B20;0x44 启动温度转换指令
delay(1000);//延时1秒
DB18B20_init();//DB18B20复位
write_DB18B20(0xcc);//写DB18B20;0xcc 跳过 ROM 指令
write_DB18B20(0xbe);//写DB18B20;0xbe 读温度指令
Temperature=read_DB18B20();//读 DB18B20 温度,读出的温度在 Temperature
Negative();//温度为零度以下时,将变换温度,否则不变
TEMP=Temperature*0.0625*10000;//转换成 十进制(*10000,表示,显示到小数点后4位:0.0000)
write_Data_String();//显示温度
}


}
点赞  2009-5-18 10:11
现在的大学生无语啦  PCB也不会画啊 电路也不知道、、。。。。
点赞  2009-5-18 16:09
题目:温度检测记录仪  用Proteus可以帮忙画个原理图么
1.        STC89C51/8 RC                 st89c51
2.        SD卡接口
3.        LCD1602液晶显示               LM016L
4.        温度LM75A                    DS18B20
5.        时钟 DS1302 电池 CR1220       DS1302
6.        Z-4按键         
邮箱:shaobing7915@gmail.com
点赞  2010-1-5 14:03

写论文主要在于会晕人,不在会做PCB

写论文主要在于会晕人,不在会做PCB.什么PID,模糊控制,非线性控制,温度分布等让人不明白的东东就写吧.
点赞  2010-1-5 14:06
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复