《厦门理工学院光电工程单片机课程设计报告书.》由会员分享,可在线阅读,更多相关《厦门理工学院光电工程单片机课程设计报告书.(17页珍藏版)》请在金锄头文库上搜索。
1、光电工程实践 单片机课程设计 姓 名 学 号 专业班级 指导老师 日 期 2015.6.232015.6.27 摘要2一、实现功能2二、设计原理22.1系统软件工作流程22.2硬件电路原理52.2.1 STC89C52RC最小系统52.2.2 DS18B2062.2.3 LCD160272.2.4 AT24C02与PCF859182.2.5按键92.2.6蜂鸣器9三、设计结果10四、心得体会13五、参考文献14附录 主函数部分程序代码15摘要本作品是基于普中51单片机开发板编写可调温度范围的温控报警系统程序,采用开发板上DS18B20、AT24C02、PCF8591、LCD1602芯片构成的应
2、用电路,将采集的温度、存读的温度、采集的电压实时显示在LCD1602上,并在设定的温度范围实时监测并启动蜂鸣器报警。一、 实现功能1.能实时采集温度和电压值,显示在1602上;2.能实时显示时钟并可手动修改,显示在1602上;3.按键1按下,将当前的温度值保存到AT24C02;4.按键2按下,可逐个显示之前采集到的温度值;5.当温度超过设定值,则蜂鸣器报警;6.能手动调整温度报警阈值。二、设计原理2.1系统软件工作流程一上电,程序首先进行初始化,在主程序的循环程序中首先调用DS18B20温度采集和PCF8591电压采集程序,接着将调用报警子程序,采集到的温度值与预设的温度报警阈值进行比较,判断
3、是否启动蜂鸣器报警,调用1602显示子程序显示时间采集的电压、温度、温度阈值及预存储温度。若按键未按下,则一直执行上述命令。若按键按下,则转到相应的按键检测程序执行,系统定义了7个按键功能,分别为左移键、右移键、加、减键、存储键、提取键、释放键,实现时间和温度报警阈值的手动调整,调整过程会实时显示在LCD1602上。按下存储键时,将调用AT24C02存储子程序,屏幕不会有任何提示;当按下提取键时,将调用AT24C02提取子程序,并将所存的温度显出来;按下释放键时,程序退出提取模式,屏幕会预存温度。时间显示程序完成秒的计时及向分钟、小时的进位。图2.1 软件设计流程图图2.2 时钟流程图2.2硬
4、件电路原理图2.2系统方框图2.2.1 STC89C52RC最小系统(1)复位电路:t=RC1(t10ms);(2)时钟电路:C2=C3=(3010)pF(一般是2030pF);(3)存储器访问路经控制:EA/VPP=+5V时,先内后外图2.2.1 STC89C52RC最小系统图2.2.2 DS18B20DS18B20是美国DALLAS半导体公司继DS1820之后最新推出的一种改进型智能温度传感器。与传统的热敏电阻相比,他能够直接读出被测温度并且可根据实际要求通过简单的编程实现912位的数字值读数方式。可以分别在93.75 ms和750 ms内完成9位和12位的数字量,并且从DS18B20读出
5、的信息或写入DS18B20的信息仅需要一根口线(单线接口)读写,温度变换功率来源于数据总线,总线本身也可以向所挂接的DS18B20供电,而无需额外电源。因而使用DS18B20可使系统结构更趋简单,可靠性更高。他在测温精度、转换时间、传输距离、分辨率等方面较DS1820有了很大的改进,给用户带来了更方便的使用和更令人满意的效果。温度转换计算方法举例:例如当DS18B20采集到+125的实际温度后,输出为07D0H,则: 实际温度=07D0H0.0625=20000.0625=1250C。例如当DS18B20采集到-55的实际温度后,输出为FC90H,则应先将11位数据位取反加1得370H(符号位
6、不变,也不作为计算),则:实际温度=370H0.0625=8800.0625=550C图2.2.2 DS18B202.2.3 LCD1602LCD1602可以显示2行16个字符,有8位数据总线D0D7和RS、R/W、EN三个控制端口,工作电压为5V并且带有字符对比度调节和背光。LCD1602引脚说明如下表所示:表2.2.3 1LCD液晶显示器各引脚功能及结构VDD:电源正极,4.5V5.5V,通常使用5V电压;VL:LCD对比度调节端,电压调节范围为05V。接正极时对比度最弱,接地电源时对比度最高,但对比度过高会产生“鬼影”,因此通常使用一个10K的电位器来调整对比度,或者直接串接一个电阻到地
7、; RS:MCU写入数据或者指令选择端。MCU要写入指令时,使RS为低电平;MCU要写入数据时,使RS为高电平; R/W:读写控制端。R/W为高电平时,读取数据;R/W为低电平时,写入数据;EN:LCD模块使能信号控制端。写数据时,需要下降沿触发模块。 D0D7:8为数据总线,三态双向。如果MCU的I/O口资源紧张的话,该模块也可以只使用4位数据线D4D7接口传送数据。 A:LED背光正极。需要背光时, A串接一个限流电阻接VDD, K接地。 K:LED背光地端。图2.2.3 LCD电路引脚图2.2.4 AT24C02与PCF8591AT24C02是一个2K位串行CMOS E2PROM, 内部
8、含有256个8位字节,CATALYST公司的先进CMOS技术实质上减少了器件的功耗。AT24C02有一个8字节页写缓冲器。该器件通过IIC总线接口进行操作,有一个专门的写保护功能。PCF8591是一个单片集成、单独供电、低功耗、8-bit CMOS数据获取器件。PCF8591具有4个模拟输入、1个模拟输出和1个串行IC总线接口。PCF8591的3个地址引脚A0, A1和A2可用于硬件地址编程,允许在同个I2C总线上接入8个PCF8591器件,而无需额外的硬件。在PCF8591器件上输入输出的地址、控制和数据信号都是通过双线双向I2C总线以串行的方式进行传输。图2.2.4 AT24C02与PCF
9、8591引脚连线图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提取储存温
10、度2图3.6超过温度范围后报警LED亮起图3.7在报警阈值内LED熄灭四、心得体会本次单片机课程设计,从仿真电路的设计,源程序的书写,单片机课程设计报告和修改以及程序下载和调试中都遇到了不少问题,但在我经过我的努力基本都解决了,并且从中学到了不少知识。我在设计过程中还不断提出自己的疑点以及新的想法,联系实际应用,将课本上学习的东西运用到实际中,这些都令我受益匪浅。课程设计需要很大的耐心,尤其是遇到困难的时候,这也是对我的考验。在设计过程中,遇到问题不是感到急躁,而是耐心地寻找解决的办法,与老师、同学进行交流讨论,寻求最佳的解决办法。总之,在此次的课程设计中,我不仅动手、动脑,也学会了不少东西,
11、同时,谢谢对我的设计带来建议、意见和帮助的同学们!谢谢!五、参考文献1徐敏,刘建春,关键生 单片机原理及应用. -北京:机械工业出版社,2012.2马淑华.单片机原理与接口技术M.2版. 北京:北京邮电大学出版社,2007.3 STC89C52RC、DS18B20、LCD1602、AT24C02、PCF8591等芯片数据手册附录 主函数部分程序代码1#include#include#include#include#include#include#include 24C02.h#define uint unsigned int#define uchar unsigned char#define
12、PCF8591 0x90 #define AT24C02 0xa0 sbit RS=P26;sbit RW=P25;sbit EN=P27;sbit K0=P10;sbit K1=P11;sbit K2=P12;sbit K3=P13;sbit K4=P14;sbit K5=P15;sbit K6=P16;sbit K7=P17;sbit beep=P35; sbit LED=P36;uchar addr = 0x00,ret_addr = 0x00;uchar adc,showoff=0;uint M1,M2;long Vin=0;extern char h1,h2,L1,L2;void b
13、aojing()if(M1(h1*10+h2)|(M1(L1*10+L2) beep=0;LED=0; else beep=1; LED=1; bit ISendByte(unsigned char sla,unsigned char c) Start_I2c(); SendByte(sla); if(ack=0)return(0); SendByte(c); if(ack=0)return(0); Stop_I2c(); return(1);unsigned char IRcvByte(unsigned char sla) unsigned char c; Start_I2c(); SendByte(sla+1); if(ack=0)return(0); c=RcvByte(); Ack_I2c(1); Stop_I2c(); return(c); main()uint i=0,j=0;P0=0xff;P1=0xff;beep=1;LED