求求基于51单片机的数字温度计设计 单片机AT89C51 测温传感器使DS18B20 图在下面!只要c语言程序

2024-12-21 18:43:28
推荐回答(2个)
回答1:

#include

#define uint unsigned int
#define uchar unsigned char

#define Alarm_Value 30 //温度报警值

sbit rs = P2^0;
sbit lcdcs = P2^2;
sbit buzzer = P3^4; //蜂鸣器报警
sbit OUT = P3^5; //光的检测
sbit DQ = P3^7; //温度传送数据IO口
uchar TempBuffer[8];
uint temp_value; //温度值
light_flag=1; //标志位

uchar value1[]={"TempShow:"};
uchar value2[]={"LightY/N:"};
uchar value3[]={"YES"};
uchar value4[]={"NO "};

/*******************************ds18b20子程序*******/

/***********ds18b20延迟子函数(晶振12MHz )*******/

void delay_18B20(unsigned int i)
{
while(i--);
}

/**********ds18b20初始化函数***********************/

void Init_DS18B20(void)
{
unsigned char x=0;
DQ = 1;
delay_18B20(8);
DQ = 0;
delay_18B20(80);
DQ = 1;
delay_18B20(14);
x=DQ;
delay_18B20(20);
}

/***********ds18b20读一个字节**********************/

unsigned char ReadOneChar(void)
{
uchar i=0;
uchar dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; // 给脉冲信号
dat>>=1;
DQ = 1; // 给脉冲信号
if(DQ)
dat|=0x80; //先读入低字节
delay_18B20(4);
}
return(dat);
}

/*************ds18b20写一个字节********************/

void WriteOneChar(uchar dat)
{
unsigned char i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01;
delay_18B20(5);
DQ = 1;
dat>>=1;
}
}

/**************读取ds18b20当前温度****************/

void ReadTemp(void)
{
unsigned char a=0;
unsigned char b=0;
unsigned char t=0;
float tt;

Init_DS18B20();
WriteOneChar(0xCC); //Skip ROM command
WriteOneChar(0x44); //启动DS18B20进行温度转换
delay_18B20(100);

Init_DS18B20();
WriteOneChar(0xCC); //Skip ROM command
WriteOneChar(0xBE); // 读暂存器9个字节内容
delay_18B20(100);
a=ReadOneChar(); //读温度值低位
b=ReadOneChar(); //读温度值高位
temp_value=b;
temp_value<<=8;
temp_value=temp_value|a;
tt=temp_value*0.0625;
temp_value=tt*100+0.5; /*经典:处理保留几位小数(此列为2位);*/

}

/*******************温度值转换为字符串**************/

void temp_to_str()
{

TempBuffer[0]=temp_value/1000+'0'; //十位
TempBuffer[1]=temp_value%1000/100+'0'; //个位
TempBuffer[2]='.'; //小数点
TempBuffer[3]=temp_value%1000%100/10+'0'; //小数点后一位
TempBuffer[4]=temp_value%1000%100%10+'0'; //小数点后二位
TempBuffer[5]=0xdf; //温度符号
TempBuffer[6]='C';
TempBuffer[7]='\0';
}

void delay(uint ms)
{
uint i,j;
for (j=0;j for (i=0;i<120;i++);
}
Check_light()
{
if(out==0)
{
light_flag=1;
}
else
{
light_flag=0;
}
}
/**********1602显示开始 ***************************/

void write_command(uchar command)
{
rs=0;
P0=command;
lcdcs=1;
lcdcs=0;
}

void write_data(uchar data0)
{
rs=1;
P0=data0;
lcdcs=1;
lcdcs=0;
}

void init_1602()
{
delay(15);
write_command(0x38);
delay(5);
write_command(0x0c);
delay(5);
write_command(0x06);
delay(5);
}

/*****************1602显示结束 *********************
void show()
{
uchar i;
init_1602(); //初始化lcd
write_command(0x80); //液晶显示位置第一行第一个
Init_DS18B20();
ReadTemp();
temp_to_str();

for (i=0;i {
write_data(value1[i]);
delay(5);
}
for (i=0;i {
write_data(TempBuffer[i]);
delay(5);
}
write_command(0x80+0x40); //液晶显示位置 第二行第一个
delay(100);

for (i=0;i {
write_data(value2[i]);
delay(5);
}
if(light_flag== 1 )
{
for(i=0;i {
write_data(value3[i]);
delay(5);
}
}
else
{
for(i=0;i {
write_data(value4[i]);
delay(5);
}
}
}

void Temperature_Alarm() //温度报警
{
if(temp_value/100>=Alarm_Value) //取temp_value前两位
{
buzzer = 0; //不要用端口赋值
}
else
{
buzzer = 1;
}

}
/*****************主函数******************/

void main()
{
while(1)
{
show();
Temperature_Alarm();
Check_light();
}
}
我做的液晶是1602的

回答2:

只有汇编的