51单片机温度显示,并可以设置报警温度程序

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

#include
#define uint unsigned int
#define uchar unsigned char //宏定义

sbit dp=P0^7;
sbit DQ=P1^0; //定义DS18B20总线I/O
sbit SET=P3^1; //定义选择报调整警温度上限和下限(1为上限,0为下限)
sbit JING=P3^0; //定义静音按键
/****P3.2和P3.3为调整温度报警增加键和减少键******/
sbit LING=P1^7; //定义响铃
signed char m,num; //温度值全局变量
bit sign=0; //外部中断状态标志
signed char shangxian=30; //上限报警温度,默认值为30
signed char xiaxian=20; //下限报警温度,默认值为20
uchar code LEDData[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf}; //共阳极数码管段码
/*****延时子程序*****/
void Delay(uint i)
{
while( i-- );
}
/*****初始化DS18B20*****/
void Init_DS18B20(void)
{
unsigned char x=0;

DQ=1;
Delay(8); //稍做延时
DQ=0; //单片机将DQ拉低
Delay(80); //精确延时,大于480us
DQ=1; //拉高总线
Delay(14);
x=DQ; //稍做延时后,如果x=0则初始化成功,x=1则初始化失败
Delay(20);
}

/*****读一个字节*****/
unsigned char ReadOneChar(void)
{
unsigned char i=0;
unsigned char dat=0;
for (i=8;i>0;i--)
{
DQ=0; // 给脉冲信号
dat>>=1;
DQ=1; // 给脉冲信号
if(DQ)
dat|=0x80;
Delay(4);
}
return(dat);
}

/*****写一个字节*****/
void WriteOneChar(unsigned char dat)
{
unsigned char i=0;
for (i=8; i>0; i--)
{
DQ=0;
DQ=dat&0x01;
Delay(5);
DQ=1;
dat>>=1;
}
}
void Tmpchange(void) //发送温度转换命令
{
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0x44); //启动温度转换
}
/*****读取温度*****/
unsigned int ReadTemperature(void)
{
unsigned char a=0;
unsigned char b=0;
unsigned int t=0;
float tt=0;
Tmpchange();
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0xBE); //读取温度寄存器
a=ReadOneChar(); //读低8位
b=ReadOneChar(); //读高8位
t=b;
t<<=8;
t=t|a;
tt=t*0.0625;
t= tt*100+0.5; //放大10倍输出并四舍五入
return(t);
}



/*****显示开机初始化等待画面*6666*/
Disp_init()
{
P0 = 0x82; //显示6
P2=0x01; //显示第一位
Delay(200);
P0 = 0x82;
P2=0x02; //显示第二位
Delay(200);
P0 = 0x82;
P2=0x04; //显示第三位
Delay(200);
P0 = 0x82;
P2=0x08; //显示第四位
Delay(200);


}

/*****显示温度子程序*****/
Disp_Temperature() //显示温度
{
uint a,b,c,d,e;
e=ReadTemperature(); //获取温度值
a=e/1000; //计算得到十位数字
b=e/100-a*10; //计算得到个位数字
d=e%10; //计算得到小数点后两位
c=(e%100)/10; //计算得到小数点后一位
m=e/100;


if(m>sha

ngxian || melse LING=1;
if(JING==0)LING=1; //按键静音
P2=0x00;
P0 =LEDData[d]; //显示小数点后两位
P2=0x08;
Delay(300);
P2=0x00;
P0 =LEDData[c]; //显示小数点后一位
P2=0x04;
Delay(300);
P2=0x00;
P0 =LEDData[b]; //显示个位
dp=0;
P2=0x02;
Delay(300);
P2=0x00;
P0 =LEDData[a]; //显示十位
P2=0x01;
Delay(300);
P2=0x00; //关闭显示

}

disptiaozheng()
{
uchar f,g,j,k;
f=shangxian/10;
g=shangxian%10;
j=xiaxian/10;
k=xiaxian%10;
P2=0x00;
P0 =0xc0; //显示0
P2=0x01;
Delay(200);
P2=0x00;
P0 =0xc0; //显示0
P2=0x02;
Delay(200);
P2=0x00;
if(SET==1)
{
P0 =LEDData[g];
dp=0; //显示上限温度个位
}
else
{
P0 =LEDData[k];
dp=0;
}
P2=0x08;
Delay(200);
P2=0x00;
if(SET==1) P0 =LEDData[f]; //显示上限温度十位
else
{
if(f==0) P0=0x00; //不显示下限温度十位
else P0 =LEDData[j]; //显示下限温度十位
}
P2=0x04;
Delay(200);
P2=0x00; //关闭显示
Delay(20);
}




/*****外部中断0服务程序*****/
void int0(void) interrupt 0
{

EX0=0; //关外部中断0
sign=1;
if(SET==1) shangxian++;
else xiaxian++;
Delay(500);
EX0=1;
}

/*****外部中断1服务程序*****/
void int1(void) interrupt 2
{

EX1=0; //关外部中断0
sign=1;
if(SET==1) shangxian--;
else xiaxian--;
Delay(500);
EX1=1;
}

/*****主函数*****/
void main(void)
{
uint z;
IT0=1;
IT1=1;
EX0=1;
EX1=1;
EA=1;
ReadTemperature();
LING=1;
for(z=0;z<100;z++)
{
Disp_init();
}
while(1)
{
Disp_Temperature();
if(sign==1)
{
for(z=0;z<300;z++)
disptiaozheng();
sign=0;
}

}
}

相关文档
最新文档