单片机应用技术(第三版)课件 任务8 空调制冷控制器设计_第1页
单片机应用技术(第三版)课件 任务8 空调制冷控制器设计_第2页
单片机应用技术(第三版)课件 任务8 空调制冷控制器设计_第3页
单片机应用技术(第三版)课件 任务8 空调制冷控制器设计_第4页
单片机应用技术(第三版)课件 任务8 空调制冷控制器设计_第5页
已阅读5页,还剩72页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

任务8空调制冷控制器设计

北京精仪达盛科技有限公司苏州市职业大学8.1液晶显示器显示8.2键盘与单片机的连接8.3数字温度传感器目录8.1液晶显示器显示LCD(LiquidCrystalDisplay)是液晶显示器的缩写,液晶显示器是利用液晶经过处理后能改变光线通过方向的特性,而达到白底黑字或黑底白字显示的目的。液晶显示器具有功耗低、抗干扰能力强等优点,因此被广泛应用。例如我们在手机、BP机、笔记本电脑和计算器上看到的都是液晶显示屏幕。LCM的种类繁多,可以根据不同的场合、不同的需要选择不同类型的LCM,本书主要介绍1602字符型LCM(即两行显示,每行可显示16个字符)。8.1.11602字符型LCM的特性及引脚功能1.字符型LCM的特性2.字符型LCM的引脚功能LCM通常有16个引脚,也有14个引脚,当选用14个引脚的LCM时,该LCM没有背光。8.1.2字符型LCM与单片机的连接1.直接访问方式连接该连接是由单片机的读(RD引脚)、写(WR引脚)和高位地址线共同控制LCM的E端,由高位地址线其中的两条分别与RS端和R/W端相连,由单片机的P0口LCM的DB0-DB7相连.这样就构成了三总线(数据DB、地址总线AB和控制总线CB)的连接方式,如图所示。由于构成了三总线的结构,所以在软件控制上比较简单,用通过访问外部地址的方式就能访问LCM。但是,在使用这种连接方式时需要注意单片机的控制总线时序和地址总线时序必须要与LCM所需要的时序相匹配,否则将无法访问。LCM与单片机的直接访问方式连接电路2.间接控制方式连接利用HD44780所具有的4位数据总线的功能,简化电路接口的一种连接方式,如图8-2所示。直接访问方式连接电路中需要增加与非门和反相器,从原理图上看很简单,但在实际焊接时,增加两个器件就增加了很多麻烦,另外增加器件也意味着增加了故障点,所以在实际使用时并不采用此电路。在图中,省去了4位数据线,电路连接十分简单,也没有多余的器件,对于参加比赛来说非常方便。LCM与单片机的间接控制方式连接但是由于LCM本身为速度较慢的器件,每一次数据传输大概需要几十微秒至几毫秒的时间,如果采用间接控制方式访问,每传送一个字节的数据需要访问两次LCM,这将占用大量的时间,使CPU变得很繁忙,甚至影响CPU处理其他数据的传输速度。所以在实际的硬件电路连接中常采用如图8-3所示的电路。采用这种连接方式不能构成三总线的结构,所以不能通过地址的形式直接访问,而是需要按照LCM的方式进行数据的传输,同时由于数据总线使用了8条,所以在数据传输的时间上与直接访问的时间相同,速度较间接控制方式提高了一倍,缩短了CPU对LCM的访问时间。常用的LCM与单片机的连接8.1.31602字符型LCM的指令集提示(1)对LCM操作主要是4种基本操作:写命令、写数据、读状态和读数据。(2)在进行写命令、写数据和读数据三种操作之前,必须先查询忙标志,当忙状态BF为0时,才能进行这三种操作。(3)LCM上电时,都必须按照一定时序对LCM进行初始化操作,主要分以下四步:①设置LCM工作方式②设置显示状态③清屏:将光标设置为第1行第1列④设置输入方式:设置光标移动方向并确定整体显示是否移动(4)当写一个显示字符后,如果没有再给光标重新定位,则DDRAM地址会自动加1或减1。(5)对LCM的读写操作必须符合读写操作时序,并要有一定的延时。①读操作时,先设置RS和R/W状态,再设置E信号为高,这时从数据口读取数据,然后将E信号置低。②写操作时,先设置RS和R/W状态,再设置数据,然后产生E的脉冲案例20英文字符的液晶显示控制利用基于HD44780控制芯片的1602液晶显示两行字符“Welcomeyou!”和“GuangZhou,2010”

。本案例源程序由main.c和lcd.c两个文件构成,前者完成本例文字进行显示,后者是通用的LCD显示控制程序.源程序(lcd.c)//液晶控制与显示程序#include<string.h>#include<reg51.h>unsignedcharcount;sbitrs=P2^0;sbitrw=P2^1;sbiten=P2^2;voiddelay(unsignedintdely){unsignedchardely1;for(;dely>0;dely--)for(dely1=10;dely1>0;dely1--);}//液晶显示器判忙函数unsignedcharbusy(){unsignedcharlcd_status;

rs=0;//寄存器选择

rw=1;//读状态寄存器

en=1;//开始读

delay(100);lcd_status=P0;en=0;returnlcd_status;}源程序(lcd.c)//向液晶显示器写命令函数voidWR_Com(unsignedchartemp){while((busy()&0x80)==0x80);//忙等待

rs=0;//选择命令寄存器rw=0;//写

P0=temp;

en=1;en=0;}//向液晶显示器写数据函数voidWR_Data(unsignedchardat){while((busy()&0x80)==0x80);

//忙等待

rs=1;rw=0;//向液晶显示器写数据P0=dat;en=1;en=0;}源程序(lcd.c)//向液晶显示器写入显示数据函数//入口条件:液晶显示器行首地址(指示第一行还是第二行)和待显示数组的首地址voiddisp_lcd(unsignedcharaddr,unsignedchar*pstr){

unsignedchari;

WR_Com(addr);

//addr参考表8-2DDRA

M地址设置

delay(100);

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

{WR_Data(pstr[i]);

delay(100);

}}源程序(lcd.c)//液晶显示器初始化函数voidlcd_init(){WR_Com(0x38);//设置数据长度为8位、双行显示、5×7点阵字符

delay(100);WR_Com(0x01);//清屏

delay(100);WR_Com(0x06);//字符进入模式:屏幕不动,字符后移

delay(100);WR_Com(0x0c);//显示开,光标不出现,不闪烁

delay(100);}源程序(主程序main.c)//main.c主程序unsignedcharwelcome[16]="Welcomeyou!";unsignedcharaddr[16]="GuangZhou,2010";voidlcd_init();//函数原型说明voiddisp_lcd(unsignedchar,unsignedchar*);//函数原型说明voidmain(){inti=0;lcd_init();disp_lcd(0x82,welcome);while(1){}}disp_lcd(0xc0,addr+i);i++;if(i>strlen(addr))i=0;delay(10000);案例21空调预置温度的显示控制两个LED数码管用于显示人工设置的温度值(简称预置温度)。两位预置温度的显示是通过将预置温度十位、个位数字BCD码分别由P1送入LED数码管来实现。

显示程序

#include<reg51.h>unsignedchartemp=30;//假设预置的初始温度为30℃main(){unsignedchart10,t;

t10=temp/10;t=temp%10;P0=(t10<<4)|(t&0x0f);while(1);}液晶显示预置温度空调制冷控制系统也可以使用液晶显示预置温度和当前环境温度,如果本案例改用液晶显示预置温度,将如何修改程序?电路图仍可采用图8-5的电路,假设预置温度为30度,当前环境温度为32度,则液晶显示模块lcd.c可不必修改(见例8-1),只需修改主程序main.c。主程序main.c#include<string.h>unsignedcharcurrT[16]="CurrentT:";unsignedcharsetT[16]="SetTemp:";unsignedcharsetTemp=30,currTemp=32;voidlcd_init();voiddisp_lcd(unsignedchar,unsignedchar*);voidformat_Data(unsignedchartemp,unsignedchar*stemp)//将温度值

