#include #define uchar unsigned char
#define uint unsigned int
sbit DQ=P3^6;//wendu
sbit BEEP=P3^7; //蜂鸣器驱动线
sbit HI_LED=P1^4;
sbit LO_LED=P1^5;
//共阴数码管段码及空白显示//
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};
//
//报警温度上下限,为进行正负数比较,此处注意设为char类型
//取值范围为-128——+127,DS18B20支持范围为-50——+125
//
char Alarm_Temp_HL[2]={70,-20};
//
uchar CurrentT=0;
uchar Temp_Value[]={0x00,0x00};
uchar Display_Digit[]={0,0,0,0};
bit HI_Alarm=0,LO_Alarm=0;
bit DS18B20_IS_OK=1;
uint Time0_Count=0;
//
//延时
//
void Delay(uint x)
{
while( --x );
}
//
//初始化DS18B20
//
uchar Init_DS18B20()
{
uchar status;
DQ =1; //DQ复位
Delay(8); //稍做延时
DQ =0; //单片机将DQ拉低
Delay(90); //
DQ =1; //拉高总线
Delay(8);
status=DQ; //
Delay(100);
DQ=1;
return status;
}
//
//读一字节
//
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(4);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;
else
{
WriteOneByte(0xCC); // 跳过读序号列号的操作
WriteOneByte(0x44); // 启动温度转换
Init_DS18B20();
WriteOneByte(0xCC); //跳过读序号列号的操作
WriteOneByte(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
Temp_Value[0]=ReadOneByte();
Temp_Value[1]=ReadOneByte();
Alarm_Temp_HL[0]=ReadOneByte();
Alarm_Temp_HL[1]=ReadOneByte();
DS18B20_IS_OK=1;
}
}
//
//设置DS18B20温度报警值
//
void Set_Alarm_Temp_Value()
{
Init_DS18B20();
WriteOneByte(0xCC); // 跳过读序号列号的操作
WriteOneByte(0x4E);
WriteOneByte(Alarm_Temp_HL[0]);
WriteOneByte(Alarm_Temp_HL[1]);
WriteOneByte(0x7F);
Init_DS18B20();
WriteOneByte(0xCC);
WriteOneByte(0x48);
}
//
//在数码管上显示温度
//
void Display_Temperature()
{
uchar i;
uchar t=150;
uchar ng=0,np=0;
char Signed_Current_Temp;
//如果为负数则取反加1,并设置负号标识及负号显示位置
if ((Temp_Value[1]&0xF8)==0xF8)
{
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]&0x0F)>>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;
}
}
}
//
//
//
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(void)
{
IE = 0X82;
TMOD = 0X01;
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;
}
}
}
4 系统功能测试
4.1 功能测试
4.1.1 基本功能测试
表2
题目要求
测试的结果
检测温度范围-30~-100℃
检测范围可达-10℃~+125℃
分辨率1℃
分辨率可达±0.1℃
5 总结与体会
经过将近11天的辛苦努力,终于完成了我们的数字温度计的设计,
在本次设计以AT89C52单片机为控制器,以“一线式”温度传感器DS18B20作为检测元件,完成了的电子温度计的制作。这个系统结构简单,性能稳定,可靠性高。本系统已经达到了设计的基本要求和发挥部分的要求。
在本次设计的过程中,我们遇到了许多突发事件和各种困难,但通过团队的仔细分析和自我调整后我们终于解决了所有问题,取得了圆满的成功。经过本次电子设计大赛我们对51单片机的控制功能有了更深层次的理解,同时也深刻的体会到了共同协作和团队精神的力量所在。我们在本次比赛中做到精益求精,在完成基本功能之后,又向发挥部分进发,最后完成了所有的基本功能和部分发挥部分.
从这次设计中,我们真真正正的意识到,在以后的学习中,要理论联系实际,把我们所学的理论知识用到实际当中,学习单机片机更是如此,程序只有在经常的写与读的过程中才能提高,这就是我们在这次设计中的最大收获。
参考文献
[1] 彭伟.单片机C语言程序设计实训100例.北京:电子工业出版社,2009
[2] 刘华东.单片机应用技术.北京:电子工业出版社,2009
[3] 电子发烧友网 /
14
本文发布于:2024-02-05 02:06:57,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170721600862042.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |