51单片机应用开发(进阶)---定时器应用(电子时钟)

实现目标

1、巩固定时器的配置流程;

2、掌握按键、数码管与定时器配合使用;

3、功能1:(1)简单显示时间。显示格式:88-88-88(时-分-秒)

4、功能2:(1)K1功能键,按下按键选中时分秒进行调节;(2)K2:数值+1;(3)K3:数值-1;(4)K4:确认键,设置数值后按下确认,开始走时;(5)显示格式:88-88-88(时-分-秒)

5、功能3:(1)上面功能上,轮流显示年月日


一、电子时钟

        电子时钟是一种使用电子技术来显示当前时间的设备。与传统的机械时钟不同,电子时钟通过电子电路和显示器来展示时间,通常具有更高的准确性和更多的功能。以下是关于电子时钟的简介:

1.1 基本结构

  1. 显示器:电子时钟的核心部分,用于显示时间。常见的显示器类型包括液晶显示屏(LCD)、发光二极管显示屏(LED)以及近年来逐渐兴起的有机发光二极管显示屏(OLED)。
  2. 电子电路:负责时间的计算、存储与显示。电子电路可以由模拟电路或数字电路构成,现代电子时钟多采用微处理器控制的数字电路。
  3. 电源:为电子时钟提供工作所需的电能。常见的电源类型包括电池、交流电源或两者的结合。

1.2 主要功能

  1. 时间显示:电子时钟可以准确显示当前的时间,包括小时、分钟和秒。
  2. 日期和星期显示:许多电子时钟还具备显示当前日期和星期的功能。
  3. 定时功能:可以设置闹钟或提醒功能,以便在特定时间发出声音或光信号。
  4. 其他功能:如温度显示、湿度显示、计时器、倒计时等附加功能,使电子时钟更加实用。

1.3 种类与特点

  1. 数字电子时钟:以数字形式显示时间,具有简洁明了的特点。数字电子时钟通常采用LED或LCD显示屏,易于读取且耗电量低。
  2. 模拟电子时钟:通过指针和表盘来模拟传统机械时钟的显示方式。模拟电子时钟通常具有更高的装饰性,适合追求复古或经典风格的用户。
  3. 智能电子时钟:结合了智能技术,如Wi-Fi连接、语音识别等,可以实现更多高级功能,如天气预报、音乐播放、智能家居控制等。智能电子时钟通常与智能手机或其他智能设备配合使用,提供更加个性化的用户体验。

1.4 技术原理

        电子时钟的工作原理主要基于晶体振荡器产生的稳定频率信号。这个信号经过分频、计数等处理后,可以得到精确的时间信息。微处理器或专用的时间控制芯片会根据这些信息来控制显示器的显示内容,从而实现时间的准确显示。

1.5应用领域

        电子时钟广泛应用于各个领域,包括家庭、办公室、公共场所等。由于其准确度高、功能丰富且易于携带,电子时钟已成为现代生活中不可或缺的时间测量工具。

二、原理图设计

  

三、程序设计

3.1  基本程序(不带按键功能)

#include <REGX52.H>//定义数码管位选信号控制脚
sbit LSA = P2^2;
sbit LSB = P2^3;
sbit LSC = P2^4;sbit K1 = P3^1;//按键K1
sbit K2 = P3^0;//按键K2char  H   = 22; //时计数
char  M   = 58; //分计数
char  S   = 45; //秒计数//共阴极数码管显示0~F的段码数据
unsigned char gsmg_code[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40};void delay_10us(int ten_us)
{while(ten_us--);	
}unsigned int g_Count;  //全局变量默认初始化为0void Timer1_Init(void)
{TMOD = 0x10; //设置定时器1 工作模式1   0001 0000  TR1 = 1;     //开启定时器1TH1 = (65536-1000)/256;  //设置定时初值,高8位TL1 = (65536-1000)%256;  //设置定时初值,低8位ET1 = 1;  //开启定时器1 中断EA  = 1;  //开启总中断
}void main(void)
{Timer1_Init();  //定时器1初始化while(1){LSC=1;LSB=1;LSA=1;P0 = gsmg_code[H/10];delay_10us(5);P0 = 0x00;//消影LSC=1;LSB=1;LSA=0;P0 = gsmg_code[H%10];		delay_10us(5);P0 = 0x00;//消影LSC=1;LSB=0;LSA=1;P0 = gsmg_code[16];delay_10us(5);P0 = 0x00;//消影LSC=1;LSB=0;LSA=0;P0 = gsmg_code[M/10];		delay_10us(5);P0 = 0x00;//消影	LSC=0;LSB=1;LSA=1;P0 = gsmg_code[M%10];delay_10us(5);P0 = 0x00;//消影LSC=0;LSB=1;LSA=0;P0 = gsmg_code[16];delay_10us(5);P0 = 0x00;//消影LSC=0;LSB=0;LSA=1;P0 = gsmg_code[S/10];		delay_10us(5);P0 = 0x00;//消影	LSC=0;LSB=0;LSA=0;P0 = gsmg_code[S%10];delay_10us(5);P0 = 0x00;//消影		}
}void Timer1_Rountine(void) interrupt 3  //1ms进一次中断
{TH1 = (65536-1000)/256;  //TL1 = (65536-1000)%256;  //重新赋初值才能保证下一次还是1msg_Count++;if(g_Count>=1000)  // 1S 计时{g_Count = 0;   //计数清零S++;if(S > 59)//1Min{S = 0;M++;if(M > 59)//1H{M = 0;H++;if(H > 23)//1H{H = 0;				}}}	}
}

3.2  带按键调值功能程序

#include <REGX52.H>//定义数码管位选信号控制脚
sbit LSA = P2^2;
sbit LSB = P2^3;
sbit LSC = P2^4;sbit K1 = P3^1;//按键K1
sbit K2 = P3^0;//按键K2
sbit K3 = P3^2;//按键K3
sbit K4 = P3^3;//按键K4char  H   = 22; //时计数
char  M   = 58; //分计数
char  S   = 45; //秒计数char  mode = 0; //模式 //共阴极数码管显示0~F的段码数据
unsigned char gsmg_code[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40};void delay_10us(int ten_us)
{while(ten_us--);	
}unsigned int g_Count;  //全局变量默认初始化为0void Timer1_Init(void)
{TMOD = 0x10; //设置定时器1 工作模式1   0001 0000  TR1 = 1;     //开启定时器1TH1 = (65536-1000)/256;  //设置定时初值,高8位TL1 = (65536-1000)%256;  //设置定时初值,低8位ET1 = 1;  //开启定时器1 中断EA  = 1;  //开启总中断
}void main(void)
{Timer1_Init();  //定时器1初始化while(1){LSC=1;LSB=1;LSA=1;P0 = gsmg_code[H/10];delay_10us(5);P0 = 0x00;//消影LSC=1;LSB=1;LSA=0;P0 = gsmg_code[H%10];		delay_10us(5);P0 = 0x00;//消影LSC=1;LSB=0;LSA=1;P0 = gsmg_code[16];delay_10us(5);P0 = 0x00;//消影LSC=1;LSB=0;LSA=0;P0 = gsmg_code[M/10];		delay_10us(5);P0 = 0x00;//消影	LSC=0;LSB=1;LSA=1;P0 = gsmg_code[M%10];delay_10us(5);P0 = 0x00;//消影LSC=0;LSB=1;LSA=0;P0 = gsmg_code[16];delay_10us(5);P0 = 0x00;//消影LSC=0;LSB=0;LSA=1;P0 = gsmg_code[S/10];		delay_10us(5);P0 = 0x00;//消影	LSC=0;LSB=0;LSA=0;P0 = gsmg_code[S%10];delay_10us(5);P0 = 0x00;//消影	if(K1 == 0)//如果按键K1按下{while(!K1);//松手检测TR1 = 0;mode++;if(mode >3)mode = 1;}if(K4 == 0)//如果按键K4按下{while(!K4);//松手检测TR1 = 1; mode = 0;}		if(K2 == 0)//如果按键K2按下{while(!K2);//松手检测switch (mode){case 1:H++;if(H > 23){H = 0;				}break;case 2:M++;if(M > 59){M = 0;				}					break;case 3:S++;if(S > 59){S = 0;				}										break;}}if(K3 == 0)//如果按键K2按下{while(!K3);//松手检测switch (mode){case 1:H--;if(H < 0){H = 23;				}break;case 2:M--;if(M < 0){M = 59;				}					break;case 3:S--;if(S < 0){S = 59;				}										break;}}}
}void Timer1_Rountine(void) interrupt 3  //1ms进一次中断
{TH1 = (65536-1000)/256;  //TL1 = (65536-1000)%256;  //重新赋初值才能保证下一次还是1msg_Count++;if(g_Count>=1000)  // 1S 计时{g_Count = 0;   //计数清零S++;if(S > 59)//1Min{S = 0;M++;if(M > 59)//1H{M = 0;H++;if(H > 23)//1H{H = 0;				}}}	}
}

