厦门理工学院光电工程单片机课程设计报告书讲解Word文档下载推荐.docx
《厦门理工学院光电工程单片机课程设计报告书讲解Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《厦门理工学院光电工程单片机课程设计报告书讲解Word文档下载推荐.docx(18页珍藏版)》请在冰豆网上搜索。
附录主函数部分程序代码15
摘要
本作品是基于普中51单片机开发板编写可调温度范围的温控报警系统程序,采用开发板上DS18B20、AT24C02、PCF8591、LCD1602芯片构成的应用电路,将采集的温度、存读的温度、采集的电压实时显示在LCD1602上,并在设定的温度范围实时监测并启动蜂鸣器报警。
一、实现功能
1.能实时采集温度和电压值,显示在1602上;
2.能实时显示时钟并可手动修改,显示在1602上;
3.按键1按下,将当前的温度值保存到AT24C02;
4.按键2按下,可逐个显示之前采集到的温度值;
5.当温度超过设定值,则蜂鸣器报警;
6.能手动调整温度报警阈值。
二、设计原理
2.1系统软件工作流程
一上电,程序首先进行初始化,在主程序的循环程序中首先调用DS18B20温度采集和PCF8591电压采集程序,接着将调用报警子程序,采集到的温度值与预设的温度报警阈值进行比较,判断是否启动蜂鸣器报警,调用1602显示子程序显示时间采集的电压、温度、温度阈值及预存储温度。
若按键未按下,则一直执行上述命令。
若按键按下,则转到相应的按键检测程序执行,系统定义了7个按键功能,分别为左移键、右移键、加、减键、存储键、提取键、释放键,实现时间和温度报警阈值的手动调整,调整过程会实时显示在LCD1602上。
按下存储键时,将调用AT24C02存储子程序,屏幕不会有任何提示;
当按下提取键时,将调用AT24C02提取子程序,并将所存的温度显出来;
按下释放键时,程序退出提取模式,屏幕会预存温度。
时间显示程序完成秒的计时及向分钟、小时的进位。
图2.1软件设计流程图
图2.2时钟流程图
2.2硬件电路原理
图2.2系统方框图
2.2.1STC89C52RC最小系统
(1)复位电路:
t=RC1(t≥10ms);
(2)时钟电路:
C2=C3=(30±
10)pF(一般是20~30pF);
(3)存储器访问路经控制:
EA/VPP=+5V时,先内后外
图2.2.1STC89C52RC最小系统图
2.2.2DS18B20
DS18B20是美国DALLAS半导体公司继DS1820之后最新推出的一种改进型智能温度传感器。
与传统的热敏电阻相比,他能够直接读出被测温度并且可根据实际要求通过简单的编程实现9~12位的数字值读数方式。
可以分别在93.75ms和750ms内完成9位和12位的数字量,并且从DS18B20读出的信息或写入DS18B20的信息仅需要一根口线(单线接口)读写,温度变换功率来源于数据总线,总线本身也可以向所挂接的DS18B20供电,而无需额外电源。
因而使用DS18B20可使系统结构更趋简单,可靠性更高。
他在测温精度、转换时间、传输距离、分辨率等方面较DS1820有了很大的改进,给用户带来了更方便的使用和更令人满意的效果。
温度转换计算方法举例:
例如当DS18B20采集到+125℃的实际温度后,输出为07D0H,则:
实际温度=07D0H╳0.0625=2000╳0.0625=1250C。
例如当DS18B20采集到-55℃的实际温度后,输出为FC90H,则应先将11位数据位取反加1得370H(符号位不变,也不作为计算),则:
实际温度=370H╳0.0625=880╳0.0625=550C
图2.2.2DS18B20
2.2.3LCD1602
LCD1602可以显示2行16个字符,有8位数据总线D0—D7和RS、R/W、EN三个控制端口,工作电压为5V并且带有字符对比度调节和背光。
LCD1602引脚说明如下表所示:
表2.2.31LCD液晶显示器各引脚功能及结构
VDD:
电源正极,4.5V—5.5V,通常使用5V电压;
VL:
LCD对比度调节端,电压调节范围为0—5V。
接正极时对比度最弱,接地电源时对比度最高,但对比度过高会产生“鬼影”,因此通常使用一个10K的电位器来调整对比度,或者直接串接一个电阻到地;
RS:
MCU写入数据或者指令选择端。
MCU要写入指令时,使RS为低电平;
MCU要写入数据时,使RS为高电平;
R/W:
读写控制端。
R/W为高电平时,读取数据;
R/W为低电平时,写入数据;
EN:
LCD模块使能信号控制端。
写数据时,需要下降沿触发模块。
D0—D7:
8为数据总线,三态双向。
如果MCU的I/O口资源紧张的话,该模块也可以只使用4位数据线D4—D7接口传送数据。
A:
LED背光正极。
需要背光时,A串接一个限流电阻接VDD,
K接地。
K:
LED背光地端。
图2.2.3LCD电路引脚图
2.2.4AT24C02与PCF8591
AT24C02是一个2K位串行CMOSE2PROM,内部含有256个8位字节,CATALYST公司的先进CMOS技术实质上减少了器件的功耗。
AT24C02有一个8字节页写缓冲器。
该器件通过IIC总线接口进行操作,有一个专门的写保护功能。
PCF8591是一个单片集成、单独供电、低功耗、8-bitCMOS数据获取器件。
PCF8591具有4个模拟输入、1个模拟输出和1个串行I²
C总线接口。
PCF8591的3个地址引脚A0,A1和A2可用于硬件地址编程,允许在同个I2C总线上接入8个PCF8591器件,而无需额外的硬件。
在PCF8591器件上输入输出的地址、控制和数据信号都是通过双线双向I2C总线以串行的方式进行传输。
图2.2.4AT24C02与PCF8591引脚连线图
2.2.5按键
图2.2.5独立按键
2.2.6蜂鸣器
蜂鸣器的作用为温度在设定范围之外时产生报警声,LED在温度在设定范围之外时时亮。
蜂鸣器与单片机P3.5口相连,LED灯与单片机P3.6口相连。
图2.2.6蜂鸣器
三、设计结果
本次设计达到预期的目的,实现了要求的所有功能和几个简单的扩展,读取储存的效果不明显,其他情况良好。
显示部分,第一行为实时时间和采集的电压,第二行为实时温度和报警温度上下限,预存温度,时间小时和分钟部分可调,温度范围也可调,报警反应灵敏,效果图如下:
图3.1上电初始状态
图3.2调节电位器采集到电压
图3.3手动调整时间
图3.4提取出储存的温度1
图3.5提取储存温度2
图3.6超过温度范围后报警LED亮起
图3.7在报警阈值内LED熄灭
四、心得体会
本次单片机课程设计,从仿真电路的设计,源程序的书写,单片机课程设计报告和修改以及程序下载和调试中都遇到了不少问题,但在我经过我的努力基本都解决了,并且从中学到了不少知识。
我在设计过程中还不断提出自己的疑点以及新的想法,联系实际应用,将课本上学习的东西运用到实际中,这些都令我受益匪浅。
课程设计需要很大的耐心,尤其是遇到困难的时候,这也是对我的考验。
在设计过程中,遇到问题不是感到急躁,而是耐心地寻找解决的办法,与老师、同学进行交流讨论,寻求最佳的解决办法。
总之,在此次的课程设计中,我不仅动手、动脑,也学会了不少东西,同时,谢谢对我的设计带来建议、意见和帮助的同学们!
谢谢!
五、参考文献
[1]徐敏,刘建春,关键生单片机原理及应用.---北京:
机械工业出版社,2012.
[2]马淑华.单片机原理与接口技术[M].2版.北京:
北京邮电大学出版社,2007.
[3]STC89C52RC、DS18B20、LCD1602、AT24C02、PCF8591等芯片数据手册
附录主函数部分程序代码
#include<
reg52.h>
I2C.h>
Function.h>
1602.h>
DS18B20.h>
key.h>
#include"
24C02.h"
#defineuintunsignedint
#defineucharunsignedchar
#definePCF85910x90
#defineAT24C020xa0
sbitRS=P2^6;
sbitRW=P2^5;
sbitEN=P2^7;
sbitK0=P1^0;
sbitK1=P1^1;
sbitK2=P1^2;
sbitK3=P1^3;
sbitK4=P1^4;
sbitK5=P1^5;
sbitK6=P1^6;
sbitK7=P1^7;
sbitbeep=P3^5;
sbitLED=P3^6;
ucharaddr=0x00,ret_addr=0x00;
ucharadc,showoff=0;
uintM1,M2;
longVin=0;
externcharh1,h2,L1,L2;
voidbaojing()
{
if((M1>
(h1*10+h2))||(M1<
(L1*10+L2)))
{
beep=0;
LED=0;
}
else
{
beep=1;
LED=1;
bitISendByte(unsignedcharsla,unsignedcharc)
{
Start_I2c();
SendByte(sla);
if(ack==0)return(0);
SendByte(c);
Stop_I2c();
return
(1);
}
unsignedcharIRcvByte(unsignedcharsla)
unsignedcharc;
SendByte(sla+1);
c=RcvByte();
Ack_I2c
(1);
Stop_I2c();
return(c);
}
main()
uinti=0,j=0;
P0=0xff;
P1=0xff;
beep=1;
Init_DS18B20();
InitTimer0();
¯
lcd_init();
Time_init();
while
(1)
{
M1=ReadTemperature()/10;
if(showoff==0)
{
M2=M1;
}
show1();
delay_18B20(100);
baojing();
key();
ISendByte(PCF8591,0x40);
adc=IRcvByte(PCF8591);
Vin=5000*(long)adc;
Vin=Vin>
>
8;
if(K5==0)
delay(80);
if(K5==0)
{
ret_addr=addr;
write_e2p(M1,addr);