×
单片机 > 单片机程序设计 > 详情

基于51单片机的新型冰箱温度控制器系统

发布时间:2020-06-06 发布时间:
|
0引言

    随着生活的改善,消费水平的提高。越来越多的普通居民开始使用冰箱。每年冰箱的市场额都在千万以上。随着中国电子行业的高速发展。一个个新型的企业开始计入抢夺市场的竞争中。使得供应生产商,在保证质量和顾客需要的前提下,纷纷消减陈本,制定不同的战略。目前各大冰箱控制器的生产厂家存在着更加残酷的竞争,只有把握住优质的技术,结合低廉的陈本才能为企业,迎来生存的机会。基于这种情形,我们认为现如今,在家电的低端市场,廉价实用性强的控制器为各大产品提供了巨大优势,这种优势是在竞争中无法忽略的。我们的产品追求廉价实用,节能环保,突出用户地位更加人性化,应用宽泛。

1 系统总体介绍

这是一个基于51单片机的电冰箱控制系统,通过51单片机控制其余的温控设备以及其余的扩展设备,从而达到系统预期的目的。电路简单实用,而且经济廉价,适用于很多场合。51单片机的控制也很方便简单,而且能做到控制系统的作用。

产品特色有:

人机交互式控制,必要时可根据顾客的个人意愿设置停开时间比,满足不同的需要;

成本低,手动调节部分可以控制在10元以下,主控部分在25元以下,甚至可以更低一些;

可人为控制停机,防止因为制冷剂等原因造成不停进而损坏压缩机;

防止因为断电等高压启动损坏压缩机。

2 系统硬件组成

本系统由单片机最小系统、时间控制器、液晶模块、温度采集模块以及给单片机供电的电源模块等模块组成,下面分别做详细的介绍。

2.1 单片机供电电路

单片机工作的电压是5V的直流电,所以我们要为单片机供应持续不变的直流电信号,这样才能保证单片机工作的稳定,以及单片机在处理数据上的持续性。单片机在工作时由时钟频率决定其输出波形。从市用的普通交流电出发,我们可以设计出给单片机供电的电源电路。

首先把交流电接入小型变压器,把220V的交流电变成15V的交流电,然后经过整流桥整流,滤波电路滤波,可以得到接近12V的直流电压,再经过7805的集成稳压片,就可以得到5V的直流电了。当然有时候要采用小型蓄电池作为最初的电源,我们把7805的电路另作一个模块放在一边备用。       电路图如图一: 

 

 

 

                                                        图一:稳压电路

2.2 时间控制器电路

这是一种小型的低成本时间控制器,可人为设定不同的开停比,控制冰箱开或停,模拟温控过程。电路成本低(小于10元),可靠性较高,适合于广大用户使用。该模块的电路图如图二所示:

                                            图二:时间控制器电路

此电路核心为一片555时基电路,在此构成可调占空比的无稳态多谐振荡器。由555的工作原理可知,其③脚输出电压由②、⑥脚的输入电压决定。R3、D6、RP2、R5、C3构成充电支路,当C3上的电压小于2/3Vcc(Vcc为555的工作电源电压)时,③脚输出高电平,K1释放,LED1熄灭,一旦C3上的充电电压升高至2/3Vcc时,则555内部RS触发器翻转,③脚输出低电平,K1吸合,LED1点亮,同时⑦脚内部的放电管对地导通,C3通过R4、RP1、D5支路对⑦脚放电,直到C3上的电压降至1/3Vcc时,⑦脚停止放电③脚又恢复输出高电平;此后C3又通过充电支路进行充电……周而复始。

    充电时间T1=0.693(R3+R5+RP2)C3

    放电时间T2=0.693(R4+RP1)C3

    设计中R3取16kΩ,R4取100 kΩ,R5取270 kΩ,RP1、RP2均取4.7 MΩ的电位器,C3为1000μF的低漏电铝电解电容器,则T1、T2的定时最长可达约54分钟。由于C3漏电流的存在,实际定时可达80分钟。

    电路中,RP1、RP2分别为开机调节及定时调节电位器,LED1、LED2分别定时、电源指示。R1、C1、D1~D4及C2、ZD、R2等组成简单的电容降压稳压电路,提供555时基电路及继电器K1的工作电源。开机后,电路自动进入延时启动状态,如需快速启动,可按一下轻触开关S1,则可实现快启功能。

    对于实际的电路图,C1需选用耐压大于400V的聚丙烯电容器。K1可选触点电流大于5A的高灵敏度继电器。C3应选用漏电尽可能低的电解电容器,这样生产时的一致性较好,不然时间误差会很大。

    制作完成后,一般情况无须调试。将电冰箱插入CZ上,RP1、RP2调于最小位置(均为5分钟定时),通电后LED2亮。约5分钟后,LED1熄灭、K1释放。如果实现开机时快启,只需按一下S1即可。调节RP1、RP2,即可完成不同的时间通断比,使接于CZ上的电冰箱受其控制而实现节能。

