1.单片机的构成及功能特点解析
一台能够工作的计算机要有这样几个部份构成:CPU(进行运算、控制)、RAM(数据存储)、ROM(程序存储)、输入/输出设备(例如:串行口、并行输出口等)。在个人计算机上这些部份被分成若干块芯片,安装一个称之为主板的印刷线路板上。而在单片机中,这些部份,全部被做到一块集成电路芯片中了,所以就称为单片(单芯片)机,而且有一些单片机中除了上述部份外,还集成了其它部份如A/D,D/A等。
单片机是一种控制芯片,一个微型的计算机,而加上晶振,存储器,地址锁存器,逻辑门,七段译码器(显示器),按钮(类似键盘),扩展芯片,接口等那是单片机系统。
天!PC中的CPU一块就要卖几千块钱,这么多东西做在一起,还不得买个天价!再说这块芯片也得非常大了。
不,价格并不高,从几元人民币到几十元人民币,体积也不大,一般用40脚封装,当然功能多一些单片机也有引脚比较多的,如68引脚,功能少的只有10多个或20多个引脚,有的甚至只8只引脚。
为什么会这样呢?
功能有强弱,打个比方,市场上面有的组合音响一套才卖几百块钱,可是有的一台功放机就要卖好几千。另外这种芯片的生产量很大,技术也很成熟,51系列的单片机已经做了十几年,所以价格就低了。
既然如此,单片机的功能肯定不强,干吗要学它呢?
话不能这样说,实际工作中并不是任何需要计算机的场合都要求计算机有很高的性能,一个控制电冰箱温度的计算机难道要用PIII?应用的关键是看是否够用,是否有很好的性能价格比。所以8051出来十多年,依然没有被淘汰,还在不断的发展中。
2.液晶显示电冰箱温控器源程序 以及你想要的单片机资料宝典!!
参考程序
想要获得源代码,请关注我,并且将我的书加入到你的书架!!!
想要获得源代码,请关注我,并且将我的书加入到你的书架!!!
强烈给大家推荐 单片机资料宝典!!!
#include <AT89X51.H> //器件配置文件 #include <intrins.h> sbit LCM_RS=P3^3; //引脚定义 sbit LCM_RW=P3^4; //引脚定义 sbit LCM_EN=P3^5; //引脚定义 sbit OUT=P3^6; //控制继电器 sbit TSOR=P3^7; //温度测试端 #define Busy 0x80 //常量定义 #define uchar unsigned char #define uint unsigned int #define DATAPORT P1 #define reset() {WDT=0x1e;WDT=0xe1;}//看门狗启动/复位宏定义 sfr WDT=0xa6;//看门狗寄存器定义 bit ON_OFF; bit outflag; //============================================== uchar temp1,temp2; uchar cnt; uchar deda,sec; //时间变量 char min,hour; char set,T; uchar data buff[10]; uchar ReadStatusLCM(void);//读数据到MCU子函数声明 uchar code str0[]={"--- : : --- "};//待显字符串 uchar code str1[]={"SET: C SA: . C"}; uchar code str2[]={" "};//待显空字符串 //====================函数声明======================= void fun0(void); void fun1(void); void fun2(void); void fun3(void); void set_adj(void); void inc_key(void); void dec_key(void); void key(void); void gettempTS(void); void initTS(void); uchar readBTS(void); void writeBTS(uchar byte); void resetTS(void); bit readTS(void); void write1TS(void); void write0TS(void); void delay15us(void); void delay60us(void); //********延时K*1mS,12.000MHz********* void delay(uint k)//函数名为delay的延时子函数。定义k为无符号整型变量 { //delay函数开始 uint i,j; //定义i、j为无符号整型变量 for(i=0;i<k;i++) { //for循环语句开始 for(j=0;j<60;j++) // for循环语句开始 {;} reset()} //两个for循环体 } //delay函数结束 /*-----------------------------写指令到LCM子函数-------------------------------*/ void WriteCommandLCM(uchar WCLCM, uchar BusyC) /*函数名为WriteCommandLCM 的写指令到LCM子函数。定义WCLCM、BusyC 为无符号字符型变量*/ { //WriteCommandLCM函数开始 if(BusyC)ReadStatusLCM(); /*若BusyC为"1",则调用ReadStatusLCM子函数进行忙检测*/ DATAPORT=WCLCM; //将变量WCLCM中的指令传送至P1口 LCM_RS=0; //选中指令寄存器 LCM_RW=0; //写模式 LCM_EN=0; //置LCM_EN端为低电平 LCM_EN=0; //置LCM_EN端为低电平,延时一会儿 LCM_EN=1; //置LCM_EN端为高电平,写入使能 } // WriteCommandLCM函数结束 /*----------------------------写数据到LCM子函数-------------------------------*/ void WriteDataLCM(uchar WDLCM) /*函数名为WriteDataLCM 的写数据到LCM子函数。定义WDLCM 为无符号字符型变量*/ { // WriteDataLCM函数开始 ReadStatusLCM(); //调用ReadStatusLCM子函数检测忙信号 DATAPORT=WDLCM; //将变量WDLCM中数据传送至P1口 LCM_RS=1; //选中数据寄存器 LCM_RW=0; //写模式 LCM_EN=0; //置LCM_EN端为低电平 LCM_EN=0; //置LCM_EN端为低电平,延时一会儿 LCM_EN=1; //置LCM_EN端为高电平,写入使能 } // WriteDataLCM函数结束 /*--------------------------------读数据到MCU子函数---------------------------*/ /*uchar ReadDataLCM(void) //函数名为ReadDataLCM的读数据到MCU子函数 { // ReadDataLCM函数开始 LCM_RS=1; //选中数据寄存器 LCM_RW=1; //读模式 LCM_EN=0; //置LCM_EN端为低电平 LCM_EN=0; //置LCM_EN端为低电平,延时一会儿 LCM_EN=1; //置LCM_EN端为高电平,读使能 return(DATAPORT); //返回P1口的内容 }*/ // ReadDataLCM函数结束 /*--------------------------------读状态到MCU子函数-----------------------------*/ uchar ReadStatusLCM(void) //函数名为ReadStatusLCM的读状态到MCU子函数 { //ReadStatusLCM函数开始 DATAPORT=0xFF; //置P1口为全1 LCM_RS=0; //选中指令寄存器 LCM_RW=1; //读模式 LCM_EN=0; //置LCM_EN端为低电平 LCM_EN=0; //置LCM_EN端为低电平,延时一会儿 LCM_EN=1; //置LCM_EN端为高电平,读使能 while(P1&Busy); /*检测忙信号。当P1口内容与Busy(80H)相与后不为零时,程序原地踏步*/ return(DATAPORT); //返回P1口的内容 } // ReadStatusLCM函数结束 /*--------------------------LCM初始化子函数----------------------------*/ void InitLcd() //函数名为InitLcd 的LCM初始化子函数 { // InitLcd函数开始 WriteCommandLCM(0x38,1);//8位数据传送,2行显示,5*7字形,检测忙信号 WriteCommandLCM(0x08,1);//关闭显示,检测忙信号 WriteCommandLCM(0x01,1);//清屏,检测忙信号 WriteCommandLCM(0x06,1);//显示光标右移设置,检测忙信号 WriteCommandLCM(0x0c,1);//显示屏打开,光标不显示、不闪烁,检测忙信号 } // InitLcd函数结束 /*-------------------显示指定座标的一个字符子函数---------------------------*/ /*显示指定座标的一个字符(X=0~15,Y=0~1)子函数,函数名为DisplayOneChar,定义X、Y、DData为无符号字符型变量*/ void DisplayOneChar(uchar X,uchar Y,uchar DData) { // DisplayOneChar 函数开始 Y&=1; //Y的变化范围0~1 X&=15; // X的变化范围0~15 if(Y)X|=0x40; //若Y为1(显示第二行),地址码+0x40 X|=0x80; //指令码为地址码+0x80 WriteCommandLCM(X,0); //将指令X写入LCM,忽略忙信号检测 WriteDataLCM(DData); //再将数据Ddata写入LCM } // DisplayOneChar 函数结束 /*--------------------显示指定座标的一串字符子函数----------------------*/ /*显示指定座标的一串字符(X=0~15,Y=0~1)子函数,函数名为DisplayListChar ,定义X、Y为无符号字符型变量,DData 为指向code区的无符号字符型指针变量*/ void DisplayListChar(uchar X,uchar Y,uchar code *DData) { // DisplayListChar 函数开始 uchar ListLength=0; //定义ListLength 为无符号字符型变量,并赋初值为0 Y&=0x1; // Y的变化范围0~1 X&=0xF; // X的变化范围0~15 while(X<=15) //X<=15时进入while语句循环 { //while语句开始 DisplayOneChar(X,Y,DData[ListLength]);//显示单个字符 ListLength++; //数组指针递增 X++; //X轴座标递增 } //while语句结束 } //DisplayListChar 函数结束 //================================================= void init_timer0(void) //定时器T0初始化 { TMOD=0x01; TH0=-(50235/256); TL0=-(50235%256); TR0=1; ET0=1;EA=1; } //================================================== void time_zd0(void) interrupt 1 using 1 //定时器T0中断子函数 { TH0=-(50235/256); TL0=-(50235%256); deda++;cnt++; if(deda>=20){sec++;deda=0;} if(sec>=60){min++;sec=0;} if(min>=60){hour++;min=0;} if(hour>=24){hour=0;} if(cnt>=6)cnt=0; key(); //扫描键盘 } //================================== void fun0(void) //液晶显示子函数0 { WriteCommandLCM(0x0c,1);//显示屏打开,光标不显示、不闪烁,检测忙信号 DisplayListChar(0,0,str0); DisplayListChar(0,1,str1); //=============================== DisplayOneChar(3,0,hour/10+0x30); DisplayOneChar(4,0,hour%10+0x30); //========================= DisplayOneChar(6,0,min/10+0x30); DisplayOneChar(7,0,min%10+0x30); //============================== DisplayOneChar(9,0,sec/10+0x30); DisplayOneChar(10,0,sec%10+0x30); //================================= DisplayOneChar(4,1,T/10+0x30); DisplayOneChar(5,1,T%10+0x30); //================================= DisplayOneChar(11,1,temp1/10+0x30); DisplayOneChar(12,1,temp1%10+0x30); DisplayOneChar(14,1,temp2+0x30); //================================ if(ON_OFF==0) { DisplayOneChar(14,0,0x4f); DisplayOneChar(15,0,0x46); } else { DisplayOneChar(14,0,0x4f); DisplayOneChar(15,0,0x4e); if(outflag==1)DisplayOneChar(0,0,0x7c); else DisplayOneChar(0,0,0xef); } //============================ } /*******************************************/ void fun1(void) //液晶显示子函数1 { WriteCommandLCM(0x0c,1);//显示屏打开,光标不显示、不闪烁,检测忙信号 DisplayListChar(0,0,str0); DisplayListChar(0,1,str1); //========================= DisplayOneChar(6,0,min/10+0x30); DisplayOneChar(7,0,min%10+0x30); //============================== DisplayOneChar(9,0,sec/10+0x30); DisplayOneChar(10,0,sec%10+0x30); //================================= DisplayOneChar(4,1,T/10+0x30); DisplayOneChar(5,1,T%10+0x30); //================================= DisplayOneChar(11,1,temp1/10+0x30); DisplayOneChar(12,1,temp1%10+0x30); DisplayOneChar(14,1,temp2+0x30); //================================= WriteCommandLCM(0x0f,1);//显示屏打开,光标显示、闪烁,检测忙信号 DisplayOneChar(3,0,hour/10+0x30); DisplayOneChar(4,0,hour%10+0x30); } /********************************************/ void fun2(void) //液晶显示子函数2 { WriteCommandLCM(0x0c,1);//显示屏打开,光标不显示、不闪烁,检测忙信号 DisplayListChar(0,0,str0); DisplayListChar(0,1,str1); //========================= DisplayOneChar(3,0,hour/10+0x30); DisplayOneChar(4,0,hour%10+0x30); //================================= DisplayOneChar(9,0,sec/10+0x30); DisplayOneChar(10,0,sec%10+0x30); //================================= DisplayOneChar(4,1,T/10+0x30); DisplayOneChar(5,1,T%10+0x30); //================================= DisplayOneChar(11,1,temp1/10+0x30); DisplayOneChar(12,1,temp1%10+0x30); DisplayOneChar(14,1,temp2+0x30); //=================================== WriteCommandLCM(0x0f,1);//显示屏打开,光标显示、闪烁,检测忙信号 DisplayOneChar(6,0,min/10+0x30); DisplayOneChar(7,0,min%10+0x30); } /***************************************/ void fun3(void) //液晶显示子函数3 { WriteCommandLCM(0x0c,1);//显示屏打开,光标不显示、不闪烁,检测忙信号 DisplayListChar(0,0,str0); DisplayListChar(0,1,str1); //========================= DisplayOneChar(3,0,hour/10+0x30); DisplayOneChar(4,0,hour%10+0x30); //=============================== DisplayOneChar(6,0,min/10+0x30); DisplayOneChar(7,0,min%10+0x30); //================================= DisplayOneChar(9,0,sec/10+0x30); DisplayOneChar(10,0,sec%10+0x30); //================================= DisplayOneChar(11,1,temp1/10+0x30); DisplayOneChar(12,1,temp1%10+0x30); DisplayOneChar(14,1,temp2+0x30); //================================= WriteCommandLCM(0x0f,1);//显示屏打开,光标显示、闪烁,检测忙信号 DisplayOneChar(4,1,T/10+0x30); DisplayOneChar(5,1,T%10+0x30); } /************************************/ void key(void) //扫描键盘 {uchar xx; P2=0xff; if(P2!=0xff) {delay(10); if(P2!=0xff) {xx=P2; switch(xx) { case 0xfe:set_adj();break; case 0xfd:inc_key();break; case 0xfb:dec_key();break; case 0xf7:ON_OFF=!ON_OFF;break; default:break; } } } } /************************************/ void set_adj(void) //设定工作模式子函数 { if(cnt==5) {set++; if(set>=4)set=0; } } /***************************************/ void inc_key(void) //按键加法子函数 { if(cnt==5) { switch(set) { case 0:if(P2==0xf7)ON_OFF=!ON_OFF;break; case 1:hour++;if(hour>=23)hour=23;break; case 2:min++;if(min>=59)min=59;break; case 3:T++;if(T>=99)T=99; break; default:break; } } } /***************************************/ void dec_key(void) //按键减法子函数 { if(cnt==5) { switch(set) { case 0:if(P2==0xf7)ON_OFF=!ON_OFF;break; case 1:hour--;if(hour<=0)hour=0;break; case 2:min--;if(min<=0)min=0;break; case 3:T--;if(T<=1)T=1;break; default:break; } } } /***************************************/ /*****************************************/ void delay15us(void) //延时15微秒子函数 { uchar i; for(i=0;i<4;i++); } //************************************************* void delay60us(void) 延时60微秒子函数 { uchar i; for(i=0;i<15;i++); } //*************************************************** void write0TS(void) //write bit0 { TSOR=1; TSOR=0; delay15us();delay15us();delay15us();delay15us(); TSOR=1; _nop_(); _nop_(); } //******************************************************** void write1TS(void) //write bit1 { TSOR=1; TSOR=0; _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); TSOR=1; _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); delay15us();delay15us();delay15us(); } //****************************** bit readTS(void) //read databit { bit b; TSOR=1; TSOR=0; _nop_();_nop_();_nop_();_nop_(); TSOR=1; _nop_();_nop_();_nop_();_nop_();_nop_(); b=TSOR; delay15us();delay15us();delay15us(); _nop_();_nop_(); return b; } //************************************* void resetTS(void) //reset databit {uchar i; TSOR=1; TSOR=0; for(i=0;i<8;i++)delay60us(); TSOR=1; while(TSOR); for(i=0;i<8;i++)delay60us(); } //*************************************** void writeBTS(uchar byte) //write one byte {uchar i; for(i=0;i<8;i++) { if(byte&0x01) write1TS(); else write0TS(); byte=byte>>1; } } //**************************************** uchar readBTS(void) //read one byte {uchar i,j; bit b; j=0; for(i=0;i<8;i++) { b=readTS(); if(b)j+=1; j=_cror_(j,1); } return j; } //************************************************ void initTS(void) //初始化DS18B20 { resetTS(); writeBTS(0xcc); writeBTS(0x4e); writeBTS(0x64); writeBTS(0x8a); writeBTS(0x1f); } //****************************************************** void gettempTS(void) //读取测得的环境温度 { resetTS(); writeBTS(0xcc); writeBTS(0x44); delay(200); resetTS(); writeBTS(0xcc); writeBTS(0xbe); temp2=readBTS(); temp1=readBTS(); readBTS();readBTS();readBTS();readBTS(); readBTS();readBTS();readBTS(); temp1=temp1<<4; temp1+=(temp2&0xf0)>>4; temp2=(temp2&0x0f)?5:0; } //********主函数********* void main(void) { delay(500); //延时500ms,等电源稳定 InitLcd(); //LCM初始化 init_timer0(); DisplayListChar(0,0,str0); DisplayListChar(0,1,str1); initTS(); reset() for(;;) { //======================== switch(set) //LCD根据工作模式进行显示 { case 0:fun0();break; case 1:fun1();break; case 2:fun2();break; case 3:fun3();break; default:break; } delay(300); gettempTS(); //读取测得的环境温度 if(ON_OFF==1) //控制压缩机动作 { if(temp1>=T+1){delay(1000); if(temp1>=T+1){outflag=1;OUT=0;} } if(temp1<T){delay(1000); if(temp1<T){outflag=0;OUT=1;} } } else {outflag=0;OUT=1;} }
3.如何解决PIC单片机硬件死锁的问题
1、频繁插拔电时,PIC单片机容易死机。用一个10K电阻并在LM7805的5V输出端到地。
2、单片机的复位端的电容不能太大。
使用PIC单片机去设计工控电路,最头痛的问题,就是 PIC 单片机在受干扰后经常硬件死锁,大部份人归咎于“CMOS的可控硅效应” 因而产生死锁现象,一般都认为“死锁后硬件复位都是无效的,只有断电”。但是一个成熟的商品,那须要你去断电呢? 就好像一台电冰箱,压缩机一启动,产生干扰, CPU 受干扰因而‘硬件死锁’,死机在那儿,假如发现了,可以马上拔掉电源插头,隔几秒再插回,如此的动作可以接受吗? 假如死机时没发现,死机几十天,你猜它会如何呢? 应该是供给CPU电源的稳压IC烧毁了。
PIC单片机为什么会硬件死锁,PIC单片机在受干扰后经常硬件死锁,那么PIC要‘看门狗’有何用,有没有人深入去探讨其原因,在各 PIC 单片机论坛也提得很多,各有各的观点,总具体的原因不外是“CMOS的可控硅效应”而产生死锁现象, 依我各人的观点,应与 “CMOS的可控硅效应”无关,但很多大虾皆认为是“CMOS的可控硅效应”所引起的,所以一直以来我也不方便提出,说不定是我的观点错误,提出来反而误了大家,但至今,针对PIC 单片机产生死锁现象,都还没有详细的原因说明及对应之道,在别的PIC 单片机论坛也还在提此问题,我就将本人找寻PIC ‘死锁现象’的经过提供大家参考。
许久年前,PIC16C5x刚出产一两年,(PICxxxx 原先只有165x,属于NMOS结构,大量用于通用-GI的选台器、有线电视解锁器,后来改为CMOS结构,更名为16C5x),当时只有 16C54、55、56、57 四个型号,仿真器只有顶尖公司制造的 16C5x DOS版仿真器(第一代),它也是 Microchip 第一个OEM仿真器厂。16C5x 当年为最省电的OTP、QTP 单片机,价格又比其它的单片机便宜,只是它很容易受干扰死机,很多大厂不敢使用它。有一天,有位朋友要我兼差帮他们公司设计汽车防盗器,当时市场上的汽车防盗器都还用CD40xx的逻辑电路去设计,各个时控都须一组RC电路,电路板上十几个IC(加上遥控解码IC),至少有7~8个VR,调整时非常复杂,当时我就以一个16C55+一个ULN2003+一个解码IC (当时技术未成熟,还没用PIC程序解码,后期的已将解码IC省略),总计三个IC就解决,电路方面有某些是依书本上的电路移植过来(重置电路也由一本 PIC 应用的书本移植过来),样品出来后,当时对方存着很多疑问,电路怎么这样简单,同时间内有4、5个‘计时器’在计时,又要做那么多的I/O侦测工作,时控能准确吗? 性能如何呢? 稳定性? 。..。..。 总体而言, CPU所设计的电路, 对于功能-绝对是比逻辑电路所设计的好太多了,时控的准确性-我为它保证所有的时控误差在1%之内, 至于稳定性----当时的样品时常当机、死机,CPU 发烫,也就是大家所谈的PIC的硬件死锁。
为了此问题(大家最怕的问题),找遍所有的资料,都毫无所获,在PIC的书上都没有看到类似讯息,只好自己单打独斗的去奋斗、去找原因。我花了几天的时间,模拟了各种状况,做了各式各样的实验,制造各种干扰,用示波器测量各点所发生的异常波形。
其中一个简单的实验,(/MCLR 的接脚上,接一个提升电阻至 V+,接一个 0.1uf至地,接一个按键开关至地),让我得到一个我所需要的答案,实验时我多次的按按键开关,应该只是重置而已,但很容易进入所谓的‘硬件死锁’,连续测试,都会重覆发生,机率非常高,最后得到一个答案,PIC晶片的MCLR硬件设计有问题,与其他I/O脚无关联,不是 I/O 脚受干扰, 而是/MCLR 在重置或受干扰时,/MCLR 脚会产生一个振荡信号,当/MCLR 脚的外部接有电容时,它就永在发振,而PIC晶片内部某种硬件原因,导致于VDD与VSS之间产生很大的电流,所以VDD与VSS像短路一样,CPU因而发烫,当把电容移开后, CPU就重新工作,耗电流也就恢复正常了,所以我就认为PIC它不是硬件死锁 ,它没CMOS的可控硅效应,可能是大家还没找出原因,而怀疑是PIC内部CMOS的可控硅效应。而此问题解决方式,我当时也反应给Microchip公司反应,之后Microchip晶片内部有无修改就不得而知。
4.冰箱有强制对流风扇及单片机控制电路的电气系统分析
一、含有强制对流风扇电路的电气系统
间冷式电冰箱靠风扇强制箱内空气对流进行热交换,所以它的电气系统中增加了对流风扇电动机。对流风扇电动机与压缩机电动机并联,当箱门关闭时,风扇电动机与压缩机电动机同步运转,并在温控器断开时,风扇停转,箱内处于保温状态。当箱门打开时,风扇也停止运转,以避免箱内冷空气与外界热空气快速对流而损失冷气。
二、含有单片机控制电路的电气系统
这是华菱BCD-320W型间冷式电冰箱的电气系统,该系统由单片机控制电路构成。单片机型号为MC68HC05,整个控制电路由电源电路、温度检测电路和运行控制电路组成。
1、电源部分
它主要是给单片机控制电路提供直流工作电压的。
2、温度检测电路
电路利用热敏电阻把温度变化转化成电信号,再把这个温 度信号输入单片机,由单片机对电冰箱制冷系统进行相应的控制。电路中的热敏电阻又被称为感温头。
电冰箱冷冻室和冷藏室的温度范围分别由电位器W21、W22设定。冷冻室的“弱”、“中”、“强”三挡,分别对应的温度范围是-20〜-18°C、-22〜-20°C、-22〜-24°C。冷藏室的 “弱”、"中”、"强”三挡,分别对应的温度范围是7〜9°C、5〜7°C、3〜5°C单片机以此作为判断条件,对冷冻室和冷藏室感温头热输入的温度信号进行判断,并输出相应的控制电平。
3、运行控制电路
单片机最终要通过电冰箱的运行控制电路,才能对压缩机电动机、风门电动机、化霜加热器进行控制。该系统的运行控制部分主要由単片机、三极管VT2〜VT4、继电器J1、J2、J3等元件组成,它们决定了电冰箱的运行状态。单片机的20脚、25脚、26脚输出的高低电平,分别使VT2、VT3、VT4导通或截止。当VT2、VT3、VT4导通时,J1、J2、J3有很大的电流流过, 开关K1、K2、K3被吸合,相应的电动机运转;当VT2、VT3, VT4截止时,流过J1、J2、J3 的电流为零,开关K1、K2、K3断开,相应的电动机停转。下面根据具体电路进行详细分析。
当冷藏室温度高过设定值,而此时冷藏室风门又处于关闭状态时,冷藏室感温头把温度信号输入单片机23脚。单片机经判断处理后,从20脚、25脚输出高电平,使BG2、BG3导通,接通继电器线圈J1、J2,开关K1、K2吸合。K1吸合后,风门电动机开始运转,冷藏室风门打开。当风门打开到位时,风门位置开关接通,经接头CN2的6脚向单片机30脚发送一个开关脉冲信号,单片机接到信号后,从20脚输出低电平,使BG2截止,继电器线圈J1断开,K1断开, 风门电动机停止运转,完成打开风门的动作。K2吸合后,压缩机电动机运转制冷,冷冻室风扇运转,强制空气对流。此时,电冰箱冷藏室和冷冻室均开始降温。
当冷藏室温度降到设定值,而冷冻室尚未降到设定值时,单片机继续使压缩机运转,同时从20脚输出高电平,使冷藏室风门关闭。此时压缩机继续运转,冷冻室继续降温,冷藏室因风门关闭而停止降温。
当冷冻室温度也降到设定值时,单片机断开K2,使压缩机停止运转,电冰箱停止制冷。
单片机内部的计时器,累计冷冻室温度低于-3°C时压缩机的运转时间。当压缩机的运转 时间累计达到12小时后,单片机断开K2,关闭压缩机。同时从26脚输出高电平,使BG4导通, 接通K3,化霜加热器通电,对冷冻室内的蒸发器进行加热化霜。
化霜感温头紧贴着安装在蒸发器出口的位置,它及时把蒸发器温度转化成电信号,通过运算放大器(LM324)比较运算,输出误差电压送至单片机29脚。当蒸发器温度达到6°C左右 时,单片机根据29脚输入的误差电压做出判断,并从26脚输出低电平,使BG4截止,继电器 线圈J3断开,断开K3,停止化霜。
相关文章推荐阅读: