单片机温度控制系统设计方案

89C51单片机温度控制系统设计方案的具体步骤和原理图
2025-06-28 22:12:46
推荐回答(1个)
回答1:

#include 

extern GetTemp();    //声明引用外部函数

extern unsigned int  idata Temperature;               // 声明引用外部变量

void delay(unsigned int i);

//else IO

sbit    LS138A=P2^2;       //管脚定义

sbit    LS138B=P2^3;

sbit    LS138C=P2^4; 

//此表为 LED 的字模, 共阴数码管 0-9  - 

unsigned char code Disp_Tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; 

unsigned long  LedOut[5],LedNumVal;

void system_Ini()

{

    TMOD|= 0x11;

    TH1 = 0xD8;    //10

    TL1 = 0xF0;

IE = 0x8A;

    TR1  = 1;

}

main()

{ unsigned char i; 

  system_Ini();

    while(1)

   {

  GetTemp();

      /********以下将读18b20的数据送到LED数码管显示*************/

       LedNumVal=Temperature;      //把实际温度送到LedNumVal变量中

  LedOut[0]=Disp_Tab[LedNumVal%10000/1000];

      LedOut[1]=Disp_Tab[LedNumVal%1000/100];

      LedOut[2]=Disp_Tab[LedNumVal%100/10];  //十位

      LedOut[3]=Disp_Tab[LedNumVal%10];    //个位

     

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

  {

 P0 = LedOut[i] ;

         

switch(i)   

         {        //138译码

case 0:LS138A=0; LS138B=0; LS138C=0; break;         

            case 1:LS138A=1; LS138B=0; LS138C=0; break;             

            case 2:LS138A=0; LS138B=1; LS138C=0; break; 

            case 3:LS138A=1; LS138B=1; LS138C=0; break; 

         }

 

delay(100);

  }

  P0 = 0;  

  

    }

}

 //延时程序

void delay(unsigned int i)

{

    char j;

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

        for(j = 200; j > 0; j--);

}

 /*************************此部分为18B20的驱动程序*************************************/

#include 

#include 

sbit    D18B20=P3^7;

#define  NOP()   _nop_()   /* 定义空指令 */

#define  _Nop()  _nop_()   /*定义空指令*/

void TempDelay (unsigned char idata us);

void Init18b20 (void);

void WriteByte (unsigned char idata wr);  //单字节写入

void read_bytes (unsigned char idata j);

unsigned char CRC (unsigned char j);

void GemTemp (void);

void Config18b20 (void);

void ReadID (void);

void TemperatuerResult(void);

bit  flag;

unsigned int  idata Temperature;

unsigned char idata temp_buff[9]; //存储读取的字节,read scratchpad为9字节,read rom ID为8字节

unsigned char idata id_buff[8];

unsigned char idata *p,TIM;

unsigned char idata crc_data;

unsigned char code CrcTable [256]={

0,  94, 188,  226,  97,  63,  221,  131,  194,  156,  126,  32,  163,  253,  31,  65,

157,  195,  33,  127,  252,  162,  64,  30,  95,  1,  227,  189,  62,  96,  130,  220,

35,  125,  159,  193,  66,  28,  254,  160,  225,  191,  93,  3,  128,  222,  60,  98,

190,  224,  2,  92,  223,  129,  99,  61,  124,  34,  192,  158,  29,  67,  161,  255,

70,  24,  250,  164,  39,  121,  155,  197,  132,  218,  56,  102,  229,  187,  89,  7,

219,  133, 103,  57,  186,  228,  6,  88,  25,  71,  165,  251,  120,  38,  196,  154,

101,  59, 217,  135,  4,  90,  184,  230,  167,  249,  27,  69,  198,  152,  122,  36,

248,  166, 68,  26,  153,  199,  37,  123,  58,  100,  134,  216,  91,  5,  231,  185,

140,  210, 48,  110,  237,  179,  81,  15,  78,  16,  242,  172,  47,  113,  147,  205,

17,  79,  173,  243,  112,  46,  204,  146,  211,  141,  111,  49,  178,  236,  14,  80,

175,  241, 19,  77,  206,  144,  114,  44,  109,  51,  209,  143,  12,  82,  176,  238,

50,  108,  142,  208,  83,  13,  239,  177,  240,  174,  76,  18,  145,  207,  45,  115,

202,  148, 118,  40,  171,  245,  23,  73,  8,  86,  180,  234,  105,  55,  213, 139,

87,  9,  235,  181,  54,  104,  138,  212,  149,  203,  41,  119,  244,  170,  72,  22,

233,  183,  85,  11,  136,  214,  52,  106,  43,  117,  151,  201,  74,  20,  246,  168,

116,  42,  200,  150,  21,  75,  169,  247,  182,  232,  10,  84,  215,  137,  107,  53}; 

//

/************************************************************

*Function:延时处理

*parameter:

*Return:

*Modify:

*************************************************************/

void TempDelay (unsigned char idata us)

{

while(us--);

}

/************************************************************

*Function:18B20初始化

*parameter:

*Return:

*Modify:

*************************************************************/

void Init18b20 (void)

