你好!能不能麻烦你把1602LCD与DS18B20设计的温度报警器源程序也给我一份?
2个回答
展开全部
名称:用数码管与DS18B20设计温度报警器
**************************************************************************/
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit DQ=P3^6;
sbit D1=P1^4;
sbit D2=P1^5;
uchar code DSY_CODE[]={0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F,0X00};//共阴数码管段码及空白显示
uchar code df_Table[]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};//温度小数位对照表
uchar CurrentT=0;//当前读取的温度整数部分
uchar Temp_Value[]={0X00,0X00};//从DS18B20读取的温度值
uchar Display_Digit[]={0,0,0,0};//待显示的各温度数位
bit DS18B20_IS_OK=1;//传感器正常标志
/************************************************************************
程序名称:延时子程序
**************************************************************************/
void Delay(uint t)
{
for(;t>0;t--);
}
/************************************************************************
程序名称:初始化DS18B20;可参考DS18B20的初始化时序图读懂程序
************************************************************************/
uchar Init_DS18B20()
{
uchar status;
DQ=1;
_nop_();_nop_();//从高拉倒低
DQ=0;
Delay(50);
DQ=1;
Delay(6);
status=DQ;
Delay(45);
DQ=1;
return status; //初始化成功返回0
}
/*************************************************************************
程序名称:读一字节
*************************************************************************/
uchar ReadOneByte()
{
uchar i,dat=0;
DQ=1;_nop_();
for(i=0;i<8;i++)
{
DQ=0;dat>>=1;
DQ=1;_nop_();_nop_();
if(DQ)dat|=0X80;
Delay(6);
DQ=1;
}
return dat;
}
/*************************************************************************
程序名称:写一字节
*************************************************************************/
void WriteOneByte(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
DQ=0;
DQ=dat&0X01;
Delay(5);
DQ=1;
dat>>=1;
}
}
/*************************************************************************
程序名称:读取温度值
*************************************************************************/
void Read_Temperature()
{
if(Init_DS18B20( )==1)
DS18B20_IS_OK=0; //DS18B20故障
else
{
WriteOneByte(0XCC); //跳过序列号
WriteOneByte(0X44); //启动温度转换
Init_DS18B20();
WriteOneByte(0XCC); //跳过序列号
WriteOneByte(0XBE); //读取温度寄存器
Temp_Value[0]=ReadOneByte(); //温度低8位
Temp_Value[1]=ReadOneByte(); //温度高8位
DS18B20_IS_OK=1;
}
}
/*************************************************************************
程序名称:在数码管上显示温度
*************************************************************************/
void Display_Temperture()
{
uchar i;
uchar t=150; //延时值
uchar ng=0,np=0; //负数标识及负号显示位置
char Signed_Current_Temp;
if((Temp_Value[1]&0XF8)==0XF8) //如果为负数则取反加1,并设置负号标识及负号显示位置
{
Temp_Value[1]=~Temp_Value[1];
Temp_Value[0]=~Temp_Value[0]+1;
if(Temp_Value[0]==0X00) Temp_Value[1]++;
ng=1;np=0XF7; //默认负号显示在左边第1位
}
Display_Digit[0]=df_Table[Temp_Value[0] & 0X0F];//查表得到温度小数部分
CurrentT=((Temp_Value[0] & 0xF0)>>4)|((Temp_Value[1] & 0x07))<<4;//获取温度整数部分(高字节中的低3位与低字节中的高4位,无符号)
Signed_Current_Temp=ng? -CurrentT:CurrentT;//有符号的当前温度值
Display_Digit[3]=CurrentT/100;
Display_Digit[2]=CurrentT%100/10;
Display_Digit[1]=CurrentT%10;
if(Display_Digit[3]==0)
{
Display_Digit[3]=10;
np=0XF7;
if(Display_Digit[2]==0)
{
Display_Digit[2]=10;
np=0XFB; //调整负号位置
}
}
for(i=0;i<30;i++) //刷新显示若干时间
{
P0=DSY_CODE[Display_Digit[0]]; //小数位
P2=0XFE;Delay(t);P2=0XFF;
P0=(DSY_CODE[Display_Digit[1]])|0X80; //个位及小数点
P2=0XFD;Delay(t);P2=0XFF;
P0=DSY_CODE[Display_Digit[2]]; //十位
P2=0XFB;Delay(t);P2=0XFF;
P0=DSY_CODE[Display_Digit[3]]; //百位
P2=0XF7;Delay(t);P2=0XFF;
if(ng) //如果为负,则在调整后的位置显示
{
P0=0X40;P2=np;Delay(t);P2=0XFF;
}
}
if(CurrentT>=125)
D1=0;
else if(ng=1&&CurrentT>=55)
D2=0;
}
/*************************************************************************
主程序
*************************************************************************/
void main(void)
{
Read_Temperature();
Delay(50000);
Delay(50000);
while(1)
{
Read_Temperature();
if(DS18B20_IS_OK) Display_Temperture();
else P0=P2=0X00;
}
}
你只要稍作修改,将数码管改成用1602就可以
**************************************************************************/
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit DQ=P3^6;
sbit D1=P1^4;
sbit D2=P1^5;
uchar code DSY_CODE[]={0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F,0X00};//共阴数码管段码及空白显示
uchar code df_Table[]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};//温度小数位对照表
uchar CurrentT=0;//当前读取的温度整数部分
uchar Temp_Value[]={0X00,0X00};//从DS18B20读取的温度值
uchar Display_Digit[]={0,0,0,0};//待显示的各温度数位
bit DS18B20_IS_OK=1;//传感器正常标志
/************************************************************************
程序名称:延时子程序
**************************************************************************/
void Delay(uint t)
{
for(;t>0;t--);
}
/************************************************************************
程序名称:初始化DS18B20;可参考DS18B20的初始化时序图读懂程序
************************************************************************/
uchar Init_DS18B20()
{
uchar status;
DQ=1;
_nop_();_nop_();//从高拉倒低
DQ=0;
Delay(50);
DQ=1;
Delay(6);
status=DQ;
Delay(45);
DQ=1;
return status; //初始化成功返回0
}
/*************************************************************************
程序名称:读一字节
*************************************************************************/
uchar ReadOneByte()
{
uchar i,dat=0;
DQ=1;_nop_();
for(i=0;i<8;i++)
{
DQ=0;dat>>=1;
DQ=1;_nop_();_nop_();
if(DQ)dat|=0X80;
Delay(6);
DQ=1;
}
return dat;
}
/*************************************************************************
程序名称:写一字节
*************************************************************************/
void WriteOneByte(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
DQ=0;
DQ=dat&0X01;
Delay(5);
DQ=1;
dat>>=1;
}
}
/*************************************************************************
程序名称:读取温度值
*************************************************************************/
void Read_Temperature()
{
if(Init_DS18B20( )==1)
DS18B20_IS_OK=0; //DS18B20故障
else
{
WriteOneByte(0XCC); //跳过序列号
WriteOneByte(0X44); //启动温度转换
Init_DS18B20();
WriteOneByte(0XCC); //跳过序列号
WriteOneByte(0XBE); //读取温度寄存器
Temp_Value[0]=ReadOneByte(); //温度低8位
Temp_Value[1]=ReadOneByte(); //温度高8位
DS18B20_IS_OK=1;
}
}
/*************************************************************************
程序名称:在数码管上显示温度
*************************************************************************/
void Display_Temperture()
{
uchar i;
uchar t=150; //延时值
uchar ng=0,np=0; //负数标识及负号显示位置
char Signed_Current_Temp;
if((Temp_Value[1]&0XF8)==0XF8) //如果为负数则取反加1,并设置负号标识及负号显示位置
{
Temp_Value[1]=~Temp_Value[1];
Temp_Value[0]=~Temp_Value[0]+1;
if(Temp_Value[0]==0X00) Temp_Value[1]++;
ng=1;np=0XF7; //默认负号显示在左边第1位
}
Display_Digit[0]=df_Table[Temp_Value[0] & 0X0F];//查表得到温度小数部分
CurrentT=((Temp_Value[0] & 0xF0)>>4)|((Temp_Value[1] & 0x07))<<4;//获取温度整数部分(高字节中的低3位与低字节中的高4位,无符号)
Signed_Current_Temp=ng? -CurrentT:CurrentT;//有符号的当前温度值
Display_Digit[3]=CurrentT/100;
Display_Digit[2]=CurrentT%100/10;
Display_Digit[1]=CurrentT%10;
if(Display_Digit[3]==0)
{
Display_Digit[3]=10;
np=0XF7;
if(Display_Digit[2]==0)
{
Display_Digit[2]=10;
np=0XFB; //调整负号位置
}
}
for(i=0;i<30;i++) //刷新显示若干时间
{
P0=DSY_CODE[Display_Digit[0]]; //小数位
P2=0XFE;Delay(t);P2=0XFF;
P0=(DSY_CODE[Display_Digit[1]])|0X80; //个位及小数点
P2=0XFD;Delay(t);P2=0XFF;
P0=DSY_CODE[Display_Digit[2]]; //十位
P2=0XFB;Delay(t);P2=0XFF;
P0=DSY_CODE[Display_Digit[3]]; //百位
P2=0XF7;Delay(t);P2=0XFF;
if(ng) //如果为负,则在调整后的位置显示
{
P0=0X40;P2=np;Delay(t);P2=0XFF;
}
}
if(CurrentT>=125)
D1=0;
else if(ng=1&&CurrentT>=55)
D2=0;
}
/*************************************************************************
主程序
*************************************************************************/
void main(void)
{
Read_Temperature();
Delay(50000);
Delay(50000);
while(1)
{
Read_Temperature();
if(DS18B20_IS_OK) Display_Temperture();
else P0=P2=0X00;
}
}
你只要稍作修改,将数码管改成用1602就可以
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询