转换为字符串{stemp[0]=temp/10+'0';//将十位数字转换成ASCII码字符

stemp[1]=temp%10+'0';//将个位数字转换成ASCII码字符}voidmain(){unsignedcharstemp[2];//一定要定义为数组,不能为指针,否则温度显示不了

lcd_init();format_Data(currTemp,stemp);disp_lcd(0x80,currT);disp_lcd(0x8a,stemp);format_Data(setTemp,stemp);disp_lcd(0xc0,setT);disp_lcd(0xca,stemp);while(1);}8.2键盘与单片机的连接键盘是由若干按键组成的开关矩阵,它是微型计算机最常用的输入设备。单片机键盘分为全编码键盘和非编码键盘两种,非编码键盘又分为独立式键盘和矩阵式键盘。一般单片机采用非编码键盘。键的抖动和削抖措施常用的削抖措施有:

1)硬件削抖:采用RS触发器或单稳态触发器构成

去抖动电路来实现。

2)软件削抖:采用10~20ms延时后再确认按键

状态。

按键抖动波形

(机械抖动,时间5~10ms)8.2.2独立式按键接口技术将每个按键的一端接到单片机的I/O口,另一端接地。1、通过I/O口连接:实例8-1采用不断查询的方法,即检测是否有键闭合,如有键闭合,则去除键抖动,判断键号并转入相应的键处理。P3.0:开始执行8只发光二极

管闪烁P3.1:停止执行。voiddelay(unsignedchar);bitkey();voidlsd(unsignedchar);unsignedcharvkey;bitstart_end=0;voidmain(){unsignedcharldata=0xff;while(1){}}if(key()){if(vkey==1)start_end=1;elsestart_end=0;}if(start_end){ldata=~ldata;delay(250);}elseldata=0xff;P0=ldata;源程序(延时函数delay())voiddelay(unsignedchart){unsignedchari,j;for(i=t;i>0;i--)

for(j=200;j>0;j--);}bitkey(){unsignedchartemp;bitflag=0;temp=P3;temp=temp|0xfc;temp=temp^0xff;if(temp==0)returnflag;else{}}delay(25);temp=P3|0xfc;temp=temp^0xff;if(temp==0)

returnflag;else{vkey=temp;flag=1;

while(temp){temp=P3|0xfc;temp=temp^0xff;}}returnflag;源程序(判断是否有键按下函数)2、采用中断方式各个按键都接到一个与非门上,当有任何一个按键按下时,都会使与门输出为低电平,从而引起单片机的中断,它的好处是不用在主程序中不断地循环查询,如果有键按下,单片机再去做相应的处理。实例8-2按照图8-9的电路,试编程实现由3个按键控制发光二极管的全亮、闪烁或全灭。#include<reg51.h>voiddelay(unsignedchar);unsignedcharflag;voidmain(){IT0=1;EA=1;EX0=1;while(1)