{

D18B20=1;

_nop_();

D18B20=0;

TempDelay(80);   //delay 530 uS//80

_nop_();

D18B20=1;

TempDelay(14);   //delay 100 uS//14

_nop_();

_nop_();

_nop_();

if(D18B20==0)

flag = 1;   //detect 1820 success!

else

flag = 0;    //detect 1820 fail!

TempDelay(20);       //20

_nop_();

_nop_();

D18B20 = 1;

}

/************************************************************

*Function:向18B20写入一个字节

*parameter:

*Return:

*Modify:

*************************************************************/

void WriteByte (unsigned char idata wr)  //单字节写入

{

unsigned char idata i;

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

{

D18B20 = 0;

_nop_();

D18B20=wr&0x01;

TempDelay(3);   //delay 45 uS //5

_nop_();

_nop_();

D18B20=1;

wr >>= 1;

}

}

/************************************************************

*Function:读18B20的一个字节

*parameter:

*Return:

*Modify:

*************************************************************/

unsigned char ReadByte (void)     //读取单字节

{

unsigned char idata i,u=0;

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

{

D18B20 = 0;

u >>= 1;

D18B20 = 1;

if(D18B20==1)

u |= 0x80;

TempDelay (2);

_nop_();

}

return(u);

}

/************************************************************

*Function:读18B20

*parameter:

*Return:

*Modify:

*************************************************************/

void read_bytes (unsigned char idata j)

{

 unsigned char idata i;

 for(i=0;i

 {

  *p = ReadByte();

  p++;

 }

}

/************************************************************

*Function:CRC校验

*parameter:

*Return:

*Modify:

*************************************************************/

unsigned char CRC (unsigned char j)

{

    unsigned char idata i,crc_data=0;

   for(i=0;i

     crc_data = CrcTable[crc_data^temp_buff[i]];

    return (crc_data);

}

/************************************************************

*Function:读取温度

*parameter:

*Return:

*Modify:

*************************************************************/

void GemTemp (void)

{

   read_bytes (9);

   if (CRC(9)==0) //校验正确

   {

    Temperature = temp_buff[1]*0x100 + temp_buff[0];

//     Temperature *= 0.625;

Temperature /= 16;

TempDelay(1);

    }

}

/************************************************************

*Function:内部配置

*parameter:

*Return:

*Modify:

*************************************************************/

void Config18b20 (void)  //重新配置报警限定值和分辨率

{

     Init18b20();

     WriteByte(0xcc);  //skip rom

     WriteByte(0x4e);  //write scratchpad

     WriteByte(0x19);  //上限

     WriteByte(0x1a);  //下限

     WriteByte(0x7f);     //set 11 bit (0.125)

     Init18b20();

     WriteByte(0xcc);  //skip rom

     WriteByte(0x48);  //保存设定值

     Init18b20();

     WriteByte(0xcc);  //skip rom

     WriteByte(0xb8);  //回调设定值

}

/************************************************************

*Function:读18B20ID

*parameter:

*Return:

*Modify:

*************************************************************/

void ReadID (void)//读取器件 id

{

Init18b20();

WriteByte(0x33);  //read rom

read_bytes(8);

}

/************************************************************

*Function:18B20ID全处理

*parameter:

*Return:

*Modify:

*************************************************************/

void TemperatuerResult(void)

{

   p = id_buff;

   ReadID();

   Config18b20();

Init18b20 ();

WriteByte(0xcc);   //skip rom

WriteByte(0x44);   //Temperature convert

Init18b20 ();

WriteByte(0xcc);   //skip rom

WriteByte(0xbe);   //read Temperature

p = temp_buff;

GemTemp();

}

void GetTemp()

{       

     if(TIM==100) //每隔 1000ms 读取温度

{  TIM=0;

   TemperatuerResult();

}

}

/*************************************

 [ t1 (10ms)中断] 中断

*************************************/

void T1zd(void) interrupt 3 

{

   TH1 = 0xD8;    //10

   TL1 = 0xF0;

   TIM++;

}

/*************************此部分为74HC595的驱动程序使用SPI总线连接*************************************/

#include

#include 

#define  NOP()   _nop_()   /* 定义空指令 */

#define  _Nop()  _nop_()   /*定义空指令*/

void HC595SendData(unsigned int SendVal);

//SPI IO

sbit    MOSIO =P1^5;

sbit    R_CLK =P1^6;

sbit    S_CLK =P1^7;

sbit    IN_PL =P3^4;    //74HC165  shift load   把数据加载到锁存器中

sbit    IN_Dat=P3^5;    //74HC165  output       数据移出

sbit    OE    =P3^6;

/*********************************************************************************************************

** 函数名称: HC595SendData

** 功能描述: 向SPI总线发送数据

*********************************************************************************************************/

void HC595SendData(unsigned int SendVal)

{  

  unsigned char i;

  for(i=0;i<16;i++) 

   {

if((SendVal<

else MOSIO=0;

 

S_CLK=0;

NOP();

NOP();

S_CLK=1;

   }

   

  R_CLK=0; //set dataline low

  NOP();

  NOP();

  R_CLK=1; //片选

  OE=0;

}