2.3 温度采集电路

我们用到的温度采集芯片是常用的DS18B20,我们用的是形如三极管封装的三脚外形,这种封装的芯片才电路连接上很是方便,三脚分别是电源端、接地端和信号端,只要分别接入电路节能正常工作。但是在用该芯片对温度采集时还得用到AD转换的芯片。我们用的是ADS1286P。在进行温度采集时我们对三个不同地点的温度分别进行采集,用AD转换芯片转换后送给单片机进行数据的分析和处理。从而再进行对其他模块进行控制。这种电路在连接和处理上都是很简单的,编程上也很便捷,适合很多场合的使用。

ADS1286P的原理图如图三:

                                                   图三:ADS1286P的原理图

ADS1286P和DS18B20的连接也很方便。作为一种AD转换的芯片,前者在使用上和其它一些AD处理芯片的应用也差不多。由于在温度采集时会涉及三个点的采集,所以两者的连接图没有画在一起。DS18B20的电路图如图四所示:

                                                        图四:温度采集电路

2.4 语音控制模块

我们用到的语音芯片是ISD1700系列的ISD1760。这种芯片的特点有:可录、放音十万次,存储内容可以断电保留一百年;可以用两种控制方式,两种录音输入方式,两种放音输出方式;可处理多达255段信息;有丰富多样的工作状态提示;多种采样频率对应多种录放时间;音质好,电压范围宽,应用灵活等。工作电压在2.4V-5.5V,最高不能超过6V,静态电流0.5-1uA,工作电流20mA。在用该芯片时可以利用独立键盘工作模式,可以用按键进行录放功能,还有快进、擦除、音量控制、直通放音和复位等功能。芯片采用的是28脚直插式封装,管脚图如图五:

                                      图五:ISD1700系列引脚图

在放音方面,也由两种模式,分别是边沿触发和电平触发模式,都由/PLAY管脚触发。芯片的擦除还可以采用单个擦出和全体擦除,在该芯片的使用上很是便捷,而且这种芯片设有控制音量大小的管脚和复位管脚以及快进管脚,都能够用按键来进行控制。在满足要求的前提下,这种芯片的性价比也相对很高,能够适应很多场合的使用。

该芯片的典型应用电路如图六所示:

                                            图六:ISD1760应用电路

2.5 单片机最小系统以及液晶显示模块

这是整个系统的核心部分,是系统工作的必要条件,也是个模块连接到一起的链接枢纽。

在单片机最小系统中,我们需要给单片机工作提供必要的条件:由外部晶振给与单片机工作的时钟频率,还应有复位电路和供电电路。单片机采用宏晶公司的STC89C51单片机,这种单片机不仅便宜,而且在使用上也很方便。它不仅在编程上便捷,在造价上也很经济实惠,而且对于像这种简单的控制也能起到很好的控制作用。整个系统都由单片机来进行控制,采集到的温度信号传给单片机进行处理,完了再对其余模块进行控制,以达到对整个系统的控制。图七就是单片机最小系统和液晶显示模块的电路图:

                                       图七:单片机最小系统+液晶电路

3 系统软件设计

系统的软件设计是针对硬件的各个方面,硬件的集成就是软件程序的集成。其中包括了温度的采集,A/D转换,液晶显示,语音报警以及自动手动的调节部分等等各个部分。

