基于单片机的微波炉模拟系统设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于单片机的微波炉模拟系统设计
学生:张亚振
指导老师:吴敏廖娟
(安徽农业大学工学院机械设计制造及自动化)
摘要:该设计是基于51单片机系统,采用keil软件编程,温度传感器测量温度。
能实现测量温度,并能在LCD上显示出来,并且在设定温度可报警的功能,具有操作简单易于实现,精确测量温度等特点。
关键词:AT89C51 测温传感器 LCD显示屏
1 总体设计方案
1.1设计原理及相关说明
1.2总体设计框图
微波炉模拟控制设计框图
2 各芯片的设计及其调用
2.1 AT89C51单片机主控模块
单片机的主控模块如图2,它以单片机STC12C5A60S2为核心,STC12C5A60S2系列单片机是宏晶科技生产的单时钟/机器周期(1T)的单片机,是高速/低功耗/超强抗干扰的新一代8051系列单片机,指令代码完全兼容传统8051,但速度快8-12倍。
内部集成MAX810专用复位电路,2路PWM,8路高速10位A/D转换(250K/S,即25万次/秒),针对电机控制,强干扰场合。
其主要性能特点如下:
增强型8051CPU,1T,单时钟/机器周期,指令代码完全兼容传统8051;工作电压:5.5V-3.5V;工作频率范围:0-35MHz,相当于普通8051的0-420MHz;用户应用程序空间60K字节;片上集成1280字节RAM;通用I/O口(36个),复位后为:准双向口/弱上拉(普通8051传统I/O口);可设置成4种模式:准双向口/弱上拉,强推挽/强上拉,仅为输入/高阻,开漏,每个I/O口驱动能力均能达到20mA,但整个芯片最大不要超过120mA;ISP(在系统可编程)/IAP(在应用可编程),无需专用编程器,无需专用仿真器,可通过串口(P3.0/P3.1)直接下载应用程序,数秒即可完成一片;有EEPROM功能;看门狗;内部集成MAX810专用复位电路(外部晶振12M以下时,复位脚可直接1K电阻到地);A/D转换,10位精度ADC,共8路,转换速度可达250K/S;具备双串口;工作温度范围:-40 - +85o C(工业级),0 – 75o C(商业级);40管脚封装
由图2可知,单片机的18和19管脚接时钟电路,19管脚接外部晶振和微调电容的一端,在片内它是振荡器倒相放大器的输入,18管脚接外部晶振和微调电容的另一端,在片内它是振荡器倒相放大器的输出,9引脚是复位输入端,接上电容、电阻及开关后构成上电复位电路。
图2 主控制器 STC12C5A60S2
2.2 DS18B20温度传感器模块
2.2.1 DS18B20的主要特性
●对于正负温度,其格式分别为0000XXXXXXXXyyyy,1111MMMMMMMMnnnn。
由
于这16位补码表示的数据中,低4位用于表示小数位,其分辨率为
1/2^4=0.0625℃,然后乘以0.0625即可得到浮点型温度值。
●独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线
即可实现微处理器与DS18B20的双向通讯
●DS18B20支持多点组网功能,多个DS18B20可以并联在唯一的三线上,
实现组网多点测温
●DS18B20在使用中不需要任何外围元件,全部传感元件及转换电路集
成在形如一只三极管的集成电路内
●温范围-55℃~+125℃,在-10~+85℃时精度为±0.5℃
●可编程的分辨率为9~12位,对应的可分辨温度分别为0.5℃、
0.25℃、0.125℃和0.0625℃,可实现高精度测温
●在9位分辨率时最多在 93.75ms内把温度转换为数字,12位分辨率时
最多在750ms内把温度值转换为数字,速度更快
●测量结果直接输出数字温度信号,以"一线总线"串行传送给CPU,同
时可传送CRC校验码,具有极强的抗干扰纠错能力
●负压特性:电源极性接反时,芯片不会因发热而烧毁,但不能正常
工作
●适应电压范围更宽,电压范围:3.0~5.5V,在寄生电源方式下可由
数据线供电
2.2.2 DS18B20 的外形和内部结构
图6 DS18B20 外部结构
DS18B20外部结构如图6,本设计采用PR-35封装,各引脚定义如下:
●DQ为数字信号输入/输出端;
●GND为电源地;
●VDD为外接供电电源输入端(在寄生电源接线方式时接地)。
图7 DS18B20 内部结构
DS18B20内部结构主要由四部分组成:64位光刻ROM 、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。
2.2.3 DS18B20工作原理
图8 DS18B20测温原理框图
DS18B20的读写时序和测温原理与DS1820相同,只是得到的温度值的位数因分辨率不同而不同,且温度转换时的延时时间由2s 减为750ms。
DS18B20测温原理如图8所示。
图中低温度系数晶振的振荡频率受温度影响很小,用于产生固定频率的脉冲信号送给计数器1。
高温度系数晶振随温度变化其振荡率明显改变,所产生的信号作为计数器2的脉冲输入。
计数器1和温度寄存器被预置在-55℃所对应的一个基数值。
计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当计数器1的预置值减到0时,温度寄存器的值将加1,计数器1的预置将重新被装入,计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到计数器2计数到0时,停止温度寄存器值的累加,此时温度寄存器中的数值即为所测温度。
图8中的
斜率累加器用于补偿和修正测温过程中的非线性,其输出用于修正计数器1的预置值。
2.3 液晶模块简介
2.3.1 LCD 1602的结构及功能: LCD 1602液晶模块采用HD44780控制器,hd44780具有简单而功能较强的指令集,可以实现字符移动,闪烁等功能,LCD 1602与单片机MCU通讯可采用8位或4位并行传输两种方式,hd44780控制器由两个8位寄存器,指令寄存器(IR)和数据寄存器(DR)忙标志(BF),显示数RAM(DDRAM),字符发生器ROMA(CGOROM)字符发生器RAM(CGRAM),地址计数器RAM(AC)。
IR用于寄存指令码,只能写入不能读出,DR用于寄存数据,数据由内部操作自动写入DDRAM和CGRAM,或者暂存从DDRAM和CGRAM读出的数据,BF为1时,液晶模块处于内部模式,不响应外部操作指令和接受数据,DDTAM用来存储显示的字符,能存储80个字符码, CGROM由8位字符码生成5*7点阵字符160中和5*10点阵字符32种.8位字符编码和字符的对应关系,可以查看参考文献(30)中的表4. CGRAM是为用户编写特殊字符留用的,它的容量仅64字节,可以自定义8个5*7点阵字符或者4个5*10点阵字符,AC可以存储DDRAM和CGRAM的地址,如果地址码随指令写入IR,则IR自动把地址码装入AC,同时选择DDRAM或CGRAM但愿,LCD 1602液晶模块的引脚图如图4-3所示。
2.3.2 LCD 1602引脚介绍: Vss(1脚):一般接地。
Vdd(2脚):接电源。
Vee(3脚):液晶显示器对比度调整端,接电源时对比度最弱,接地时对比度最高(对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度)。
RS(4脚):RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器。
R/W(5脚):R/W为读写信号线,高电平(1)时进行读操作,低电平(0)时进行写操作。
E(6脚):E(或EN)端为使能(enable)端,下降沿使能。
DB0(7脚):底4位三态、双向数据总线 0位(最低位)。
DB1(8脚):底4位三态、双向数据总线 1位。
DB2(9脚):底4位三态、双向数据总线 2位。
DB3(10脚):底4位三态、双向数据总线 3位。
DB4(11脚):高4位三态、双向数据总线 4位。
DB5(12脚):高4位三态、双向数据总线 5位。
DB6(13脚):高4位三态、双向数据总线 6位。
DB7(14脚):高4位三态、双向数据总线7位(最高位)(也是busy flang)。
用89C51的P2口作为数据线,用2.7、P2.5、P2.6分别作为LCD的E、R/W、RS。
其中E是下降沿触发的片选信号,R/W是读写信号,RS是寄存器选择信号本模块设计要点如下:显示模块初始化:首先清屏,再设置接口数据位为8位,显示行数为1行,字型为5×7点阵,然后设置为整体显示,取消光标和字体闪烁,最后设置为正向增量方式且不移位。
向LCD的显示缓冲区中送字符,程序中采用2个字符数组,一个显示字符,另一个显示电压数据,要显示的字符或数据被送到相应的数组中,完成后再统一显示.首先取一个要显示的字符或数据送到LCD的显示缓冲区,程序延时2.5ms,判断是否够显示的个数,不够则地址加一取下一个要显示的字符或数据。
液晶与51单片机连接图
2.4 蜂鸣器
图12 蜂鸣器模块
本设计采用的是无源蜂鸣器如下图:
图13 无源蜂鸣器
该蜂鸣器接入电路时,靠近+极标志的管脚接+5V电源,负极接8550集电极,8550发射极接地,基极接2K电阻。
3系统软件设计
3.1主程序设计
整个系统的功能是由硬件电路配合软件来实现的,当硬件基本定型后,软件的功能也就基本定下来了。
从软件的功能不同可分为两大类:一是监控软件(主程序),它是整个控制系统的核心,专门用来协调各执行模块和操作者的关系。
二是执行软件(子程序),它是用来完成各种实质性的功能如测量、计算、显示、通讯等。
每一个执行软件也就是一个小的功能执行模块。
这里将各执行模块一一列出,并为每一个执行模块进行功能定义和接口定义。
各执行模块规划好后,就可以规划监控程序了。
首先要根据系统的总体功能选择一种最合适的监控程序结构,然后根据实时性的要求,合理地安排监控软件和各执行模块之间地调度关系
度
3.2 18B20程序设计
18B20初始化流程图见下图。
4 调试
4.1 调试步骤
调试分为硬件调试和软件调试。
硬件调试:首先了一下检查硬件电路是否有短路、断路和虚焊等,然后接上电源,电源的指示灯亮了之后,检测一下单片机的电源脚有没有电源输入,然后用万用表检查各个元器件的管脚之间的焊接。
最后接实物图,照着仿真图连好线当硬件调试无误后,进行软件调试。
首先用keil软件进行编写程序,程序写好之后编译,第一次并没有成功然后认真查看改正错误后编译成功,生成hex 文件。
在proteus连好虚拟图,把hex文件插入proteus 连线图中进行虚拟模拟,并且模拟成功。
实物调试在试验箱中仿真,把接好线的试验箱用USB口与电脑相连然后用惠普软件将hex文件插入试验箱中进行实物仿真。
仿真结果能根据程序显示结果,因为用到温度传感器,设置温度不能通过人手达到50度于是把设置的中高温改成26度,27度,进行的仿真,经过温度的上升,喇叭,LED灯实验一系列动作,仿真成功。
4.2 性能分析
将程序烧入单片机后,在proteus软件中进行仿真。
在虚拟仿真中有时喇叭会在温度未达到设定温度,LED灯也会出现这问题,在实物中还是比较稳定的。
附录1 系统电路原理图
附录2元件清单
①AT89C51 ②开关③电阻④电容⑤LED灯五个⑥晶振11.0592MHZ ⑦LCD液晶显示屏⑧蜂鸣器⑨滑动变阻器⑩DS18B20
附录3系统程序清单
程序名:微波炉模拟控制系统
编写人:张亚振
编写时间:2016年11月27日
硬件支持:STC89C54 11.095MHz晶体
接口说明:见电路原理图
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar i;
sbit lcdrs=P2^6;
sbit lcdrw=P2^5;
sbit lcden=P2^7;
sbit d1=P1^0;
sbit d2=P1^1;
sbit d3=P2^0;
sbit d4=P2^1;
sbit d5=P2^2;
sbit sound=P1^2;
uchar code t0[]="the temperature ";
uchar code t1[]=" is ";
uchar code wendu[]="0123456789"; //利用一个温度表解决温度显示乱码uchar second;
uchar timer;
void t1_init()
{
TMOD=0x10;
IE=0X88;
TH1=0X3c;
TL1=0Xb0;
}
sbit DQ = P3^7; //定义ds18B20总线IO?
void delay(uint z) //延时函数
{
uint x,y;
for(x=100;x>1;x--);
for(y=z;y>1;y--);
}
void write_com(uchar com) //液晶显示模块
{
lcdrs=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_date(uchar date)
{
lcdrs=1;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void init_lcd() //液晶显示初始化
{
lcden=0;
lcdrw=0;
write_com(0x38); //8位两行显示,5x7点阵字符 write_com(0x01); //清屏
write_com(0x0c); //开整体显示,光标关,无闪烁 write_com(0x06); //
write_com(0x80); //写数据
for(i=0;i<16;i++)
{
write_date(t0[i]);
delay(0);
}
write_com(0x80+0x40);//写数据在第二列第一列
for(i=0;i<16;i++)
{
write_date(t1[i]);
delay(0);
}
}
void tmpDelay(int num) //温度采集模块
{
while(num--);
}
void Init_DS18B20()
{
unsigned char x=0;
DQ = 1; //DQ复位
tmpDelay(8);
DQ = 0; //单片机将DQ拉低
tmpDelay(80);
DQ = 1; //拉高总线
tmpDelay(14);
x=DQ; //稍做延时后如果x=0则初始化成功 x=1则初始化失败 tmpDelay(20);
}
unsigned char ReadOneChar() //读一个字节
{
unsigned char i=0;
unsigned char dat=0;
for (i=8;i>0;i--)
{
DQ = 0; // 给脉冲信号
dat>>=1;
DQ = 1; //?给脉冲信号
if(DQ)
dat|=0x80; //按位或运算
tmpDelay(4);
}
return(dat);
}
void WriteOneChar(unsigned char dat) //写一个字节{
unsigned char i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01;
tmpDelay(5);
DQ = 1;
dat>>=1;
}
}
unsigned int Readtemp() //读取温度
{
unsigned char a=0;
unsigned char b=0;
unsigned int t=0;
float tt=0;
Init_DS18B20();
WriteOneChar(0xCC); // 跳过读序号列号的操作
WriteOneChar(0x44);// 启动温度转换
Init_DS18B20();
WriteOneChar(0xCC);//跳过读序号列号的操作
WriteOneChar(0xBE);//读取温度寄存器
a=ReadOneChar();//连续读两个字节数据 //读低8位
b=ReadOneChar(); //读高8位
t=b;
t<<=8;
t=t|a; //两字节合成一个整型变量。
tt=t*0.0625; //得到真实十进制温度值,因为DS18B20可以精确到0.0625度,所以读回数据的最低位代表的是0.0625度
t= tt*10+0.5; //放大十倍,这样做的目的将小数点后第一位也转换为可显示数字,同时进行一个四舍五入操作
return(t);
}
void display1()
{
unsigned int num,num1;
unsigned int shi,ge,xiaoshu;
num=Readtemp();
num1=num/10;
if(num1>20)
{d3=0;delay(5000);} ;
if(num1>30)
{d4=0;delay(5000);}
if(num1>50)
{d5=0;delay(5000);}
else
{d3=1;d4=1;d5=1;}
}
void display2()
{
unsigned int num,num1;
unsigned int shi,ge,xiaoshu;
num=Readtemp();
num1=num/10;
if(num1>50)
{sound=0;d1=0;d2=1;delay(5000);}
if(num1<20)
{d1=1;d2=0;sound=0;delay(500);}
else
{sound=1;d1=1;d2=1;}
shi=num/100;
ge=num/10%10;
xiaoshu=num%10;
write_com(0x80+0x40+5); //从第二行第五列写数据write_date(wendu[shi]);
write_com(0x80+0x40+6); //从第二行第六列写数据write_date(wendu[ge]);
write_com(0x80+0x40+7); //从第二行第七列写数据write_date(0x2e);
write_com(0x80+0x40+8); //从第二行第八列写数据write_date(wendu[xiaoshu]);
}
void t1_func()
{
TH1=0X3c;
TL1=0Xb0;
if(timer<20)
{
timer=timer+1;
}
else if(timer==20)
{
timer=0;
if(second==0)
{ sound=0;delay(20000);
second=9;
}
else{second=second-1;sound=1;}
}
}
void main()
{
init_lcd();
while(1)
{
display1();
display2();
delay(10);
}
t1_init();
second=9;
timer=0;
while(1);
}。