STC89C52RC单片机实现简单定时闹钟+LCD1602+DS1302

您所在的位置:网站首页 单片机电子闹钟 STC89C52RC单片机实现简单定时闹钟+LCD1602+DS1302

STC89C52RC单片机实现简单定时闹钟+LCD1602+DS1302

2023-09-23 07:15| 来源: 网络整理| 查看: 265

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

目录

前言

一、各模块基本原理

1、DS1302.

1.介绍。

2.内部结构。

3.时钟日历控制寄存器

4.DS130231字节的RAM寄存器

5.DS1302的工作模式寄存器

6.DS1320的通信时序

2、LCD1602

1.LCD1602液晶显示屏

2、LCD1602主要参数

3、LCD1602引脚接线:

​编辑4、各引脚的功能介绍如下:

5、标准字库表(CGROM):

二、代码详情

1.DS1302初始化程序

2.LCD1602

3.主要功能程序

三、proteus仿真图部分。

1、总仿真图

2、蜂鸣器模块

四、立创EDA进行功能部分。

1、立创EDA原理图

2、pcb平面图

3、总实物图

总结

前言

本人首次发表csdn,作品为本人单片机课设,主要利用主控芯片STC89C52RC进行控制,其中时序模块有DS1302+LCD1602构成,最后实现简单的定时闹钟,其中时间可调,闹钟可调。

同时再次声明:本人为嵌入式小白,欢迎各位大佬指正。

提示:以下是本篇文章正文内容,下面案例可供参考

一、各模块基本原理 1、DS1302. 1.介绍。

DS1302是一种串行接口的实时时钟,芯片内部具有可编程的日历时钟和31个字节的静态RAM。

2.内部结构。

(1)SCLK:串行时钟输入端,控制数据输入与输出。 (2)I/O:双向输入线 (3)CE:使能端,CE为高时允许DS1302读写数据,CE端为低时DS1302数据不可读写 (4)X1与X2:外接32.768的圆形晶振,给时钟芯片提供晶振频率。

3.时钟日历控制寄存器

(1)秒寄存器(0X81,0X80): 当CH=1秒位停止关闭。 (2)小时寄存器(0x85,0x84):当BIT7为1时为12小时制,当BIT7为0时为24小时制。 (3)控制寄存器(0x8f,0x8e):当WP为1时,不能对Ds1302做任何操作。

4.DS130231字节的RAM寄存器

就是断电后仍然存在的数据区域

5.DS1302的工作模式寄存器

突发模式就是一次性转输多个字节的的数据到时钟或RAM

请添加图片描述

6.DS1320的通信时序

(1)从最低位开始 (2)读写数据:都是CE端由低到高,然后前8位,写命令字节,后8位,写数据字节。 ———————————————— 版权声明:本原理部分为CSDN博主「普通的不普通少年」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/qq_54674051/article/details/119332650。

2、LCD1602 1.LCD1602液晶显示屏

LCD ( Liquid Crystal Display 的简称)液晶显示器。能够同时显示16x2,32个字符,是一种专门用来显示字母、数字、符号等的点阵型液晶模块。

LCD1602液晶显示器是广泛使用的一种字符型液晶显示模块。它是由字符型液晶显示屏(LCD)、控制驱动主电路HD44780及其扩展驱动电路HD44100,以及少量电阻、电容元件和结构件等装配在PCB板上而组成。该显示屏的优点是耗电量低、体积小、辐射低。

LCD1602主要用来显示数字、字母、图形以及少量自定义字符。可以显示2行16个字符,拥有16个引脚,其中8位数据总线D0-D7,和RS、R/W、EN三个控制端口,工作电压为5V,并且带有字符对比度调节V0和背光源AK。

在这里插入图片描述

注: 我们所用的LCD屏的命名,基本都是按照其分辨率来进行命名的 比如lcd1602 就是分辨率为16×2 lcd12864 就是分辨率为128×64

2、LCD1602主要参数

显示字符:16×2个字符 工作电压:4.5~5V 工作电流:2.0mA 工作温度:-20°C~70°C 模块最佳工作电压:5.0V 单个字符尺寸2.95×4.35(W×Hmm) 引脚:16脚

3、LCD1602引脚接线:

在这里插入图片描述 4、各引脚的功能介绍如下:

 

引脚1(VSS/GND)::地引脚

引脚2(VDD/VCC):电源引脚

引脚3(VL):液晶显示器对比度引脚,接正电源时对比度最弱,接地时对比度最高,使用时可以通过外接一个电位器调整其对比度。

