C语言温度读数不稳怎么处理,数字温度计设计报告【C语言】.doc

阅读: 评论:0

C语言温度读数不稳怎么处理,数字温度计设计报告【C语言】.doc

C语言温度读数不稳怎么处理,数字温度计设计报告【C语言】.doc

#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 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23