基于DS18B20和AT89C51使用PROTEUS制作的仿真,使用LCD1602显示的温度监控系统.

2024-11-16 05:10:27
推荐回答(4个)
回答1:

看书:51单片机工程师是怎么炼成的

最后一章:温度自动控制系统

回答2:

这是以前做的一个程序,希望能帮到你的
#include
#include
#define data P0
#define uchar unsigned char
#define uint unsigned int
uchar TEMP; // 温度值的变量;
uchar flag1;
sbit RS=P2^0;
sbit RW=P2^1;
sbit LCDE=P2^2;
sbit DQ=P2^3;
sbit bflag=ACC^7;
uchar tab1[]={'0','1','2','3','4','5','6','7','8','9'};
uchar idata tab2[2][16]={{"Be careful "},{"temperature: "}};
uchar buf[2];
void delay1(uchar i)
{
while(--i);
}
void delay3 (unsigned int count)
{
unsigned int i;
while (count)
{
i =200;
while (i>0) i--;
count--;
}
}

void tmreset (void) // 发送复位和初始化
{
unsigned int i;
DQ = 0;
i = 103;
while (i>0) i--; // 延时
DQ = 1;
i = 4;
while (i>0) i--;
}

bit tmpread (void) // 读取数据的一位
{
unsigned int i;
bit dat;
DQ = 0; i++;
DQ = 1; i++; i++; //延时
dat =DQ;
i = 8; while (i>0) i--; // 延时
return (dat);
}

unsigned char tmpread2 (void) //读一个字节
{
unsigned char i,j,dat;
dat = 0;
for (i=1;i<=8;i++)
{
j = tmpread ();
dat = (j << 7) | (dat >> 1);
}
return (dat);
}

void tmpwrite (unsigned char dat) //写一个字节
{
unsigned int i;
unsigned char j;
bit testb;
for (j=1;j<=8;j++)
{
testb = dat & 0x01;
dat = dat >> 1;
if (testb)
{
DQ = 0; // 写0
i++; i++;
DQ = 1;
i = 8; while (i>0) i--;
}
else
{
DQ = 0; // 写0
i = 8; while (i>0) i--;
DQ = 1;
i++; i++;
}
}
}

void tmpchange(void) // ds1820 开始转换
{
tmreset (); // 复位
//tmpre (); // 等待存在脉冲
delay3 (1); // 延时
tmpwrite (0xcc); // 跳过序列号命令
tmpwrite (0x44); // 发转换命令 44H,
}

uchar tmp (void) // 读取温度
{
unsigned int a,b,t;
tmreset (); // 复位
delay3 (1); // 延时
tmpwrite (0xcc); // 跳过序列号命令
tmpwrite (0xbe);
a=tmpread2();
b=tmpread2(); // 发送读取命令
b<<=4;
b+=(a&0xf0)>>4;
t=b;
return(t);
/* buf[0] = tmpread2 (); // 读取低位温度
buf[1] = tmpread2 (); //读取高位温度
flag1=buf[1]&0xf8; //若b为1则为负温
if(flag1)
{
buf[0]=~buf[0];
buf[1]=~buf[1]; //如果为负温则去除其补码
}
buf[0]=(buf[0]>>4);
buf[0]=(buf[0]&0x0f);
buf[1]=buf[1]<<4;
buf[1]=buf[1]&0xf0;
TEMP=(buf[0]|buf[1]);
if(flag1)
{
TEMP++;
}
buf[0]=TEMP%10;
buf[1]=TEMP/10;*/
}
rom() // 读取器件序列号子程序
{
tmreset (); //复位
delay3 (1); //延时
tmpwrite(0x33); //发送读序列号子程序

}
busy_check() //忙检查询
{
register uchar lcd_start;
RS=0;
RW=1;
LCDE=1;
delay1(30);
lcd_start=data;
LCDE=0;
return(lcd_start&0x80);
}
wr_com(uchar comm) //写控制字命令
{
while(busy_check());
RS=0;
RW=0;
LCDE=1;

data=comm;
LCDE=0;
}
wr_dat(uchar dat) //写字符到LCD
{
while(busy_check());
RS=1;
RW=0;
LCDE=1;

data=dat;
LCDE=0;
}

void init() //led 初始化
{
wr_com(0x38); //设置显示模式:8位子行5×7点阵
wr_com(0x80); //关闭显示屏
wr_com(0x0c); //显示器开、光标开、光标允许闪烁
wr_com(0x06); //文字不动,光标自动右移
wr_com(0x01);//清屏光标复位
}
void display1() //温度显示函数
{
uchar j,k;
wr_com(0x80);
for(j=0;j<16;j++)
{
wr_dat(tab2[0][j]);
}
wr_com(0xc0);
for(k=0;k<16;k++)
{
wr_dat(tab2[1][k]);
}

}
void main()
{ uchar temp;
delay1(10);
init();
while(1)
{
tmpchange(); // 开始温度转
temp=tmp();
tab2[1][14]=tab1[temp/10]; //读取温度
tab2[1][15]=tab1[temp%10];
/* tab2[1][14]=tab1[buf[1]];
tab2[1][15]=tab1[buf[0]]; */
display1();
}
}

回答3:

有什么设计要求?我来帮你搞定

回答4:

我有