引脚4(RS):寄存器选择脚,高电平时选择数据寄存器、低电平时选择指令寄存器。

引脚5(R/W):读(read)/写(write)信号线,高电平时进行读操作,低电平时进行写操作。当RS和R/W共同为低电平时可以写入指令或显示地址;当RS为低电平,R/W为高电平时,可以读忙信号;当RS为高电平,R/W为低电平时,可以写入数据。

引脚6(E):使能端,当E端由高电平跳变为低电平时,液晶模块执行命令。

引脚7-14(D0~D7): 8位双向数据线 用于单片机向1602写入数据和从1602读取数据

引脚15:背光源正极

引脚16:背光源负极

LCD1602共16个管脚,但分类很好分类, 其中一个VCC和GND用于给1602供电, 一个VCC和GND用于给背光源供电, 剩下三个功能引脚:RS(数据命令选择端),R/W(读写选择端),E(使能信号), 还有8个D0~D7分别为8位双向数据线传输数据。

RS为寄存器选择,高电平选择数据寄存器,低电平选择指令寄存器。 R/W为读写选择,高电平进行读操作,低电平进行写操作。 E端为使能端,后面和时序联系在一起。 LCD1602的RAM地址映射及标准字库表 LCD1602,总共显示为16行2列,对应着32个RAM地址,在使用的时候,需要在哪个位置显示,就写入对应的RAM地址,然后再写入需要的字符,对应就会显示该字符。

液晶显示模块是一个慢显示器件,所以在执行每条指令之前一定要确认模块的忙标志为低电平,表示LCD此时不忙,这时才能写指令和数据,否则此指令失效。要显示字符时要先输入显示字符地址(写指令),也就是告诉模块在,哪里显示字符,然后再写入需要显示的字符(写数据),才能够正常显示字符

下图是1602的内部显示地址 一共32个地址,对应2行16列

5、标准字库表(CGROM):

这个ROM中固化了一些我们常用的ASCII字符以及部分日文字符的点阵数据,需要写入那个字符,就直接设置对应进制码就可以,比如大写的字母A,代码是0100 0001(41H) 与ASCII码一致。也就是表中的ASCII码字符的地址和实际的ASCII码字符是一样的

LCD1602读写操作 LCD1602分为读操作和写操作

其中读操作可以分为读状态和读数据,写操作可以分为写指令和写数据。

读状态: 读取LCD引脚状态,返回为状态字,D0-D6为当前LCD数据指针的地址 D7为是否允许读写操作(即检查LCD是否处于忙状态)

读数据:读取D0-07内的数据

写指令: 写入LCD的控制指令,比如清屏,显示开关等

写数据: 写入需要显示的数据,比方说要显示字符a,就写入0100 0001(41H)

读状态     引脚电平:RS=L,RW=H,E=H    输出:D0~D7=状态字 读数据     引脚电平:RS=H,RW=H,E=H    输出:D0~D7的数据 写指令     引脚电平:RS=L,RW=L,D0~D7=指令码,E=高脉冲    输出:无 写数据     引脚电平:RS=H,RW=L,D0~D7=数据,E=高脉冲    输出:无 以51单片机为例,D0-D7接到P0口 RW RW EN接到任意两个口

读写操作的时序图如下:

读操作时序:在这里插入图片描述

写操作时序: 我们来分析一下时序图,当我们要写指令的时候,RS置为低电平,RW置为低电平,EN置为低电平,然后将指令数据送到数据口D0~D7,延时tsp1,让1602准备接收数据,这时候将EN拉高,产生一个上升沿,这时候指令就开始写入LCD,延时一段时间,将EN置低电平。

当我们要写数据的时候,RS置为高电平,RW置为低电平,EN置为低电平,然后将指令数据送到数据口D0~D7,延时tsp1,让1602准备接收数据,这时候将EN拉高,产生一个上升沿,这时候数据就开始写入LCD,延时一段时间,将EN置低电平。 ———————————————— 版权声明:本原理部分为CSDN博主「Z小旋」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/as480133937/article/details/113148712

二、代码详情 1.DS1302初始化程序

代码如下(示例):