3.3  轮换显示年月日功能程序

#include <REGX52.H>//定义数码管位选信号控制脚
sbit LSA = P2^2;
sbit LSB = P2^3;
sbit LSC = P2^4;sbit K1 = P3^1;//按键K1
sbit K2 = P3^0;//按键K2
sbit K3 = P3^2;//按键K3
sbit K4 = P3^3;//按键K4char  H   = 22; //时计数
char  M   = 58; //分计数
char  S   = 45; //秒计数char  mode = 0; //模式 
bit   Display_falg = 0; //显示标志位
char  S1   = 0; //秒计数
char  S2   = 0; //秒计数
//共阴极数码管显示0~F的段码数据
unsigned char gsmg_code[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40};void delay_10us(int ten_us)
{while(ten_us--);	
}unsigned int g_Count;  //全局变量默认初始化为0void Timer1_Init(void)
{TMOD = 0x10; //设置定时器1 工作模式1   0001 0000  TR1 = 1;     //开启定时器1TH1 = (65536-1000)/256;  //设置定时初值,高8位TL1 = (65536-1000)%256;  //设置定时初值,低8位ET1 = 1;  //开启定时器1 中断EA  = 1;  //开启总中断
}void main(void)
{Timer1_Init();  //定时器1初始化while(1){if (Display_falg == 1){LSC=1;LSB=1;LSA=1;P0 = gsmg_code[2];delay_10us(5);P0 = 0x00;//消影LSC=1;LSB=1;LSA=0;P0 = gsmg_code[4];		delay_10us(5);P0 = 0x00;//消影LSC=1;LSB=0;LSA=1;P0 = gsmg_code[16];delay_10us(5);P0 = 0x00;//消影LSC=1;LSB=0;LSA=0;P0 = gsmg_code[1];		delay_10us(5);P0 = 0x00;//消影	LSC=0;LSB=1;LSA=1;P0 = gsmg_code[1];delay_10us(5);P0 = 0x00;//消影LSC=0;LSB=1;LSA=0;P0 = gsmg_code[16];delay_10us(5);P0 = 0x00;//消影LSC=0;LSB=0;LSA=1;P0 = gsmg_code[0];		delay_10us(5);P0 = 0x00;//消影	LSC=0;LSB=0;LSA=0;P0 = gsmg_code[8];delay_10us(5);P0 = 0x00;//消影		}else{LSC=1;LSB=1;LSA=1;P0 = gsmg_code[H/10];delay_10us(5);P0 = 0x00;//消影LSC=1;LSB=1;LSA=0;P0 = gsmg_code[H%10];		delay_10us(5);P0 = 0x00;//消影LSC=1;LSB=0;LSA=1;P0 = gsmg_code[16];delay_10us(5);P0 = 0x00;//消影LSC=1;LSB=0;LSA=0;P0 = gsmg_code[M/10];		delay_10us(5);P0 = 0x00;//消影	LSC=0;LSB=1;LSA=1;P0 = gsmg_code[M%10];delay_10us(5);P0 = 0x00;//消影LSC=0;LSB=1;LSA=0;P0 = gsmg_code[16];delay_10us(5);P0 = 0x00;//消影LSC=0;LSB=0;LSA=1;P0 = gsmg_code[S/10];		delay_10us(5);P0 = 0x00;//消影	LSC=0;LSB=0;LSA=0;P0 = gsmg_code[S%10];delay_10us(5);P0 = 0x00;//消影		}if(K1 == 0)//如果按键K1按下{while(!K1);//松手检测TR1 = 0;mode++;if(mode >3)mode = 1;}if(K4 == 0)//如果按键K4按下{while(!K4);//松手检测TR1 = 1; mode = 0;}		if(K2 == 0)//如果按键K2按下{while(!K2);//松手检测switch (mode){case 1:H++;if(H > 23){H = 0;				}break;case 2:M++;if(M > 59){M = 0;				}					break;case 3:S++;if(S > 59){S = 0;				}										break;}}if(K3 == 0)//如果按键K2按下{while(!K3);//松手检测switch (mode){case 1:H--;if(H < 0){H = 23;				}break;case 2:M--;if(M < 0){M = 59;				}					break;case 3:S--;if(S < 0){S = 59;				}										break;}}}
}void Timer1_Rountine(void) interrupt 3  //1ms进一次中断
{TH1 = (65536-1000)/256;  //TL1 = (65536-1000)%256;  //重新赋初值才能保证下一次还是1msg_Count++;if(g_Count>=1000)  // 1S 计时{g_Count = 0;   //计数清零S++;if(++S1 == 5){S1 = 0;Display_falg = 1;}if(Display_falg == 1){if(++S2 == 2){S2 = 0;Display_falg = 0;}}		if(S > 59)//1Min{S = 0;M++;if(M > 59)//1H{M = 0;H++;if(H > 23)//1H{H = 0;				}}}	}
}

