单片机应用系统设计工程实践报告Word文档格式.docx
《单片机应用系统设计工程实践报告Word文档格式.docx》由会员分享,可在线阅读,更多相关《单片机应用系统设计工程实践报告Word文档格式.docx(17页珍藏版)》请在冰豆网上搜索。
当被测量值超出预设围则发出警报,且精度高。
利用现代虚拟仿真技术可对设计进行仿真实验,与单片机仿真联系紧密的为proteus仿真,利用keil软件设计单片机控制系统,然后与proteus进行联合调试,可对设计的正确性进行检验。
1.2、课程设计的要求
1、遵循硬件设计模块化。
2、要求程序设计结构化。
3、程序简明易懂,多运用输入输出提示,有出错信息及必要的注释。
4、要求程序结构合理,语句使用得当。
5、适当追求编程技巧和程序运行效率。
1.3、项目设计要求
1、基于AT89C51单片机温度报警系统;
2、设计3个按键分别为:
设置按钮、温度加、温度减;
3、DS18B20温度传感器采集温度,并在数码管上显示按键的区别;
4、当温度超过设定的上限或者低于设置的下限温度时蜂鸣器报警;
二、系统案设计及原理
2.1、设计主要容
本设计以AT89C51单片机为核心,从而建立一个控制系统,实现通过3个按键控制温度,以达到设置温度上下限的功能,并在数码管上显示三个数字当前的温度上下限设置值和DS18B20温度采集值的显示(精确到小数点后一位),当温度高于上限或者低于下限蜂鸣器报警。
2.2、AT89C51单片机简介
AT89C51是一个低功耗,高性能CMOS8位单片机,片含4kBytesISP(In-systemprogrammable)的可反复擦写1000次的Flash只读程序存储器,器件采用ATMEL公司的高密度、非易失性存储技术制造,兼容标准MCS-51指令系统及89C51引脚结构,芯片集成了通用8位中央处理器和ISPFlash存储单元,功能强大的微型计算机的AT89C51可为多嵌入式控制应用系统提供高性价比的解决案.AT89C51具有如下特点:
40个引脚,4kBytesFlash片程序存储器,128bytes的随机存取数据存储器,32个外部双向输入/输出(I/O)口,5个中断优先级2层中断嵌套中断,2个16位可编程定时计数器,2个全双工串行通信口,片时钟振荡器。
此外,AT89C51设计和配置了振荡频率可为0Hz并可通过软件设置省电模式。
空闲模式下,CPU暂停工作,而RAM定时计数器,串行口,外中断系统可继续工作,掉电模式冻结振荡器而保存RAM的数据,停止芯片其它功能直至外中断激活或硬件复位。
同时该芯片还具有PDIP、TQFP和PLCC等三种封装形式,以适应不同产品的需求。
AT89C51单片机的基本结构和外部引脚如下图所示。
图2.1
2.3、DS18B20简介
(1)DS18B20部结构
DS18B20是Dallas公司继DS1820后推出的一种改进型智能数字温度传感器,与传统的热敏电阻相比,只需一根线就能直接读出被测温度值,并可根据实际需求来编程实现9~12位数字值的读数式。
DS18B20的外形如一只三极管,引脚名称及作用如下:
GND:
接地端,
DQ:
数据输入/输出脚,与TTL电平兼容,
VDD:
可接电源,也可接地。
因为每只DS18B20都可以设置成两种供电式,即数据总线供电式和外部供电式。
采用数据总线供电式时VDD接地,可以节省一根传输线,但完成数据测量的时间较长;
采用外部供电式则VDD接+5V,多用一根导线,但测量速度较快,部结构如图如图3-1.
图3.1
(2)DS18B20供电式
DS18B20可以采用外部电源供电和寄生电源供电两种模式。
外部电源供电模式是将DS18B20的GND直接接地,DQ与但单总线相连作为信号线,VDD与外部电源正极相连。
如图3.2
图3.2
(3)DS18B20的测温原理
DS1820
是这样测温的:
用一个高温度系数的振荡器确定一个门期,部计数器在这个门期对一个低温度系数的振荡器的脉冲进行计数来得到温度值。
计数器被预置到对应于-55℃的一个值。
如果计数器在门期结束前到达0,则温度寄存器(同样被预置到-55℃)的值增加,表明所测温度大于-55℃。
同时,计数器被复位到一个值,这个值由斜坡式累加器电路确定,斜坡式累加器电路用来补偿感温振荡器的抛物线特性。
然后计数器又开始计数直到0,如果门期仍未结束,将重复这一过程。
斜坡式累加器用来补偿感温振荡器的非线性,以期在测温时获得比较高的分辨率。
DS18B20部对此计算的结果可提供0.5℃的分辨率。
温度以16bit带符号位扩展的二进制补码形式读出,
DS18B20遵循单总线协议,每次测温时都必须有4个过程]:
初始化、传送ROM
操作命令、传送ROM操作命令、数据交换。
2.4、数码管显示
数码管部由七个条形发光二极管和一个小圆点发光二极管组成,根据各管的亮暗组合成字符。
常见数码管有10根管脚。
管脚排列如下图所示。
其中COM为公共端,根据部发光二极管的接线形式可分为共阴极和共阳极两种。
共阳、阴极部原理图(如图4.1),其中引脚图的两个COM端连在一起,是公共端,共阴数码管要将其接地,共阳数码管将其接正5伏电源。
一个八段数码管称为一位,多个数码管并列在一起可构成多位数码管,它们的段选线(即a,b,c,d,e,f,g,dp)连在一起,而各自的公共端称为位选线。
显示时,都从段选线送入字符编码,而选中哪个位选线,那个数码管便会被点亮。
本次试验采用共阳极,显示电路如图4.2.
图4.1
图4.2
2.5、报警电路
通过P2口控制,当温度高于设置的上限或者设置的下限时蜂鸣器响报警。
如图5.1.
图5.2
三、系统结构及硬件实现
3.1、总电路图
本电路是由AT89C51和DS18B20为核心,加上串口电路来实现对整个电路的控制和设计,电路图如下。
3.2、单片机控制流程图
四、软件设计过程
(1)、把程序在KeiluVision4中调试,成功无错误后生成Hex文件。
(2)、根据电路图在proteus软件中回去电路图,检查无错误。
(3)、双击89C51导入生成Hex文件。
(4)、点击proteus软件左下的开始键,进行仿真,观察高低电平情况。
五、实验结果及分析
5.1、Proteus
仿真
(1)Proteus软件是英国Labcenter
electronics公司出版的EDA工具软件。
它不仅具有其它EDA工具软件的仿真功能,还能仿真单片机及外围器件。
它是目前最好的仿真单片机及外围器件的工具。
Proteus是世界上著名的EDA工具(仿真软件),从原理图布图、代码调试到单片机与外围电路协同仿真,一键切换到PCB设计,真正实现了从概念到产品的完整设计。
在PROTEUS绘制好原理图后,调入已编译好的目标代码文件:
*.HEX,可以在PROTEUS的原理图中看到模拟的实物运行状态和过程。
使用Proteus
软件进行单片机系统仿真设计,是虚拟仿真技术和计算机多媒体技术相结合的综合运用,有利于培养学生的电路设计能力及仿真软件的操作能力;
实践证明,在使用
Proteus
进行系统仿真开发成功之后再进行实际制作,能极大提高单片机系统设计效率。
因此,Proteus
有较高的推广利用价值。
(2)在仿真时按设置按钮,按一次设置温度上限,按第二次设置温度下限,按第三次回到当前温度显示值,其它两个按键是对设置值的加减;
或者利用串口在上位机上进行设置,端口选择COM2,波特率选择9600,三个按钮的功能和仿真图里的按键功能一样,对温度进行设置。
如图5.1
图5.1
5.2、C程序调试
在Kill4中对程序进行编写调试源代码如下:
#include<
reg51.h>
#defineuintunsignedint
#defineucharunsignedchar//宏定义
sbitbut1=P1^0;
sbitbut2=P1^1;
sbitbut3=P1^2;
sbitp34=P2^4;
sbitp35=P2^5;
sbitp36=P2^6;
sbitdp=P0^7;
sbitp37=P2^7;
sbitDQ=P2^2;
//定义DS18B20总线I/O
sbitLING=P2^0;
//定义响铃
ucharshezhi=0;
uintshangxian=300;
//上限报警温度,默认值为60
uintxiaxian=200;
//下限报警温度,默认值为0
ucharcodeLEDData[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf};
bits1,s2,s3,s4;
/*****延时子程序*****/
voidDelay(uinti)
{
while(i--);
}
voiddelayms(uintx)
{
uchari;
while(x--);
for(i=0;
i<
120;
i++);
}
voidInit_DS18B20(void)
{
unsignedcharx=0;
DQ=1;
Delay(8);
//稍做延时
DQ=0;
//单片机将DQ拉低
Delay(80);
//精确延时,大于480us
//拉高总线
Delay(14);
x=DQ;
//稍做延时后,如果x=0则初始化成功,x=1则初始化失败
Delay(20);
}
/*****读一个字节*****/
unsignedcharReadOneChar(void)
unsignedchari=0;
unsignedchardat=0;
for(i=8;
i>
0;
i--)
//给脉冲信号
dat>
>
=1;
if(DQ)dat|=0x80;
Delay(4);
return(dat);
/*****写一个字节*****/
voidWriteOneChar(unsignedchardat)
{unsignedchari=0;
i>
i--)
DQ=dat&
0x01;
Delay(5);
DQ=1;
voidTmpchange(void)//发送温度转换命令
Init_DS18B20();
WriteOneChar(0xCC);
//跳过读序号列号的操作
WriteOneChar(0x44);
//启动温度转
unsignedintReadTemperature(void)
unsignedchara=0;
unsignedcharb=0;
unsignedintt=0;
floattt=0;
Tmpchange();
Init_DS18B20()