永发信息网

你好!能不能麻烦你把1602LCD与DS18B20设计的温度报警器源程序也给我一份?

答案:2  悬赏:50  手机版
解决时间 2021-12-28 04:25
  • 提问者网友:凉末
  • 2021-12-28 00:02
你好!能不能麻烦你把1602LCD与DS18B20设计的温度报警器源程序也给我一份?
最佳答案
  • 五星知识达人网友:患得患失的劫
  • 2021-12-28 01:40
名称:用数码管与DS18B20设计温度报警器

**************************************************************************/
#include
#include
#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--);
}


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就可以
全部回答
  • 1楼网友:神也偏爱
  • 2021-12-28 02:03
可以。我怎么给你?
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