基于51单片机的温度控制器

 我来答
简致的单片机
2012-04-14 · 超过13用户采纳过TA的回答
知道答主
回答量:40
采纳率:100%
帮助的人:26.4万
展开全部

图片为温度控制电路图。温度到达上限时led灯亮,并停止对RT的加热,温度达到下限时led灯灭并开始对RT进行加热。A1和A2为uA741运算放大器。引脚号在图上已经标出。再给你一个单片机采集DS18B20温度的程序,用四位数码管显示的。你把DS18B20接在RT附近就可以测试出RT的温度,调节图中的滑动变阻器可改变温度的上下限。这样就能做到温度控制了。

//安装目录下的EXE文件打开后可在电脑上显示当前温度值

#include <reg52.h>

#define uchar unsigned char

#define uint unsigned int

sbit DS=P1^0;           //define interface

uint temp;             // variable of temperature

uchar flag1;            // sign of the result positive or negative

//sbit dula=P2^6;

//sbit wela=P2^7;

//unsigned char code table2[]={0x3f,0x30,0x5b,0x4f,0x66,0x6d,0x7d,

//                       0x07,0x7f,0x67/*,0x77,0x7c,0x39,0x5e,0x79,0x71*/};

//unsigned char code table1[]={0xbf,0xb0,0xdb,0xcf,0xe6,0xed,0xfd,

//                        0x87,0xff,0xe7};  

//unsigned char code table2[]={0x40,0x5e,0x24,0x21,0x13,0x09,0x08,

  //                      0x63,0x00,0x03/*,0x77,0x7c,0x39,0x5e,0x79,0x71*/};

//unsigned char code table1[]={0xc0,0xde,0xa4,0xa1,0x93,0x89,0x88,

 //                       0xe7,0x8f,0x87};

unsigned char code table5[]={0x77,0x22,0x6d,0x5d,0x1e,0x5b,0x7b,

                        0x15,0x7f,0x1f};  

unsigned char code table6[]={0xf7,0xa2,0xed,0xdd,0x9e,0xdb,0xfb,

                        0x95,0xff,0x9f};  

void delay(uint count)      //delay

{

  uint i;

  while(count)

  {

    i=200;

    while(i>0)

    i--;

    count--;

  }

}

///////功能:串口初始化,波特率9600,方式1///////

void Init_Com(void)

{

     TMOD = 0x20;

     PCON = 0x00;

     SCON = 0x50;

     TH1 = 0xFd;

     TL1 = 0xFd;

     TR1 = 1;

}

void dsreset(void)       //send reset and initialization command 18B20复位,初始化函数

{

  uint i;

  DS=0;

  i=103;

  while(i>0)i--;

  DS=1;

  i=4;

  while(i>0)i--;

}

bit tmpreadbit(void)       //read a bit  读1位数据函数

{

   uint i;

   bit dat;

   DS=0;i++;          //i++ for delay

   DS=1;i++;i++;

   dat=DS;

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

   return (dat);

}

uchar tmpread(void)   //read a byte date   读1字节函数

{

  uchar i,j,dat;

  dat=0;

  for(i=1;i<=8;i++)

  {

    j=tmpreadbit();

    dat=(j<<7)|(dat>>1);   //读出的数据最低位在最前面,这样刚好一个字节在DAT里

  }

  return(dat);

}

void tmpwritebyte(uchar dat)   //write a byte to ds18b20  向1820写一个字节数据函数

{

  uint i;

  uchar j;

  bit testb;

  for(j=1;j<=8;j++)

  {

    testb=dat&0x01;

    dat=dat>>1;

    if(testb)     //write 1

    {

      DS=0;

      i++;i++;

      DS=1;

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

    }

    else

    {

      DS=0;       //write 0

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

      DS=1;

      i++;i++;

    }

  }

}

void tmpchange(void)  //DS18B20 begin change       开始获取数据并转换

{

  dsreset();

  delay(1);

  tmpwritebyte(0xcc);  // address all drivers on bus  写跳过读ROM指令

  tmpwritebyte(0x44);  //  initiates a single temperature conversion  写温度转换指令

}   

uint tmp()               //get the temperature     读取寄存器中存储的温度数据

{

  float tt;

  uchar a,b;

  dsreset();

  delay(1);

  tmpwritebyte(0xcc);

  tmpwritebyte(0xbe);

  a=tmpread();   //读低8位

  b=tmpread();   //读高8位

  temp=b;

  temp<<=8;             //two byte  compose a int variable   两个字节组合为1个字

  temp=temp|a;

  tt=temp*0.0625;   //温度在寄存器中是12位,分辨率是0.0625

  temp=tt*10+0.5;  //乘10表示小数点后只取1位,加0.5是四折五入

  return temp;

}

void readrom()          //read the serial

{

  uchar sn1,sn2;

  dsreset();

  delay(1);

  tmpwritebyte(0x33);

  sn1=tmpread();

  sn2=tmpread();

}

void delay10ms()            //delay

  {

    uchar a,b;

    for(a=10;a>0;a--)

      for(b=60;b>0;b--);

   }

void display(uint temp) //显示程序

{

   uchar A1,A2,A2t,A3,ser;

   ser=temp/10;

   SBUF=ser;

   A1=temp/100;

   A2t=temp%100;

   A2=A2t/10;

   A3=A2t%10;

   //dula=0;

   d4=0;

   P0=table5[A1];

   delay(1);

   d4=1; //显示百位

   //dula=1;

  // dula=0;

   /*wela=0;

   P0=0x7e;

   wela=1;

   wela=0; */

    

   //dula=0;

   d3=0;

   P0=table6[A2];

   delay(1);

   d3=1; //显示十位

   //dula=1;

   //dula=0;

   /*wela=0;

   P0=0x7d;

   wela=1;

   wela=0;  */

      

   d2=0;

   P0=table5[A3];

   delay(1);

   d2=1; //显示个位

   //dula=1;

   //dula=0;

   /*P0=0x7b;

   wela=1;

   wela=0;  */

     

}

void main()

{

 uchar a;

 Init_Com();

  do

  {

    tmpchange();

   // delay(200);

for(a=1;a>0;a--)

  {   display(tmp());

  }

  }                while(1);

}

宋9527
2012-04-14
知道答主
回答量:23
采纳率:0%
帮助的人:3.6万
展开全部
haha
追问
???
追答
做任务呢,别在意
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式