各部分程序的集合就构成了整个系统的完整程序,用51单片机来控制整个系统的实现。系统中还用到了继电器,这是一个用低电压控制高电压的元器件,能够对一些高于5V的模块进行驱动。

整个程序的设计围绕着各个模块的连接,更关键的是和主控芯片51单片机的连接。

下图是整个系统的硬件组成图,以及各个模块的连接图,从图中我们就可以看出系统软件设计的思路。如图八

                                                     图八:系统硬件组成图

    系统源程序见附录一。

4 总结

在这几个月的项目制作中,我们学到了很多的东西,也完成了这个项目。从这个项目中,我们学到了很多东西,在硬件制作和软件编程上都得到了很大的提高。整个项目的制作过程就是一个发现问题—解决问题的过程,也可以说是发现困难—解决困难的过程。在整个过程中我们遇到了很多的困难,包含在整个系统的各个方面。当我们发现困难的时候,我们会在网上找相关的资料,然后一起讨论,把困难给解决。当然很多时候,这不是一个很容易的事儿,很多东西不是那么容易就给解决的,这时候我们会从不同的方案中选择、实验,淘汰掉那些不能达到目的的方案,最后得到我们需要的方案。当然,很多时候我们还会请教实验室的学长们,他们帮助我们解决了不少问题,这样我们才能完成整个系统。

在此,感谢学校给我们这个学习和锻炼的机会,让我们能够在实践中学习,把实践和理论相结合,从而学到更多的知识。感谢孙岩老师的耐心指导与帮助,希望以后能有机会得到更大的锻炼。

 

参考文献:

【1】         郭天祥.《51单片机C语言教程》北京:电子工业出版社 2009.1

【2】         赵建领.《Protel电路设计与制版宝典》 北京:电子工业出版社 2007.1

【3】         赵建领.《51系列单片机开发宝典》北京:电子工业出版社 2008.4

【4】         张伟,孙颖,赵晶.《Protel99SE高级应用》北京:人民邮电出版社 2007.7

【5】         周润景,张丽娜.《Protel99SE原理图与印制电路板设计》北京:电子工业出版社 2008.8

【6】         戴佳,戴卫恒,刘博文.《51单片机C语言应用程序设计实例精讲》第二版北京:电子工业出版社 2008.12

【7】         虞立信,陈波,虞立工.《电冰箱模糊控制器的研制》 《家用电器科技》1997年04期

【8】         丛树松.会说话的电冰箱[J].家电科技 1983年03期

【9】         孙凤斌. 电冰箱时间控制器.中国:90217787.7 ;1991.1.30

 

附件程序:

#include

#include

#define uint unsigned int

#define uchar unsigned char

uchar bdata SR0_L;

uchar bdata SR0_H;

uchar bdata SR1;

uchar APCL=0;APCH=0;

uchar PlayAddL , PlayAddH;

uchar RecAddL,RecAddH;

uchar flag1=0;

 

sbit ds=P1^0;

 uchar id[3][8]={{40,235,18,249,1,0,0,121},{40,159,23,249,1,0,0,239},{40,205,27,155,1,0,0,25}};

 

sbit RS=P3^6;

sbit EN=P2^0;

 

 

sbit p01=P3^1;

 

sbit CMD=SR0_L^0;

sbit FULL=SR0_L^1;

sbit PU=SR0_L^2;

sbit EOM=SR0_L^3;

sbit INTT=SR0_L^4;

sbit RDY=SR1^0;

sbit ERASE=SR1^1;

sbit PLAY=SR1^2;

sbit REC=SR1^3;

 

uchar bdata flag=0;

sbit PR_flag=flag^1;//0放音,1录音

sbit Erase_flag=flag^4;

sbit Stop_flag=flag^7;

 

sbit SS=P1^1;

sbit SCK=P1^2;

sbit MOSI=P1^3;

sbit MISO=P1^4;

sbit LED=P3^0;

//sbit Key_AN=P2^1;

//sbit Key_STOP=P2^2;

//sbit Switch_PR=P2^3;

uchar ff;

 

void ISD_Init();

unsigned char ISD_SendData(unsigned char dat);

void ISD_PU(void);

void ISD_Clr_Int(void);

void ISD_Rd_Status(void);