{switch(flag){case1:P0=0x00;break;case2:P0=~P0;delay(250);break;case3:P0=0xff;break;}}}voiddelay(unsignedchart){unsignedchari,j;for(i=t;i>0;i--)for(j=200;j>0;j--);}中断服务函数voidisr_int0()interrupt0{unsignedcharkdata;kdata=P1;kdata=kdata^0xff;kdata>>=1;if(kdata!=0){kdata>>=1;if(kdata!=0)flag=3;elseflag=2;}elseflag=1;}8.2.3矩阵式键盘接口技术1、矩阵式键盘的结构当按键没有按下时,所有的输入端都是高电平,代表无键按下。一旦有键按下,则输入线就会被拉低,这样,通过读入输入线的状态就可判断是否有键按下了。2、矩阵式键盘的按键识别方法——行扫描法1)判断键盘中有无键按下。将全部行线置低电平,然后检测列线的状态。只要有一列的电平为低,则表示键盘中有键被按下,而且闭合的键位于低电平线与4根行线相交叉的4个按键之中。若所有列线均为高电平,则键盘中无键按下。2)判断闭合键所在的位置。在确认有键按下后,即可进入确定具体闭合键的过程。其方法是:依次将行线置为低电平,即在置某根行线为低电平时,其它线为高电平。在确定某根行线位置为低电平后,再逐行检测各列线的电平状态。若某列为低,则该列线与置为低电平的行线交叉处的按键就是闭合的按键。实例8-389S51单片机的P1口用作键盘I/O口,P0口用作输出口,用于输出所按键的键号(0~F)。行扫描识别步骤(1)检测当前是否有键被按下:检测的方法是P1.4~P1.7输出全“0”,读取P1.0~P1.3的状态,若P1.0~P1.3为全“1”,则无键闭合,否则有键闭合。(2)去除键抖动:当检测到有键按下后,延时一段时间再做下一步的检测判断。(3)若有键被按下,应识别出是哪一个键闭合。识别键闭合的方法对键盘的行线进行扫描。P1.4~P1.7按下述4种组合依次输出:P1.71110P1.61101P1.51011P1.40111在每组行输出时读取P1.0~P1.3,若全为“1”,则表示为这一行没有键闭合,否则有键闭合。由此得到闭合键的行值和列值,然后可采用计算法或查表法将闭合键的行值和列值转换成所定义的键值。主程序#include<reg51.h>unsignedcharseg[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//共阳voiddelay(unsignedchar);unsignedcharkey_scan();voidmain(){unsignedcharval_key;while(1){val_key=key_scan();if(val_key!=0xff)P0=seg[val_key];}}voiddelay(unsignedchart){unsignedchari,j;

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

for(j=0;j<200;j++);}延时程序键盘扫描函数unsignedcharkey_scan(){unsignedcharkdata,vkey,keyNo;bitiskey=0;//标志,在确定具体哪一个键按下时,

如果检测到有一个键按下则该标志置1P1=0x0f;//行线送“0”kdata=P1;//读取列线值

kdata&=0x0f;if(kdata==0x0f)return0xff;//无键按下,建立无效标志(0xff为无键按下的无效标志)

键盘扫描函数else//若列线均为“1”则无键按下,否则有键按下

{delay(25);//有键按下,去除抖动

kdata=0xef;while(!iskey)//扫描键盘

{vkey=P1=kdata;//送扫描码至P1口行线,并将扫描码保存到vkey中

kdata=P1;//读取列线值

kdata&=0x0f;if(kdata==0x0f){kdata=vkey;//若没有键盘按下,则取出行扫描码

kdata<<=1;//换扫描下一行的扫描码(循环向左移一位

kdata|=1;}else//若有键按下则键处理{kdata^=0x0f;//为计算列值的方便,将列线P1.3~P1.0分别与1异或即按位取反

switch(kdata)//计算列值

{case1:keyNo=0;break;case2:keyNo=1;break;case4:keyNo=2;break;case8:keyNo=3;break;}iskey=1;}}

vkey=vkey>>4;//取行扫描码

vkey^=0x0f;//将行扫描码取反

switch(vkey){case1:keyNo+=0;break;//把行值加到列值中

case2:keyNo+=4;break;case4:keyNo+=8;break;case8:keyNo+=12;break;}do{kdata=P1;kdata&=0x0f;}while(kdata!=0x0f);//判断键释放

}returnkeyNo;}案例22空调制冷控制系统预置温度控制“UP”是“升温”按钮,接INT0,“DOWN”是“降温”按钮,接INT1。显然,该案例中,提高或降低调节温度均采用中断方式实现。源程序(主函数)调节温度的设置可分别在外部中断0和外部中断1的中断服务程序中实现,在中断服务程序中,调节温度放在变量temp(采用BCD码)中,每发生一次中断,temp中的数据加1或减1,并再分别由P0控制的两个数码管显示其温度值。#include<reg51.h>unsignedchartemp=30;main(){unsignedchart10,t;IT0=IT1=1;t10=temp/10;t=temp%10;P1=(t10<<4)|(t&0x0f);EA=1;EX0=EX1=1;while(1);}//按升温按钮的中断服务程序voidisr_int0()interrupt0{unsignedchart10,t;if(temp<30)temp++;

