原创 数字温度计的设计

2010-4-28 18:48 2542 16 16 分类: MCU/ 嵌入式

一.任务及功能要求<?XML:NAMESPACE PREFIX = O />


设计制作一个数字温度计,该温度计要求测温范围在-30℃~110℃,误差在±0.5℃以内,用LED数码管直读显示。


二.方案论证


    传统的测温元件有热电偶和热电阻,而它们测出的一般都是电压,再转换成对应的温度,需要比较多的外部硬件支持,电路复杂,软件调试复杂,制作成本高。所以我们改用一种智能传感器DS18B20作为检测元件,测温范围-55℃~125℃,分辨率最大可达0.0625℃。DS18B20可以直接读出被测温度值。而且采用3线制与单片机相连,减少了外部硬件电路,具有低成本和易使用的特点。


三.系统硬件电路设计


系统由3个模块组成:主控制器.测温电路和显示电路。结构框图如下所示。


点击看大图点击看大图


3.1主控制器


单片机使用AT89S52。易于调试及烧录。


3.2显示电路


  显示电路采用4位共阳LED数码管,从P1口输出段码,列扫描用P3.2~P3.5来实现,列驱动用9012三极管。


3.3系统设计电路原理图:


 


 


点击看大图


 


 


四.系统程序的设计


系统程序的设计主要包括C程序主函数.DS18B20复位函数. DS18B20写字节函数. DS18B20读字节函数.温度计算转换函数和显示函数等。


程序清单:


# include "reg51.h"


# include "intrins.h"


# define disdata P1


# define discan P3


# define uchar unsigned char


# define uint unsigned int


sbit DQ =P3^7;


sbit DIN =P1^7;


uint h;


 


uchar code ditab[16]=


{0X00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};


uchar code dis_7[12]= {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf};


uchar code scan_con[4]={0xfb,0xf7,0xef,0xdf};


uchar data temp_data[2]={0x00, 0x00,};


uchar data display[5]={0x00,0x00,0x00,0x00,0x00};


 


void delay(uint t)


{


for(;t>0;t--);


}


scan()


{


char k;


  for(k=0;k<4;k++)


  {


  disdata=dis_7[display[k]];


  if(k==1){DIN=0;}


  discan=scan_con[k];delay(90);discan=0xff;


  }


}


ow_reset(void)


{


char presence="1";


while(presence)


{


while(presence)


  {


   DQ=1;_nop_();_nop_();


   DQ=0;


   delay(50);


   DQ=1;


   delay(6);


   presence=DQ;


   }


   delay(45);


   presence =~DQ;


   }


   DQ=1;


 }


 


 void write_byte(uchar val)


 {


 uchar i;


 for(i=8;i>0;i--)


 {


 DQ=1;_nop_();_nop_();


 DQ=0;_nop_();_nop_();_nop_();_nop_();_nop_();


 DQ=val&0x01;


 delay(6);


 val=val/2;


 }


 DQ=1;


 delay(1);


 }


 


 uchar read_byte(void)


 {


 uchar i;


 uchar value="0";


 for(i=8;i>0;i--)


 {


 DQ=1;_nop_();_nop_();


 value >>=1;


 DQ=0;


 _nop_();_nop_();_nop_();_nop_();


 DQ=1;_nop_();_nop_();_nop_();_nop_();


 if (DQ)value|=0x80;


 delay(6);


 }


 DQ=1;


 return(value);


 }


 


 read_temp()


 {


 ow_reset();


 write_byte(0xcc);


 write_byte(0xbe);


 temp_data[0]=read_byte();


 temp_data[1]=read_byte();


 ow_reset();


 write_byte(0xcc);


 write_byte(0x44);


 }


 


 work_temp()


 {


 uchar n="0";


 if(temp_data[1]>127)


   {temp_data[1]=(256-temp_data[1]);


    temp_data[0]=(256-temp_data[0]);n=1;}


 display[4]=temp_data[0]&0x0f;display[0]=ditab[display[4]];


 display[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4) ;


 display[3]=display[4]/100;


 display[1]=display[4]%100;


 display[2]=display[4]/10;


 display[1]=display[4]%10;


 


 if(!display[3]){display[3]=0x0a;


 if(!display[2]){display[2]=0x0a;}}


 if(n){display[3]=0x0b;}


 }


 


 main ()


 {


 disdata=0xff;


 discan=0xff;


 for(h=0;h<4;h++){display[h]=8;}


 ow_reset();


 write_byte(0xcc);


 write_byte(0x44);


 for(h=0;h<500;h++)


   {scan();}


 while(1)


   {


   read_temp();


   work_temp();


   for(h=0;h<500;h++)


    {scan();}


    }


 }


本程序经调试通过。


五.调试及性能分析


系统调试以程序为主。硬件调试首先检查电路的焊接是否正确,然后用万用表测试或通电检测。软件调试以编程序并进行硬件的正确性检验。由于DS18B20与单片机采用串行数据传送,因此,对DS18B20进行读/写编程时必须严格地保证读/写时序,否则将无法读取测量结果。本程序采用单片机C语言编写,用Keil C51编译器编程调试。软件调试到能显示温度值,而且在有温度变化时(例如用手去接触),显示温度能改变就基本完成本设计。

文章评论0条评论)

登录后参与讨论
我要评论
0
16
关闭 站长推荐上一条 /2 下一条