void ISD_WR_APC2(uchar apcdatl,uchar apcdath) ;

void ISD_SET_PLAY (unsigned char Saddl,Saddh,Eaddl,Eaddh);

void delay_us(uint);

 

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

          液晶**************

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

void write_command(uchar com)

{

       RS=0;

       P0=com;

       delay_us(5);

       EN=1;

       delay_us(5);

       EN=0;

 

}

void write_data(uchar data1)

{

       RS=1;

       P0=data1;

       delay_us(5);

       EN=1;

       delay_us(5);

       EN=0;

 

}

 

void yejing_init()

{

EN=0;

 

write_command(0x38);

write_command(0x0c);

write_command(0x06);

write_command(0x01);

}

 

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

     18B20

        *************************8***/

void delay(uint t)

{

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

}

 

 

void ow_reset()

{

 bit pre=1;       //工作标志

 while(pre)

  {

    while(pre)

      {

        ds=1;

        _nop_();   //延时

        _nop_();

        ds=0;

        delay(50); //550US

        ds=1;

        delay(5);  //55US

        pre=ds;    //presence=0继续下一步

      }

    delay(45);     //500US

    pre=~ds;

  }

 ds=1;

}

 

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

//写一个字节函数

void write_byte(uchar t)

{

 uchar i;

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

  {

     ds=1;

    _nop_(); _nop_();

    ds=0;

    _nop_(); _nop_(); _nop_(); _nop_(); _nop_();//5us

    if((t&0x01)==0x01)

     {

      ds=1;

     }// DQ=t&0x01; //最低位移出

    else

     {

      ds=0;

     }

    delay(6);      //66us

    t=t>>1;        //右移1位

  }

 ds=1;

 delay(1);

}

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

//读一个字节函数

uchar read_byte()

{

 uchar i;

 uchar value=0;

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

  {

    ds=1;

    _nop_(); _nop_();

    value=value>>1;

    ds=0;

    _nop_(); _nop_(); _nop_(); _nop_();   //4us

    ds=1;

    _nop_(); _nop_(); _nop_(); _nop_();   //4us

    if(ds==1)

       {

         value=value|0x80;

       }

    delay(6);          //66us

  }

 ds=1;

 return(value);

}

uint dealwith(uchar hbit,uchar lbit)

{

    float newtemp;

    uint temp=0,inttemp=0;

    temp=hbit;

    temp=temp<<8;

    temp=temp|lbit;

       temp<<=4;

       temp>>=4;

    newtemp=temp*0.0625+0.05;

    inttemp=newtemp*10;

    return (inttemp);  

}

void display(uchar  add,uint date)

{

     uint shi,ge,sfen;

        shi=date/100;

        ge=date%100/10;

        sfen=date%10;

      

       switch(add)

       {

       case 0:write_command(0x80);      break;

       case 1:write_command(0x80+8);  break;

       case 2:write_command(0x80+0x40);    break;

       }

        if(flag1==0) write_data('+');

        else {write_data('-') ; flag1=0;}

        write_data(shi+0x30);

        write_data(ge+0x30);

        write_data('.');

        write_data(sfen+0x30);

        write_data('C');

}

//void get_id(uchar *p)

//{

//ow_reset();

 //write_byte(0x33); //Skip ROM

 //for(n=0;n<8;n++) *p++=read_byte(); //读取64位ROM ID

//}

void conver(uchar k )

{

    uchar wenh=0,wenl=0;

       uchar n;

    float tentemp;

      

//     ds=P1^0;       

 

    ow_reset();           //复位

    write_byte(0xcc);     //不进行编号匹配

    write_byte(0x44);     //进行温度转换

       while(!ds);

 

       ow_reset();

 //DQ_SendByte(0xcc); // Skip ROM

       write_byte(0x55); //发送ID匹配命令

      for(n=0;n<8;n++)  write_byte(id[k][n]); //发送64 bit ID

 

 

 //   ow_reset();          

  //  write_byte(0xcc);     //不进行编号匹配

    write_byte(0xbe);     //发读命令

    wenl=read_byte();     //温度低八位

    wenh=read_byte();     //温度高八位

      

       if(wenh>128)  flag1=1;

                             

    tentemp=dealwith(wenh,wenl);     //数据处理

    display(k,tentemp);

}