//说明最高温度设为30度t10=temp/10;t=temp%10;P1=(t10<<4)|(t&0x0f);}温度设定中断子程序://按降温按钮的中断服务程序void

isr_int1(

)interrupt2{unsignedchart10,t;if(temp>20)temp--;

//说明最低温度设为20度t10=temp/10;t=temp%10;P1=(t10<<4)|(t&0x0f);}8.3数字温度传感器DS18B20特点

1.单线结构,只需一根信号线和CPU相连。2.不需要外部元件,直接输出串行数据。3.可不需要外部电源,直接通过信号线供电,电源电压范围为3.3V~5V。4.测温精度高,测温范围为:-55℃~+125℃,在-10℃~+85℃范围内,精度为±0.5℃。5.测温分辨率高,当选用12位转换位数时,温度分辨率可达0.0625℃。6.9位精度的转换时间为93.75ms;10位精度的转换时间187.5ms;12位精度的转换时间750ms。7.具有非易失性上、下限报警设定的功能,用户可方便地通过编程修改上、下限的数值。8.可通过报警搜索命令识别哪片DS18B20采集的温度超越上、下限。8.3.1DS18B20引脚及内部结构1.DS18B20引脚DS18B20的常用封装有3脚、8脚等几种形式。DQ:数字信号输入/输出端。GND:电源地端。VDD:外接供电电源输入端(在寄生电源接线时此脚应接地)。

2.DS18B20内部结构64位ROM和一线接口存储和控制逻辑高速暂存器8位CRC生成器温度传感器低温触发器TL高温触发器TH配置寄存器电源检测DQVDD8.3.2DS18B20的读写操作1.ROM操作命令

(1)读命令(33H):通过该命令主机可以读出DS18B20的ROM中的8位系列产品代码、48位产品序列号和8位CRC校验码。该命令仅限于单个DS18B20在线的情况。(2)选择定位命令(55H):当多片DS18B20在线时,主机发出该命令和一个64位数,DS18B20内部ROM与主机一致者,才响应命令。该命令也可用于单个DS18B20的情况。(3)查询命令(0F0H):该命令可查询总线上DS18B20的数目及其64位序列号。(4)跳过ROM序列号检测命令(0CCH):该命令允许主机跳过ROM序列号检测而直接对寄存器操作,该命令仅限于单个DS18B20在线的情况。(5)报警查询命令(0ECH):只有报警标志置位后,DS18B20才相应该命令。2.存储器操作命令(1)写入命令(4EH):该命令可写入寄存器的第2、3、4字节,即高低温寄存器和配置寄存器。复位信号发出之前,三个字节必须写完。(2)读出命令(0BEH):该命令可读出寄存器中的内容,复位命令可终止读出。(3)开始转换命令(44H):该命令使DS18B20立即开始温度转换,当温度转换正在进行时,主机这时读总线将收到0;当温度转换结束时,主机这时读总线将收到1。若用信号线给DS18B20供电,则主机发出转换命令后,必须提供至少相应于分辨率的温度转换时间的上拉电平。(4)回调命令(088H):该命令把EEROM中的内容写到寄存器TH、TL及配置寄存器中。DS18B20上电时能自动写入。(5)复制命令(48H):该命令把寄存器TH、TL及配置寄存器中的内容写到EEROM中。(6)读电源标志命令(084H):主机发出该命令后,DS18B20将进行响应,发送电源标志,信号线供电发0,外接电源发1。8.3.3DS18B20的复位及读写时序1.复位对DS18B20操作之前,首先要将它复位。(1)主机将信号线置为低电平,时间为480~960μs。(2)主机将信号线置为高电平,时间为15~60μs。480μs~960μs15μs~60μs60~240μs≥480μsDQ(3)DS18B20发出60~240μs的低电平作为应答信号。单片机收到此信号后,表明复位成功,才能对DS18B20作其它操作,否则可能发生器件不存在、器件损坏或其他故障。480μs~960μs15μs~60μs60~240μs≥480μsDQ2.写字节单片机将DQ设置为低电平,延时15μs产生写起始信号。将待写的数据以串行形式送一位至DQ端,DS18B20在15~60μs的时间内对DQ检测,如DQ为高电平,则写1,如DQ为低电平,则写0,从而完成了一个写周期。在开始另一个写周期前,必须有1μs以上的高电平恢复期。15μs15μs~60μs>1μsDQ>60μs15μs15μs~60μs>1μsDQ>60μs写“0”时序写“1”时序3.读字节当单片机准备从DS18B20温度传感器读取每一位数据时,应先发出启动读时序脉冲,即将DQ设置低电平1μs以上,再使DQ上升为高电平,产生读起始信号。启动后等待15μs,以便DS18B20能可靠地将温度数据送至DQ总线上,然后单片机开始读取DQ总线上的结果,单片机在完成取数据操作后,要等待至少45μs,从而完成了一个读周期。在开始另一个读周期前,必须有1μs以上的高电平恢复期。15μs>1μsDQ>60μs>45μs>1μs>1μs15μs>60μs>45μs>1μs案例23单片机与DS18B20传感器连接用单片机AT89C52的P0.7口线经上拉后接至DS18B20的引脚2数据端,引脚1接电源地端,引脚3接+5V电源端。源程序#include<reg51.h>#include<intrins.h>sbitLE=P2^5;sbitDQ=P0^7;bitDS_IS_OK=1;unsignedcharseg[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x00};//字段数组定义了12个元素,其中第11个元素是负号“-”的字//段码第12个元素为不显示的字段码,用于显示正温度值unsignedcharbuf[4];unsignedinttemperature;voiddelay(unsignedinttime)//延时函数{while(time--);}源程序(初始化函数和读字节函数)//DS18B20初始化函数unsignedcharInit_Ds18b20(){unsignedcharstatus;DQ=1;delay(8);DQ=0;delay(90);DQ=1;delay(5);status=DQ;delay(60);returnstatus;}//读字节函数unsignedcharread(){unsignedchari=0;unsignedchardat=0;DQ=1;_nop_();for(i=8;i>0;i--){DQ=0;dat>>=1;DQ=1;_nop_();_nop_();if(DQ)dat|=0x80;delay(30);DQ=1;}return(dat);}源程序(写字节函数)voidwrite(unsignedchardat){unsignedchari;for(i=8;i>0;i--){DQ=0;DQ=dat&0x01;delay(5);DQ=1;dat>>=1;}}源程序(采样温度函数)voidReadTemperature(){unsignedchartempL=0;unsignedchartempH=0;if(Init_Ds18b20()==1)//DS18B20故障

DS_IS_OK=0;else{DS_IS_OK=1;write(0xcc);//跳过ROM序列号检测命令write(0x44);//开始温度转换命令Init_Ds18b20();write(0xcc);write(0xbe);//读出寄存器中的内容tempL=read();tempH=read();temperature=(tempH<<8)|tempL;}}//温度值显示处理函数voiddispute(){unsignedinttemp,temp1;//用于中途的数据转换

//以下if语句用于处理负温度值,因为保存的是温度值的补码

if((temperature&0xf800)==0xf800){temperature=~temperature+1;buf[0]=10;}elsebuf[0]=11;temp=temperature/16.0*100;//放大100倍,用于对百分位四舍五入

if(temp<10)buf[0]=11;//处理0度,温度是0度时保证不出现负号

else{temp1=temp%10;if(temp1>=5)temp+=10;//四舍五入

}temp/=10;//去掉温度值的百分位

if(temp>=1000)//如果温度>=100度,则显示四位

{buf[0]=temp/1000;buf[1]=temp/100%10;buf[2]=temp/10%10;buf[3]=temp%10;}else{buf[1]=temp/100;buf[2]=temp/10%10;buf[3]=temp%10;}}源程序(显示函数)voiddisplay()//显示函数.{inti,j;unsignedchartemp=0xfe;for(j=0;j<30;j++)//由于是动态显示方式,因此必须多次循环才能成功显示,很关键,处理不好温度值将显示不成功

{temp=0xfe;for(i=0;i<4;i++){LE=0;P2=temp;if(i==2)P1=seg[buf[i]]+0x80;elseP1=seg[buf[i]];LE=1;LE=0;delay(10);temp=(temp<<1)|1;}P2=temp;//关显示,进行下一次测试

}}源程序(主函数)voidmain(){ReadTemperature();delay(50000);delay(50000);while(1){if(DS_IS_OK==1){ReadTemperature();dispute();display();}}}案例24单片机控制空调制冷系统设计1、确定任务1)根据环境温度控制压缩机工作。控制参数是温度,被控参数是压缩机电路通、断的工作状态。2)设置希望的环境温度值。由人手动控制。3)显示设定的温度值和当前环境温度值。2.总体设计单片机温度传感器升温按钮降温按钮预置温度M指示灯继电器压缩机当前温度3.硬件设计3.硬件设计(1)该制冷控制系统可由AT89C52单片机最小系统即可实现(当然也可以用其他芯片,如AT89S51等),采用内部时钟电路。(2)预置温度设置通过与单片机INT0、INT1引脚相连按键来实现升温和降温,以中断方式工作。(3)两位预置的温度由P0口驱动2个数码管显示(带BCD码)。(4)温度传感器选用数字温度传感器DS18B20。数字温度传感器产生的串行信号由P3.6口输入,设置的温度由P1驱动4个数码管显示(动态显示),读取温度的时间延迟由T0实现,考虑到预置温度的显示问题,延时时间可设置为10ms(延时时间不能太短,太短的话,预置温度设置与显示将会不正常。(5)利用电磁继电器控制制冷压缩工作状态,压缩机可由+12V直流电源提供,继电路由P3.7驱动。4.软件设计(1)主程序模块主要包括设置、显示默认调节温度为30℃的进行系统初始化工作。流程图如图11-14所示,源程序清单如下,包括全局变量定义、头文件设置等。开始预置温度30℃在数码管上显示30初始化外中断0、1设置初始化定时器T0设置启动中断等待(1)主程序模块#include<reg51.h>#include<intrins.h>sbitLE=P2^5;sbitDQ=P3^6;sbitDC=P3^7;unsignedcharset

Temp;unsignedcharseg[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x00};

//开始预置温度30℃在数码管上显示30初始化外中断0、1设置初始化定时器T0设置启动中断等待

//字段数组定义了12个元素,其中第11个元素是负号“-”的字段码,第12个元素为不显示的字段码,用于显示正温度值unsignedcharbuf[4];unsignedinttemperature;小技巧:这里除了定义0~9的字段码外,还考虑到温度是负值时要显示“-”,而温度是正值时不显示符号,因此在该数组中多定义了两个符号的编码。(1)主程序模块voidmain(){unsignedchart10,t;setTemp=30;t10=setTemp/10;t=setTemp%10;

P0=(t10<<4)|(t&0x0f);

//预制温度30度显示DC=1;ReadTemperature();

delay(50000);delay(50000);TMOD=0x01;

//T0以方式1定时10msTH0=-10000<<8;TL0=-10000;TR0=1;IT0=IT1=1;IE=0x87;while(1);}(2)温度设置与显示模块包括“升温”和“降温”两段程序,并将2位预置温度转换成BCD码,直接送往P0口,它们的内容相仿。voidisr_int0()interrupt0{unsignedchart10,t;if(setTemp<30)

setTemp++;t10=setTemp/10;t=setTemp%10;P0=(t10<<4)|(t&0x0f);}voidisr_int1()interrupt2{unsignedchart10,t;if(setTemp>20)setTemp--;t10=setTemp/10;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论