anzcomk技术报告文档格式.docx
《anzcomk技术报告文档格式.docx》由会员分享,可在线阅读,更多相关《anzcomk技术报告文档格式.docx(16页珍藏版)》请在冰点文库上搜索。
D1灯不亮,不执行加热环节。
反之,若所测电压小于基准电压。
则输出高的门限电压,即D1灯亮,执行加热环节。
反之,则执行冷却环节,这样就可以把温度控制在一定的范围内。
三、各单元电路的设计方案及原理说明
1.单片机I/O口分配
在本次设计中,我们选择STC89C51单片机作为主控制器。
其中单片机P0口作为实际水温的段选端。
P2口作为目标水温的段选端。
P1作为位选端,其中P1.0—P1.3作为实际水温位选,P1.4—P1.7作为目标水温位选。
P3口主要作为信号指示以及读取温度传感器的温度数据。
1.晶振及复位电路
晶振选为11.0592MHZ,通过两个电容与XTAL1和XTAL2构成单片机的外部时钟电路。
复位操作由上电自动复位和按键手动复位两种方式。
复位电路由RC微分电路产生的脉冲来实现,电路如下图所示,按下开关即可产生复位信号,通过导线引入单片机RST引脚即可发生复位。
2.三极管位选驱动电路
由于我们选择四位一体的共阳极数码管作为温度显示原件。
通过测试,我们发现单片机上电后输出电压不能达到要求。
数码管显示非常暗,因此我们对位选端加了三极管驱动电路,电路图如下:
3.温度显示模块
由P0控制实际水温的段选,P2控制目标水温的段选。
我们使用DS18B20作为温度传感器
1、DS18B20的主要特性
1.1、适应电压范围更宽,电压范围:
3.0~5.5V,在寄生电源方式下可由数据线供电
1.2、独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯
1.3、DS18B20支持多点组网功能,多个DS18B20可以并联在唯一的三线上,实现组网多点测温
1.4、DS18B20在使用中不需要任何外围元件,全部传感元件及转换电路集成在形如一只三极管的集成电路内
1.5、温范围-55℃~+125℃,在-10~+85℃时精度为±
0.5℃
1.6、可编程的分辨率为9~12位,对应的可分辨温度分别为0.5℃、0.25℃、0.125℃和0.0625℃,可实现高精度测温
1.7、在9位分辨率时最多在93.75ms内把温度转换为数字,12位分辨率时最多在750ms内把温度值转换为数字,速度更快
1.8、测量结果直接输出数字温度信号,以"
一线总线"
串行传送给CPU,同时可传送CRC校验码,具有极强的抗干扰纠错能力
DS18B20有六条控制命令
2.指令约定代码操作说明
温度转换44H启动DS18B20进行温度转换
读暂存器BEH读暂存器9个字节内容
写暂存器4EH将数据写入暂存器的TH、TL字节
复制暂存器48H把暂存器的TH、TL字节写到E2RAM中
重新调E2RAMB8H把E2RAM中的TH、TL字节写到暂存器TH、TL字节
读电源供电方式B4H启动DS18B20发送电源供电方式的信号给主CPU
四、仿真调试过程及结果分析
1.仿真调试过程
在原理图设计完后,利用protues软件绘制了原理图。
在原理图绘制完后,即进行了仿真调试。
2.结果分析
能够从温度传感器中获得温度数据,并且能通过按键纠正目标温度,程序能正常执行,电阻丝也能按目标温度的高低调整自身的工作状态。
效果还行,不过其一精度不高,只能到一度,其二程序执行得慢,不过由于时间太仓促,这些问题可以解决。
五.设计、安装及调试中的体会
此次电子设计考查了我们的设计电路的能力和动手能力,从中我学到了很多东西。
设计上的电路在实际中运用可能不是像仿真那样理想,由于购买元件的误差及元件的大小在实际中比没有很好的匹配,所以按照设计的电路焊出来的实物在调试过程中遇到了一些问题,但我都一步一步地解决了。
最重要的是通过这次电子设计我深深体会到能把所学的知识运用到实践中才是真正掌握。
特别是在电路调试成功的那一刻,出现了我所预料的现象,着实让我高兴了一番,自己所设计的东西没有白费,并且从中获得了知识,是一件很开心的事。
名称
标号/型号
大小/数量
电容
C1
20P/1个
C2
20p/1个
C3
22u/1个
C4
0.1u/1个
Led-red
D1
2个
Led-green
D2
电阻
R1
210(4个)
R2
320/1个
R3
1k/1个
R4
4.7k/1个
R5
51k/1个
晶振
X1
12M/1个
51单片机
STC89C51
/1个
温度传感器(ds18b20)
DS18B20
按键
Button
4个
数码管(共阳极)
7SEG-MPx4-CA
电热器
1个
集成运算放大器
继电器
G6B-1114P-US-5V
导线
若干
源程序:
#include<
reg51.h>
sbitP10=P1^0;
sbitP11=P1^1;
sbitP12=P1^2;
sbitP13=P1^3;
//数码管1断码控制
sbitP14=P1^4;
sbitP15=P1^5;
sbitP16=P1^6;
sbitP17=P1^7;
//数码管2段码控制
sbitP32=P3^2;
//电源指示灯
sbitP34=P3^4;
sbitP30=P3^0;
//蜂鸣器
sbitP31=P3^1;
//继电器控制位
sbitup=P3^7;
sbitdown=P3^6;
//按键操作端口
sbitP35=P3^5;
//加热指示灯端口
sbitDQ=P3^3;
//温度传感器端口
#defineuintunsignedint
#defineucharunsignedchar
//**************温度小数部分表***********//
ucharcodeditab[16]=
{0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};
/***************共阳极数码管显示表******************/
unsignedcharcodeduan1[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0XD8,0x80,0x90,0x88,};
/***************共阳极数码管(带小数点)显示表******************/
unsignedcharcodeduan2[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,};
//////////////////////////////////////////
voiddelay_1(uintz);
intb=0;
charpwm=0;
intk;
unsignedintt=0;
charr=0,q=0;
intwendu_1;
intmubiao=200;
/**********延时函数***********/
voiddelay(unsignedinti)
{
while(i--);
}
/******************DS18B20初始化****************/
Init_DS18B20(void)
unsignedcharx=0;
DQ=1;
//DQ复位
delay(8);
//稍做延时
DQ=0;
//单片机将DQ拉低
delay(80);
//精确延时大于480us
//拉高总线
delay(14);
x=DQ;
//稍做延时后如果x=0则初始化成功x=1则初始化失败
delay(20);
/**************从DS18B20读入数据**************/
ReadOneChar(void)
unsignedchari=0;
unsignedchardat=0;
for(i=8;
i>
0;
i--)
//给脉冲信号
dat>
>
=1;
if(DQ)
dat|=0x80;
delay(4);
return(dat);
/*********************向DS18B20写命令**********************/
WriteOneChar(unsignedchardat)
i>
i--)
DQ=dat&
0x01;
delay(5);
//delay(4);
/**************DS18B20程序读取温度****************/
ReadTemperature(void)
unsignedchara=0;
unsignedcharb=0;
Init_DS18B20();
WriteOneChar(0xCC);
//跳过读序号列号的操作
WriteOneChar(0x44);
//启动温度转换
//跳过读序号列号的操作
WriteOneChar(0xBE);
//读取温度寄存器等(共可读9个寄存器)前两个就是温度
a=ReadOneChar();
//低八位
b=ReadOneChar();
//高八位
t=b;
t<
<
=8;
t=t|a;
//合并高八位和低八位
return(t);
/**************当前温度显示**************/
xianshi()
intx;
intzhenshu;
intxiaoshu;
wendu_1=ReadTemperature();
x=wendu_1;
zhenshu=x/16;
//整数部分
xiaoshu=x&
0x0f;
//小数部分
wendu_1=zhenshu*10+ditab[xiaoshu];
P10=1;
P0=duan1[zhenshu/10];
//百位
delay_1(5);
P10=0;
P11=1;
P0=duan2[zhenshu%10];
//十位
P11=0;
P12=1;
P0=duan1[ditab[xiaoshu]];
//个位
P12=0;
P13=1;
P0=0xc6;
//显示C
P13=0;
/***************目标电压显示****************/
P14=1;
P2=duan1[mubiao/100];
P14=0;
P15=1;
P2=duan2[mubiao/10%10];
P15=0;
P16=1;
P2=duan1[mubiao%10];
P16=0;
P17=1;
P2=0xc6;
P17=0;
//delay_1(10);
}
main(void)
//关闭位选段
P35=0;
//加热指示灯
P32=0;
//单片机上电指示灯
P30=0;
//蜂鸣器驱动口
P31=1;
//P31低电平时驱动继电器
/**********进入循环**********/
while
(1)
{
xianshi();
//显示系统数据
/*************操作函数*************/
if(down==0){mubiao--;
delay_1(20);
if(up==0){mubiao++;
if(mubiao>
400||mubiao<
200)
{
P30=1;
//目标设置错误时报警
}
else
//目标设置正常,则蜂鸣器不响
//////////////////////////////////////////////////////////////
//mubiao为理想温度
/////wendu_1为实际环境温度
/////////////////////////////////////////////////////////////
//P35为高时红色led灯工作
pwm=mubiao-wendu_1;
if(pwm>
0)
{P35=1;
P31=0;
}//环境温度高于目标温度,红色指示灯发光,加热器加热
else
{P35=0;
P31=1;
}//环境温度低于目标温度,指示灯不发光,不加热
/////////////////////////////////////////////////////////////////
}}
voiddelay_1(uintz)
uintx,y;
for(x=z;
x>
x--)
for(y=110;
y>
y--);