四、实验效果

五、仿真实现


总结

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/886032.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

FPGA实现PCIE采集电脑端视频转SFP光口万兆UDP输出,基于XDMA+GTX架构,提供2套工程源码和技术支持

目录 1、前言工程概述免责声明 2、相关方案推荐我已有的PCIE方案10G Ethernet Subsystem实现万兆以太网物理层方案 3、PCIE基础知识扫描4、工程详细设计方案工程设计原理框图电脑端视频PCIE视频采集QT上位机XDMA配置及使用XDMA中断模块FDMA图像缓存UDP视频组包发送UDP协议栈MAC…

使用 unicorn 和 capstone 库来模拟 ARM Thumb 指令的执行(一)

import binascii import unicorn import capstonedef printArm32Regs(mu):for i in range(66,78):print("R%d,value:%x"%(i-66,mu.reg_read(i)))def testhumb():CODE b\x1C\x00\x0A\x46\x1E\x00"""MOV R3, R0 的机器码&#xff1a;0x1C 0x00&#xf…

git重置的四种类型(Git Reset)

git区域概念 1.工作区:IDEA中红色显示文件为工作区中的文件 (还未使用git add命令加入暂存区) 2.暂存区:IDEA中绿色(本次还未提交的新增的文件显示为绿色)或者蓝色(本次修改的之前版本提交的文件但本次还未提交的文件显示为蓝色)显示的文件为暂存区中的文件&#xff08;使用了…

第三十一天|贪心算法| 56. 合并区间,738.单调递增的数字 , 968.监控二叉树

目录 56. 合并区间 方法1&#xff1a;fff 看方法2&#xff1a;fff优化版 方法3&#xff1a; 738.单调递增的数字 968.监控二叉树&#xff08;贪心二叉树&#xff09; 56. 合并区间 判断重叠区间问题&#xff0c;与452和435是一个套路 方法1&#xff1a;fff 看方法2&am…

LeetCode 热题100(八)【二叉树】(3)

目录 8.11二叉树展开为链表&#xff08;中等&#xff09; 8.12从前序与中序遍历序列构造二叉树&#xff08;中等&#xff09; 8.13路径总和III&#xff08;中等&#xff09; 8.14二叉树的最近公共祖先&#xff08;中等&#xff09; 8.15二叉树中的最大路径和&#xff08;困…

AutoSAR CP DoIP规范导读

主要功能和用途 诊断通信协议实现 遵循标准&#xff1a;遵循ISO 13400 - 2标准&#xff0c;实现了诊断通信在IP网络上的传输协议和网络层服务&#xff0c;包括数据封装、传输、路由等功能。 多种消息支持 车辆识别与公告&#xff1a;能够进行车辆识别请求和响应&#xff0c;…

Simulink中Matlab function使用全局变量

目录 一. 引言二. 普通Matlab function使用全局变量三. Simulink中的Matlab function使用全局变量四. 如何利用Matlab function的全局变量施加随机噪声 一. 引言 最近发现了之前仿真中的一个问题&#xff0c;记录一下备忘。 Matlab function中有时候需要用到全局变量&#xf…

屏幕缩放后截屏图片尺寸数字偏大导致前端DOM尺寸设置失真问题

如果显示器的尺寸缩放&#xff0c;而不是100%的话&#xff0c;利用截屏软件截取屏幕中的区域&#xff0c;截取时读取到的区域尺寸&#xff0c;就会失真&#xff1b;如果使用这个尺寸去设置网页中的DOM&#xff0c;则Dom的尺寸也会跟着失真。 比如&#xff0c; 如果使用失真…

蓝桥杯每日真题 - 第7天

题目&#xff1a;&#xff08;爬山&#xff09; 题目描述&#xff08;X届 C&C B组X题&#xff09; 解题思路&#xff1a; 前缀和构造&#xff1a;为了高效地计算子数组的和&#xff0c;我们可以先构造前缀和数组 a&#xff0c;其中 a[i] 表示从第 1 个元素到第 i 个元素的…

给阿里云OSS绑定域名并启用SSL

为什么要这么做&#xff1f; 问题描述&#xff1a; 当用户通过 OSS 域名访问文件时&#xff0c;OSS 会在响应头中增加 Content-Disposition: attachment 和 x-oss-force-download: true&#xff0c;导致文件被强制下载而不是预览。这个问题特别影响在 2022/10/09 之后新开通 OS…

电脑浏览器打不开网页怎么办 浏览器无法访问网页解决方法

我们在使用电脑的时候&#xff0c;使用浏览器是经常的&#xff0c;很多用户在点开浏览器时&#xff0c;却遇到浏览器无法访问网页的情况。那么电脑浏览器打不开网页是什么原因呢&#xff1f;今天小编就给大家分享几个常见的原因和具体的解决方法&#xff0c;希望能对大家有所帮…

(干货)Jenkins使用kubernetes插件连接k8s的认证方式

#Kubernetes插件简介 Kubernetes 插件的目的是能够使用 Kubernetes 配合&#xff0c;实现动态配置 Jenkins 代理&#xff08;使用 Kubernetes 调度机制来优化负载&#xff09;&#xff0c;在执行 Jenkins Job 构建时&#xff0c;Jenkins Master 会在 kubernetes 中创建一个 Sla…

C语言 | Leetcode C语言题解之第556题下一个更大元素III

题目&#xff1a; 题解&#xff1a; int nextGreaterElement(int n){int x n, cnt 1;for (; x > 10 && x / 10 % 10 > x % 10; x / 10) {cnt;}x / 10;if (x 0) {return -1;}int targetDigit x % 10;int x2 n, cnt2 0;for (; x2 % 10 < targetDigit; x2…

TDesign了解及使用

文章目录 1、概述2、快速开始2.1使用 npm 安装2.2通过 浏览器引入 安装2.3、使用 3、简单案例3.1 路由创建3.2、 页面创建3.3、 Table组件3.4、序号展示3.5、 图片展示及预览3.6、 性别字段处理 1、概述 TDesign 是腾讯推出的设计系统&#xff0c;旨在提供一致的设计语言和视觉…

计算机网络(11)和流量控制补充

这一篇对数据链路层中的和流量控制进行详细学习 流量控制&#xff08;Flow Control&#xff09;是计算机网络中确保数据流平稳传输的技术&#xff0c;旨在防止数据发送方发送过多数据&#xff0c;导致接收方的缓冲区溢出&#xff0c;进而造成数据丢失或传输失败。流量控制通常…

可扩展架构与分层架构

可扩展架构 1 概述 软件系统与硬件/建筑系统最大的区别就是可以迭代升级和扩展&#xff0c;一个硬件生产出来后就不会进行改变&#xff0c;除非拿去售后维修&#xff0c;一个建筑完工后也不会改变其整体的结构&#xff0c;除非被破坏后进行修复和重铸 可以发现如果硬件/建筑不…

MyBatis从入门到进阶

目录 MyBatis入门1、创建项目、数据准备2、数据库配置3、编写持久层代码单元测试打印日志 基本操作查询数据插入数据删除数据更新数据 MyBatis - xml插入数据更新数据删除数据查询数据#{}与${}SQL注入排序like查询 MyBatis进阶if标签trim标签where标签set标签foreach标签sql标签…

TensorFlow 2.0 环境配置

官方文档&#xff1a;CUDA Installation Guide for Windows 官方文档有坑&#xff0c;windows的安装指南直接复制了linux的指南内容&#xff1a;忽略这些离谱的信息即可。 可以从官方文档知悉&#xff0c;cuda依赖特定版本的C编译器。但是我懒得为了一个编译器就下载整个visua…

浅谈:基于三维场景的视频融合方法

视频融合技术的出现可以追溯到 1996 年 , Paul Debevec等 提出了与视点相关的纹理混合方法 。 也就是说 &#xff0c; 现实的漫游效果不是从摄像机的角度来看 &#xff0c; 但其仍然存在很多困难 。基于三维场景的视频融合 &#xff0c; 因其直观等特效在视频监控等相关领域有着…

亚马逊评论爬虫+数据分析

爬取评论 做分析首先得有数据&#xff0c;数据是核心&#xff0c;而且要准确&#xff01; 1、爬虫必要步骤&#xff0c;选好框架 2、开发所需数据 3、最后测试流程 这里我所选框架是seleniumrequest&#xff0c;很多人觉得selenium慢&#xff0c;确实不快&#xff0c;仅针对此…