#include "ds1302.h" #include "intrins.h" //---DS1302写入和读取时分秒的地址命令---// //---秒分时日月周年 最低位读写位;-------// u8 gREAD_RTC_ADDR[3] = {0x81, 0x83, 0x85,}; u8 gWRITE_RTC_ADDR[3] = {0x80, 0x82, 0x84}; //---DS1302时钟初始化2021年5月20日星期四13点51分47秒。---// //---存储顺序是秒分时日月周年,存储格式是用BCD码---// u8 gDS1302_TIME[3] = {0x47, 0x51, 0x13}; void ds1302_write_byte(u8 addr,u8 dat) { u8 i=0; DS1302_RST=0; _nop_(); DS1302_CLK=0;//CLK低电平 _nop_(); DS1302_RST=1;//RST由低到高变化 _nop_(); for(i=0;i>=1; DS1302_CLK=1; _nop_(); DS1302_CLK=0;//CLK由低到高产生一个上升沿,从而写入数据 _nop_(); } for(i=0;i>=1; DS1302_CLK=1; _nop_(); DS1302_CLK=0; _nop_(); } DS1302_RST=0;//RST拉低 _nop_(); } u8 ds1302_read_byte(u8 addr) { u8 i=0; u8 temp=0; u8 value=0; DS1302_RST=0; _nop_(); DS1302_CLK=0;//CLK低电平 _nop_(); DS1302_RST=1;//RST由低到高变化 _nop_(); for(i=0;i>=1; DS1302_CLK=1; _nop_(); DS1302_CLK=0;//CLK由低到高产生一个上升沿,从而写入数据 _nop_(); } for(i=0;i=0x60)g_calendar.alarm_time[0]=0; break; case 1: g_calendar.alarm_time[1]++; if((g_calendar.alarm_time[1]&0x0f)>9)g_calendar.alarm_time[1]+=6; if(g_calendar.alarm_time[1]>=0x24)g_calendar.alarm_time[1]=0; break; case 2: g_calendar.alarm=!g_calendar.alarm; break; case 3: g_calendar.time_choice=0; break; } } } } void calendar_show(void)//时钟显示 { u8 time_buf[9]; if(g_calendar.mode==0)//正常模式显示 { g_calendar.sec=gDS1302_TIME[0]; g_calendar.min=gDS1302_TIME[1]; g_calendar.hour=gDS1302_TIME[2]; calendar_datapros(time_buf); lcd1602_show_string(0,1,time_buf); if(g_calendar.alarm) { lcd1602_show_string(0,0,alarm_switch_str); lcd1602_show_string(7,0,alarm_on_str); } else { lcd1602_show_string(0,0,alarm_switch_str); lcd1602_show_string(7,0,alarm_off_str); } } else if(g_calendar.mode==1)//时钟设置模式显示 { calendar_datapros(time_buf); lcd1602_show_string(0,1,time_buf); } else if(g_calendar.mode==2)//闹钟设置模式显示 { alarm_datapros(time_buf); lcd1602_show_string(0,1,time_buf); if(g_calendar.alarm) lcd1602_show_string(7,0,alarm_on_str); else lcd1602_show_string(7,0,alarm_off_str); } } void alarm_compareproc(void) { if(g_calendar.alarm&&g_calendar.setok) { if(g_calendar.alarm_time[1]==g_calendar.hour) { if(g_calendar.alarm_time[0]==g_calendar.min)//对比闹钟设置时间和当前时间,相同则闹铃 { beep_alarm(10); g_calendar.setok=0; } } } else if (g_calendar.setok==0) { BEEP=1; } } void calendar_test(void) { u8 key_temp=0; lcd1602_init(); ds1302_init(); time0_init();//定时器10ms while(1) { key_temp=key_scan(0); if(key_temp==KEY1_PRESS)//模式设置 { g_calendar.mode++; if(g_calendar.mode==3) g_calendar.mode=1; g_calendar.setok=0; g_calendar.time_choice=0; if(g_calendar.mode==2)//按K1两下,进入闹钟设置 { lcd1602_clear(); lcd1602_show_string(0,0,alarm_switch_str); } // beep_alarm(50,10); } else if(key_temp==KEY2_PRESS)//进入设置模式 { g_calendar.time_choice++; if(g_calendar.time_choice==3) g_calendar.time_choice=0; // beep_alarm(50,10); } else if(key_temp==KEY3_PRESS)//进入设置模式 { g_calendar.add=1; // beep_alarm(50,10); } else if(key_temp==KEY4_PRESS)//设置完成,恢复正常显示模式 { g_calendar.setok=1; g_calendar.time_choice=0; g_calendar.mode=0; calendar_save_set_time(); // beep_alarm(50,10); } if(g_calendar.mode==1)//模拟光标闪烁 { if(g_calendar.time_choice


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3