温度万年历的单片机实现实验报告
- 格式:doc
- 大小:1.92 MB
- 文档页数:15
1 目 录 一、温度万年历设计的目的和意义.............................1 二、电路设计方案 .................................. 1 三、原理设计 ...................................... 1 四、方案结构图 .................................... 3 五、温度万年历1602驱动及显示的详细设计 ......... 6 六、心得与总结 ................................... 14 - 1 -
一、温度万年历设计的目的和意义 随着社会的发展,信息量的不断提升以前对信息交换的要求提高,温度万年历的发展以及投入市场变得非常有必要。本设计是基于51单片机并模拟日常所用的日历,而51系列单片机是各单片机中最为典型和最有代表性的一种。通过本次设计,学习和巩固了单片机指令编程的相关知识,熟悉单片机各部件的组成及其功能。 本设计将制作一种基于单片机控制的带实时温度显示、具有定时功能的电 子万年历。传统的电子日历大都体积大,功耗大,显示不准确等特点。为了缩小体积,减小功耗,使其变得小巧灵敏,本设计加入了时钟芯片DS1302,可对时间进行准确记时,同时可设置定时时间,实现定时功能。另外本设计具有显示实时温度的功能。传统的温度传感器系统大都采用放大、调理、A/D转换,转换后的数字信号送入计算机处理,处理电路复杂、可靠性相对较差,占用计算机的资源比较多。本设计将采用DS18B20一线制数字温度传感器,可将温度信号直接转换成数字信号送给微处理器,电路简单,成本低,实现了时间温度同时显示的效果。最后,温度和时间都将通过LCD1602液晶显示器进行显示。测试表明系统达到了设计要求的各项功能,各部分工作正常。
二、电路设计方案 采用AT89S52作为主控制系统; 直接采用单片机定时计数器提供秒信号;LCD液晶显示屏作为显示。
三、原理设计 1. 基本原理: 本电路是由AT89S52单片机为控制核心,具有在线编程功能,低功耗,能在3V超低压工作;时钟电路直接采用单片机定时计数器提供秒信号;温度的采集由DS18B20构成;显示部份由LCD液晶显示屏显示。同时还添加了提醒功能,通过蜂鸣器实现。 2. 总体框图 - 2 -
图1 3. 单元电路设计 单片机主控制模块的设计 AT89S52单片机为40引脚双列直插芯片,有四个I/O口P0,P1,P2,P3, MCS-51单片机共有4个8位的I/O口(P0、P1、P2、P3),每一条I/O线都能独立地作输出或输入。单片机的最小系统如下图2所示,18引脚和19引脚接时钟电路,XTAL1接外部晶振和微调电容的一端,在片内它是振荡器倒相放大器的输入,XTAL2接外部晶振和微调电容的另一端,在片内它是振荡器倒相放大器的输出。第9引脚为复位输入端,接上电容,电阻及开关后够上电复位电路,20引脚为接地端,40引脚为电源端。 DS18B20性能 独特的单线接口仅需一个端口引脚进行通信 简单的多点分布应用 无需外部器件 可通过数据线供电 零待机功耗 测温范围-55~+125℃,以0.5℃递增 可编程的分辨率为9~12位,对应的可分辨温度分别为0.5℃、0.25℃、0.125℃和0.0625℃ 温度数字量转换时间200ms,12位分辨率时最多在750ms内把温度转换为数字 应用包括温度控制、工业系统、消费品、温度计和任何热感测系统 负压特性:电源极性接反时,传感器不会因发热而烧毁,但不能正常工作 GND:地 DQ:单线运用的数据输入/输出引脚 VD:可选的电源引脚
STC89C52 主控制模块
Lcd1602液晶屏显示模晶振振荡模块
键盘模块 - 3 - 4. 元件列表
四、方案结构图 此方案由于只用到51单片机芯片,因此各个功能都是由编程来实现。 大体程序流程框图如下
按键调整结构图:
元件列表器件 数量 光汇51单片机开发板 1 杜邦线 若干 DS18B20 1 LCD1602液晶屏 1 - 4 - 时钟调整一
时钟调整二 Protues电路图(部分): - 5 -
温度万年历整体电路图 时钟调整按键图 时钟调整LCM显示图 - 6 -
五、温度万年历1602驱动及显示的详细设计 驱动部分的代码: 头文件如下: #ifndef __1602_H__ #define __1602_H__ void RdBusy(void); void WrCommand(char command); void WrData(char wrdata); #endif 1602驱动源代码如下: /****************************************************************************** LCM1602驱动程序 8线间接控制方式 晶体频率12MHz ******************************************************************************/ /********************************************************* 1602LCD各引脚接口说明 VSS 电源地 VDD 电源正极 VL 液晶显示偏压 RS 数据/命令选择 R/W RW 读写选择/****************************************************************************** LCM1602驱动程序 8线间接控制方式 晶体频率12MHz ***************************************************************************- 7 -
***/ #include #include
/********************************************************* 1602LCD各引脚接口说明 VSS 电源地 VDD 电源正极 VL 液晶显示偏压 RS 数据/命令选择 R/W RW 读写选择 E 使能信号 D0 数据 背光源正极 D1 数据 背光源负极 *********************************************************/
/*1602接口定义*/ #define LCM P0
sbit RS = P2^5; //0,command; 1,datajkhjholkhkk sbit RW = P2^6; //0,write; 1,read sbit E = P2^7; //下降沿有效
/*常数定义*/ #define CMD 0 //RS=0,命令 #define DAT 1 //RS=1,数据
//模块忙闲判断 void RdBusy(void) - 8 -
{ char flag=0xff; do { LCM=0xff; RS=CMD; RW=1; E=1; _nop_(); _nop_(); _nop_(); //这三句很重要 flag=LCM; E=0; flag&=0x80; } while(flag); }
//写命令 void WrCommand(char command) { LCM=command; RS=CMD; RW=0; E=1; E=0; RW=1; RdBusy(); //等待LCM完成本次操作 } - 9 -
//写数据 void WrData(char wrdata) { LCM=wrdata; RS=DAT; RW=0; E=1; E=0; RW=1; RdBusy(); //等待LCM完成本次操作 } /* E 使能信号 D0 数据 背光源正极 D1 数据 背光源负极 *********************************************************/
显示头文件: #ifndef __DISPLAY_H__ #define __DISPLAY_H__ #define uchar unsigned char
void delayx5ms(int dcnt); void LcmInit(void); void ClrLine(uchar line ); void Write1Line(uchar line,uchar* buf); void WrData2Addr(uchar addr,uchar dat); void disall(); void offall();