标题:
精确值很高的单片机数码管报警器程序
[打印本页]
作者:
jinsheng7533967
时间:
2018-12-3 14:16
标题:
精确值很高的单片机数码管报警器程序
2222.jpg
(148.22 KB, 下载次数: 13)
下载附件
2018-12-3 14:13 上传
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit DQ=P3^6;
sbit BEEP=P3^7;
sbit HI_LED=P1^4;
sbit LO_LED=P1^5;
bit HI_Alarm=0,LO_Alarm=0;
bit DS18B20_IS_OK=1;
uchar code DSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};
uchar code df_Table[]={0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9};
uchar CurrentT=0;
uchar Display_Digit[]={0,0,0,0};
uchar Temp_Value[]={0x00,0x00};
uint Time0_Count=0;
char Alarm_Temp_HL[2]={70,-20};
/***********延时程序*************/
void Delay(uint x)
{
while(--x);
}
/**********DS18B20初始化********/
uchar Init_DS18B20()
{
uchar status;
DQ=1;Delay(8);
DQ=0;Delay(90);
DQ=1;Delay(8);
status=DQ;
Delay(100);
DQ=1;
return status;
}
/**********DS18B20读字节********/
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(30); DQ=1;
}
return dat;
}
/**********DS18B20写字节********/
void WriteOneByte(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
DQ=0;DQ=dat & 0x01;Delay(5); DQ=1; dat>>=1;
}
}
/**********从DS18B20读取温度********/
void Read_Temperature()
{
if( Init_DS18B20()==1)
DS18B20_IS_OK=0;
else
{
WriteOneByte(0xCC);
WriteOneByte(0x44);
Init_DS18B20();
WriteOneByte(0xCC);
WriteOneByte(0xBE);
Temp_Value[0]=ReadOneByte();
Temp_Value[1]=ReadOneByte();
DS18B20_IS_OK=1;
}
}
/**********给DS18B20设置报警值********/
void Set_Alarm_Temp_Value()
{
Init_DS18B20();
WriteOneByte(0xcc);
WriteOneByte(0x4e);
WriteOneByte(Alarm_Temp_HL[0]); //写TH
WriteOneByte(Alarm_Temp_HL[1]); //写TL
WriteOneByte(0x7f); //12位精度
Init_DS18B20();
WriteOneByte(0xcc); //跳过序列号
WriteOneByte(0x48); //将温度报警值存入DS18B20
} /**********温度值显示******************/
void Display_Temperature() //显示温度
{
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=0xfd;
}
Display_Digit[0]=df_Table[Temp_Value[0]&0x0f];
CurrentT=((Temp_Value[0]&0xf0)>>4)|((Temp_Value[1]&0x07)<<4);
Signed_Current_Temp=ng? -CurrentT : CurrentT;
HI_Alarm= Signed_Current_Temp >= Alarm_Temp_HL[0] ? 1:0;
LO_Alarm= Signed_Current_Temp <= Alarm_Temp_HL[1] ? 1:0;
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=0xfb;
if(Display_Digit[2]==0)
{
Display_Digit[2]=10;
np=0xf7;
}
}
for(i=0;i<30;i++) //刷新数码管显示温度值
{
P0=0X39;P2=0X7F;Delay(t);P2=0XFF;
P0=0X63;P2=0XBF;Delay(t);P2=0XFF;
P0=DSY_CODE[Display_Digit[0]];
P2=0XDF;Delay(t);P2=0XFF;
P0=(DSY_CODE[Display_Digit[1]])|0X80;
P2=0XEF;Delay(t);P2=0XFF;
P0=DSY_CODE[Display_Digit[2]];
P2=0XF7;Delay(t);P2=0XFF;
P0=DSY_CODE[Display_Digit[3]];
P2=0XFB;Delay(t);P2=0XFF;
if(ng) {P0=0X40;P2=np;Delay(t);P2=0XFF;}
}
}
/**********定时器0中断控制报警声音********/
void T0_INT()interrupt 1
{
TH0=-1000/256;
TL0=-1000%256;
BEEP=!BEEP;
if(++Time0_Count==400)
{
Time0_Count=0;
if(HI_Alarm)HI_LED=~HI_LED;
else HI_LED=1;
if(LO_Alarm)LO_LED=~LO_LED;
else LO_LED=1;
}
}
void main()
{
IE=0X82;
TMOD=0X01; //方式1计数
TH0=-1000/256;
TL0=-1000%256;
TR0=0;
HI_LED=1;
LO_LED=1;
Set_Alarm_Temp_Value();
Read_Temperature();
Delay(50000); Delay(50000);
while(1)
{
Read_Temperature();
if(DS18B20_IS_OK)
{
if(HI_Alarm==1||LO_Alarm==1)TR0=1;
else TR0=0;
Display_Temperature();
}
else{P0=P2=0X00;}
}
}
复制代码
作者:
shuisheng60
时间:
2019-2-7 01:26
好样的,收下了
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1