实验报告:基于单片机的LCD12864万年历及温度监测系统设计
背景介绍
本实验旨在设计并实现一个基于STC89C52单片机的LCD12864显示的万年历系统,同时集成温度传感器以实现温度监测功能。系统具备整点报时和闹钟功能,通过蜂鸣器进行提示。该设计不仅可以实现基本的时钟和温度显示,还具备一定的报警功能,适用于家庭或办公室等场景。
硬件介绍
- STC89C52单片机:作为系统的核心控制器,负责处理各项功能的实现。
- LCD12864显示屏:用于显示时间、日期和温度等信息。
- DS18B20温度传感器:用于实时监测环境温度。
- 蜂鸣器:用于整点报时和闹钟提示。
- 按键模块:用于用户设置时间和闹钟功能。
- 其他电子元件:如电阻、电容等,用于电路的搭建和稳定工作。
电路设计
电路主要由单片机、LCD显示屏、温度传感器和蜂鸣器组成。LCD12864显示屏与单片机通过并行接口连接,DS18B20温度传感器通过单线接口与单片机连接,蜂鸣器则通过单片机的I/O端口控制。
主要连接说明
- LCD12864显示屏 :
- 数据端口D0-D7连接单片机P0口。
- 控制信号RS、RW、E分别连接单片机的P2.0、P2.1、P2.2。
- DS18B20温度传感器 :
- 数据端口DQ连接单片机的P3.7口。
- 蜂鸣器 :
- 连接到单片机的P2.0口。
- 按键模块 :
- 各按键分别连接到单片机的P1口,用于扫描和检测按键状态。
软件设计
系统初始化
系统上电后首先进行初始化,包括LCD显示屏初始化、时钟初始化和中断初始化等。初始化代码如下:
c
void main( void )
{
uchar clock_time[6] = { 0X00, 0X59, 0X23, 0X09, 0X04, 0X11 }; /* 定义时间变量 秒 分 时 日 月 年 */
uchar alarm_time[2] = { 10, 06 }; /* 闹钟设置 alarm_time[0]: 分钟 alarm_time[1] :小时 */
uchar temperature[2]; /* 定义温度变量 temperature[0] 低8位 temperature[1] 高8位 */
Lcd_Initial(); /* LCD初始化 */
Clock_Fresh( clock_time ); /* 刷新时间 */
Clock_Initial( clock_time ); /* 时钟初始化 */
/* 中断初始化 */
EA = 1; /* 开总中断 */
ET0 = 1; /* Timer0 开中断 */
ET2 = 1; /* Timer2 开中断 */
TMOD = 0x01; /* Timer0 工作方式 1 */
RCAP2H = 0x3c;
RCAP2L = 0xb0; /* Timer2 延时 50 ms */
}
时间显示与更新
系统在主循环中不断刷新时间,并通过LCD显示屏显示出来。同时,通过DS18B20传感器读取温度值并显示在LCD上。
c
while ( 1 )
{
Clock_Fresh( clock_time ); /* 时间刷新 */
Lcd_Clock( clock_time ); /* 时间显示 */
Sensor_Fresh( temperature ); /* 温度更新 */
Lcd_Temperture( temperature ); /* 温度显示 */
/* 整点报时 */
if ( (*clock_time == 0x59) && (*(clock_time + 1) == 0x59) )
{
bell = 0;
TR2 = 1; /* 启动Timer2 */
}
/* 闹钟报警 */
if ( *alarm_time == HexNum_Convert( *(clock_time + 1) ) ) /* 分钟相吻合 */
if ( *(alarm_time + 1) == HexNum_Convert( *(clock_time + 2) ) ) /* 小时相吻合 */
{
bell = 0;
TR2 = 1; /* 启动Timer2 */
}
}
中断服务程序
系统中断服务程序主要包括Timer0和Timer2的中断服务,用于整点报时和闹钟功能。Timer0用于整点报时,每小时响三声,Timer2用于每分钟的时间校准。
c
void Timer0_Service() interrupt 1
{
static uchar count = 0;
static uchar flag = 0; /* 记录鸣叫的次数 */
count = 0;
TR0 = 0; /* 关闭Timer0 */
TH0 = 0x3c;
TL0 = 0XB0; /* 延时 50 ms */
TR0 = 1; /* 启动Timer0 */
count++;
if ( count == 20 ) /* 鸣叫 1 秒 */
{
bell = ~bell;
count = 0;
flag++;
}
if ( flag == 6 )
{
flag = 0;
TR0 = 0; /* 关闭Timer0 */
}
}
结论
通过本实验,我们成功设计并实现了一个基于STC89C52单片机的LCD12864显示的万年历和温度监测系统。系统具备时间显示、温度监测、整点报时和闹钟功能,硬件电路设计合理,软件程序逻辑清晰,能够稳定运行,满足设计需求。
资料
https://docs.qq.com/sheet/DUEdqZ2lmbmR6UVdU?tab=BB08J2