void main()

{

uchar k;

yejing_init();

delay_us(1);

ISD_Init();

while(1)

{                  

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

       {

           conver(k);

              delay_us(20);

       }    

                                  

                     //     ISD_SET_PLAY(PlayAddL,PlayAddH,RecAddL,RecAddH);

                    

 

                     /*                                do{ISD_Rd_Status();ISD_SET_PLAY(16,0,31,0);                              

                                                           }while(RDY==0);

                                                        ISD_Clr_Int();

             

                                                       

                                                         do{ISD_Rd_Status();   ISD_SET_PLAY(32,0,46,0);

                                 

                                                           }while(RDY==0);

                                                        ISD_Clr_Int();

             

 

                                                

                                                         do{ISD_Rd_Status(); ISD_SET_PLAY(47,0,62,0);                            

                                                           }while(RDY==0);

                                                        ISD_Clr_Int();

             

 

                                                         do{ISD_Rd_Status(); ISD_SET_PLAY(63,0,75,0);                            

                                                           }while(RDY==0);

                                                        ISD_Clr_Int();

             

 

                                                         do{ISD_Rd_Status();   ISD_SET_PLAY(76,0,84,0);                                   

                                                           }while(RDY==0);

                                                        ISD_Clr_Int();

             

                                                         do{ISD_Rd_Status();   ISD_SET_PLAY(85,0,97,0);

                                 

                                                           }while(RDY==0);

                                                        ISD_Clr_Int();

             

                                                

                                          //            do{ISD_Rd_Status();   ISD_SET_PLAY(68,0,72,0);

                                 

                                          //               }while(RDY==0);

                                          //            ISD_Clr_Int();

                                                         do{ISD_Rd_Status(); ISD_SET_PLAY(98,0,110,0);                            

                                                           }while(RDY==0);

                                                        ISD_Clr_Int();

 

                                                        */

}

}

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

       ISD1760子程序

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

void ISD_Init()

{

uchar i=2;

SS=1;

SCK=1;

MOSI=0;

 

do

{

ISD_PU();

delay_us(50);

ISD_Rd_Status();

}

while(CMD||(!PU));

ISD_WR_APC2(0x40,0x04);//

do

{

ISD_Rd_Status();

}

while(RDY==0);

do

{

LED=0;

delay_us(300);

LED=1;

delay_us(300);

i--;

}

while(i>0);

 

}

uchar ISD_SendData(uchar dat)

{

uchar i,j,BUF_ISD=dat;

SCK=1;

SS=0;

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

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

{

SCK=0;

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

if(BUF_ISD&0x01)MOSI=1;

       else MOSI=0;

BUF_ISD>>=1;

if(MISO)BUF_ISD|=0x80;

SCK=1;

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

}

MOSI=0;

return BUF_ISD;

}

void ISD_PU()

{

ISD_SendData(0x01);

ISD_SendData(0x00);

SS=1;

delay_us(50);

}

void ISD_Clr_Int()

{

ISD_SendData(0x04);

ISD_SendData(0x00);

SS=1;

}

void ISD_Rd_Status()

{

uchar i;

ISD_SendData(0x05);

ISD_SendData(0x00);

ISD_SendData(0x00);

SS=1;

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

SR0_L=ISD_SendData(0x05);

SR0_H=ISD_SendData(0x00);

SR1=ISD_SendData(0x00);

SS=1;

}

void ISD_WR_APC2(uchar apcdatl,uchar apcdath)

{

ISD_SendData(0x65);

ISD_SendData(apcdatl);

ISD_SendData(apcdath);

SS=1;

}

void ISD_SET_PLAY(uchar Saddl,uchar Saddh,uchar Eaddl,uchar Eaddh)

{

ISD_SendData(0x80);

ISD_SendData(0x00);

ISD_SendData(Saddl);

ISD_SendData(Saddh);

ISD_SendData(Eaddl);

ISD_SendData(Eaddh);

ISD_SendData(0x00);

SS=1;

}

void delay_us(uint aa)

{

uint i,j;

for(i=0;i

for(j=0;j<120;j++);

}




『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
ARM 汇编的必知必会