19
主要内容:
电子钟是一种利用数字电路显示秒、分、时的计时装置。 与传统机械钟相比,它具有计时准确、显示直观、无需机械传动装置等优点,因而得到广泛应用。 同时,电子钟可以集成多种功能,如秒表、测温、液位检测等功能。
基本要求:
1.能够显示当前时间
2、第二次误差控制在1秒以内。
3、输出格式采用数字显示
4.给出一个范围。 设定时间时,不要超出范围,以完成循环。
主要参考资料:
[1] 于法山,王福忠. 《单片机原理及应用技术》。 中国矿业大学出版社. 2008年
[2] 彭伟. 《单片机C语言编程实训》电子工业出版社。 2010年。
[3] 杨凌霄. 《微型计算机原理及应用》。 中国电力出版社2003年
[4]李朝清. 单片机原理与接口技术(简明修订版)。 杭州:北京航空航天大学出版社,1998
[5]李光地. 单片机基础[M]. 北京:北京航空航天大学出版社,1994
[6] 严石. 数字电子技术基础(第三版)。 北京:高等教育出版社,1989
[7]DS18B20数据表
完成截止日期:2022年12月23日
导师签名:
课程负责人签名:
概括
本课程完成了数字电子钟的设计。 数字电子钟是一种以数字显示秒、分、时的计时装置。 由于数字集成电路技术的发展和先进石英技术的采用,数字时钟具有了计时的能力。 准确、性能稳定、携带方便等优点。 数字时钟已经成为人们日常生活中不可或缺的必需品,广泛应用于个人家庭和办公室等公共场所,给人们的生活带来了极大的便利。 在这里我们将把所学的零散的数字电路知识有机地、系统地连接起来,运用到实践中,培养我们综合分析和设计电路的能力。
关键词:电子钟; 门电路和单按键; 钥匙开关
目录
总结-2-
目录 – 3 –
1 设计要求 – 4 –
1.1 工作简介 – 4 –
1.2 基本功能 – 5 –
1.3 扩展功能 – 5 –
2 工作原理 – 5 –
2.1 硬件设计原理 – 5 –
2.1.1 LCD1602液晶显示器原理 – 6 –
2.1.2 LED模组原理 – 7 –
2.1.3 按钮原理 – 7 –
2.1.4 单片机核心模块时钟电路原理 – 8 –
2.2 软件设计原则 – 8 –
2.2.1 LCD1602液晶显示驱动器 – 9 –
2.1.2 DS18B20 数字温度计驱动器 – 10 –
2.1.3 按键去抖和长按检测 – 11 –
3. 使用说明 – 11 –
(1) 功能切换: – 11 –
(2) 时间校准: – 11 –
4.软件设计 – 12 –
5.实验模拟 – 12 –
6. 经验 – 13 –
7. 参考文献 – 13 –
附录:keil源码-14-
1 设计要求
1.1 工作简介
电子钟是一种利用数字电路显示秒、分、时的计时装置。 与传统机械钟相比,它具有计时准确、显示直观、无需机械传动装置等优点,因而得到广泛应用。 同时,电子钟可以集成多种功能,如秒表、测温、液位检测等功能。
本次单片机课程设计采用普中科技的A2开发板,如图1所示。板载单片机型号为AT89C52,采用C语言进行编程。
图1 普中A2开发板展示及成品课程设计
1.2 基本功能
1、电子钟可显示时、分、秒;
2、可手动调节时间,等待调节时时间闪烁;
1.3 扩展功能
1.可作为秒表使用;
2.可以测量当前环境温度;
3、通过LCD1602液晶屏显示数据和特殊图形;
2 工作原理
2.1 硬件设计原理
硬件设计基于普中A2开发板。 LCD1602接口、DS18B2O、独立按键模块、LED模块和单片机核心模块的电路连接如开发板原理图所示。 开发板原理图如附录1所示,各模块逻辑关系如下所示。
2.1.1 LCD1602液晶显示器原理
图2 LCD1602液晶屏
LCD1602液晶屏的实际图片如图2所示。LCD1602液晶显示屏的原理是利用液晶的物理特性,通过电压来控制其显示面积。 有电的时候就会有显示器,这样就可以显示图形了。 它由字符液晶显示器(LCD)、控制驱动主电路HD44780及其扩展驱动电路HD44100以及组装在PCB板上的少量电阻、电容和结构件组成。 其电气特性如图3所示。
显示容量:16×2字符
芯片工作电压4.5~5.5V
工作电流2.0mA(5.0V)
模块最佳工作电压5.0V
字符尺寸2.95mm×4.35mm(宽×高)
图3 LCD1602电气特性
图3 LCD1602接口
从图3所示的LCD1602接口图可以看出,LCD1602液晶屏由板载5V电压供电; VO引脚连接可调电阻,通过调节电阻值可以控制背光亮度; LCD RS、LCD WR、LCD EN分别连接单片机的P2.6、P2.5、P2.7,控制数据和命令的传输; LCD D0~LCD D7 连接至单片机的 P0 口,作为单片机与模块之间的数据传输通道。
2.1.2 LED模组原理
图7 LED模组
从图7可以看出,LED模块由8位共阳极发光二极管组成,串联限流电阻,阴极连接单片机的P2口。 当单片机P2口的某位输出低电平时,该位的二极管点亮。
2.1.3 按钮原理
图8 独立按键模块
从图8中可以看出,4个独立按键K1K4分别与单片机P3.1P3.3相连。 只有按下按钮才能通过读取引脚得到高电平1。 因此,可以分析引脚值电平来确定按钮是否被按下。
2.1.4 单片机核心模块时钟电路原理
图9 MCU核心模块
单片机时钟信号的产生采用内部振荡的方式,外接12MHZ晶振即可获得频率为12MHZ的时钟信号。 AT89C52芯片内部有一个高增益反相放大器,其输入端为芯片引脚XTAL1,输出端为引脚XTAL2。 将放大器与晶体振荡器和陶瓷电容器作为反馈元件连接,形成自激振荡器。
2.2 软件设计原则
电子时钟上电后,延时10ms等待外围设备状态稳定,初始化LCD1602,将字符模型数据写入用户自定义RAM区域,并在初始启动界面显示字体图案。 启动计数器T0,每20ms进入一次中断,为其他功能的实现提供参考时间,如计时、读取温度数据等。 在main函数中,会循环检测按钮,判断是否有按钮被按下。 如果有按钮按下,下一步进行相应操作,如功能切换、时间调整等。
时间计数值存储为长整型数据,对其进行相应操作即可得到时、分、秒,从00:00:00到23:59:59循环计数。 秒表每10ms计数一次,处理计数值,并将其显示在液晶屏上。 通过读取DS18B20数字温度计的寄存器得到的温度值进行分析处理,即可得到当前温度。
2.2.1 LCD1602液晶显示驱动
图10 LCD1602操作时序
LCD1602读/写数据/命令的时序如图10所示。单片机与其之间的通信应满足其要求。 LCD1602的功能可以通过在芯片手册中查找相应的寄存器地址和操作提示来实现。
2.1.2 DS18B20数字温度计驱动器
图11 DS18B20操作时序
主从机之间的通信采用单总线,即用一根线来发送和接收数据。 首先需要判断总线上是否有设备。 确认设备存在后,进行读/写操作。 在芯片手册中找到寄存器地址和操作提示来设置温度检测精度和温度值读取。
2.1.3 按键去抖和长按检测
图12 按键抖动示意图
当按下按钮时,与按钮相连的线路上的电压会发生波动。 如图12所示,它可能在5V TTL电平阈值附近波动。 如果程序只计算电平转换,则按下按钮时可能会出现波动。 当按下一次时,会记录很多次,所以我们需要对按钮进行去抖,并统计低电平时间来判断是短按还是长按。
3. 使用说明
使用K1、K2共2个按键
(1) 功能切换:
点击K1切换时间
(2)时间校准:
长按K2进入/退出时间调整菜单。 当菜单为时间调整时,点击K3切换选择时/分/秒进行调整。 待调整的时间将会闪烁。 点击K1,当前调整时间值+1。 击中 K2 将导致 -1。 时间调整完成后,按住K2保存当前时间值。 当LED灯闪烁一次时,表示时间调整成功。
菜单说明
4.软件设计
5. 实验模拟
6. 经验
在课程设计中,理论运用于实践,实践丰富理论。 对单片机的掌握将会更加深刻和富有成果。 在生产过程中也遇到了很多问题。 例如,LCD1602由于操作时序不正确而变得无响应,由于清晰的屏幕指令不合适而导致屏幕明显闪烁。 我们在整合处理DS18B20的高8位和低8位数据时也遇到了问题。 遇到的困难; 按键和长按复用功能的实现,抖动消除的详细处理等。通过在CSDN和B站上查找资源,并与同学交流,最终解决了问题。 但由于我的能力有限,我只能做出最好的成品。
微控制器有数千种型号。 随着时代的发展,单片机不断更新迭代。 只有掌握了单片机的基本原理和学习方法,基础扎实,任何单片机的开发才能成功。 你应该一步一步慢慢来。
国产MCU的崛起依然是我们的期盼,我们期待那一天的到来。 当那一天到来时,我们会发现国产MCU也能在世界上引起轰动。
参考
[1] 于法山,王福忠. 《单片机原理及应用技术》。 中国矿业大学出版社. 2008年
[2] 彭伟. 《单片机C语言编程实训》电子工业出版社。 2010年。
[3] 杨凌霄. 《微型计算机原理及应用》。 中国电力出版社2003年
[4]李朝清. 单片机原理与接口技术(简明修订版)。 杭州:北京航空航天大学出版社,1998
[5]李光地. 单片机基础[M]. 北京:北京航空航天大学出版社,1994
[6] 严石. 数字电子技术基础(第三版)。 北京:高等教育出版社,1989
[7]DS18B20数据表
附录:keil源码
#包括
sbit key1 = P1^0;
位标志 1s = 0;
位KeySta = 1;
无符号字符小时= 20;
无符号字符分钟= 30;
无符号字符第二个= 00;
无符号字符模式 = 0;
无效FreshTime();
无效时间初始化();
无效 IntInit();
无效 InitLedBuffer();
无效键扫描();
unsigned char code LedChar[] = { //12ÒõÊýÂë1ÜÏÔÊ⁄×Ö·ûת»»±í
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40,0x00,0x40};
unsigned char LedBuff[8] = { // ÊýÂë1ÜÏÔʤ»º3åÇø
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
无效主()
时间初始化();
IntInit();
初始化LedBuffer();
while(1)// 复制代码
if(flag1s&&!mode) // 说明
标志1s = 0;
新鲜时间();
else if(mode == 1) //У׼·ÖÖÓ
LedBuff[0] = 17;
LedBuff[1] = 17;
LedBuff[4] = 17;
LedBuff[5] = 17;
LedBuff[6] = 17;
LedBuff[7] = 17;//²»ÏÔÊ⁄
LedBuff[2] = 分钟/10;
LedBuffer[3] = 分钟;
else if(mode == 2) //У׼С ʱ
LedBuff[2] = 17;
LedBuffer[3] = 17;
LedBuff[4] = 17;
LedBuff[6] = 17;
LedBuff[7] = 17;
LedBuff[5] = 17;//²»ÏÔÊ⁄
LedBuff[0] = 小时/10;
LedBuff[1] = 小时;
else if(mode == 3) //У׼Íê³ÉÖØÐÂÏÔÊ⁄
初始化LedBuffer();
模式=0;
按键扫描();
void InitLedBuff()//∫∫∫∫∫∫∫∫∫∫∫∫∫∫∫∫
LedBuff[0] = 小时/10;
LedBuff[1] = 小时;
LedBuff[2] = 分钟/10;
LedBuffer[3] = 分钟;
LedBuff[4] = 第二/10;
LedBuffer[5] = 第二个;
LedBuffer[6] = 18;
LedBuffer[7] = 18;
void FreshTime()//设置
第二个++;
if(第二个 == 60)//
第二个= 0;
分钟++;
if(分钟 == 60)//分钟
分钟 = 0;
小时++;
if(小时 == 24)
小时=0;
LedBuff[0] = 小时/10;
LedBuff[1] = 小时;
LedBuff[2] = 分钟/10;
LedBuffer[3] = 分钟;
LedBuff[4] = 第二/10;
LedBuffer[5] = 第二个;
LedBuffer[6] = 18;