当前位置: 首页 > news >正文

51单片机基础(C语言):定时器时钟

 1.使用定时器 1 和LCD1602设计一个简易数字时钟。

main.c

#include <REGX52.H>
#include "Delay.h"
#include "LCD1602.h"
#include "Timer0.h"unsigned char Sec=55,Min=59,Hour=23;void main()
{LCD_Init();Timer0Init();LCD_ShowString(1,1,"Clock:");	//上电显示静态字符串LCD_ShowString(2,1,"  :  :");while(1){LCD_ShowNum(2,1,Hour,2);	//显示时分秒LCD_ShowNum(2,4,Min,2);LCD_ShowNum(2,7,Sec,2);}
}void Timer0_Routine() interrupt 1
{static unsigned int T0Count;TL0 = 0x18;		//设置定时初值TH0 = 0xFC;		//设置定时初值T0Count++;if(T0Count>=1000)	//定时器分频,1s{T0Count=0;Sec++;			//1秒到,Sec自增if(Sec>=60){Sec=0;		//60秒到,Sec清0,Min自增Min++;if(Min>=60){Min=0;	//60分钟到,Min清0,Hour自增Hour++;if(Hour>=24){Hour=0;	//24小时到,Hour清0}}}}
}

Timer0.c

#include <REGX52.H>/*** @brief  定时器0初始化,1毫秒@12.000MHz* @param  无* @retval 无*/
void Timer0Init(void)
{TMOD &= 0xF0;		//设置定时器模式TMOD |= 0x01;		//设置定时器模式TL0 = 0x18;		//设置定时初值TH0 = 0xFC;		//设置定时初值TF0 = 0;		//清除TF0标志TR0 = 1;		//定时器0开始计时ET0=1;EA=1;PT0=0;
}/*定时器中断函数模板
void Timer0_Routine() interrupt 1
{static unsigned int T0Count;TL0 = 0x18;		//设置定时初值TH0 = 0xFC;		//设置定时初值T0Count++;if(T0Count>=1000){T0Count=0;}
}
*/

Timer0.h

#ifndef __TIMER0_H__
#define __TIMER0_H__void Timer0Init(void);#endif

2. 使用定时器 0 和数码管设计一个数字时钟。

1.动态数码管显示,点亮一瞬间,显示00—00—00

2.定时器中断,每隔一秒秒钟加一,过六十,分钟加一,到达24:00:00,变为00:00:00

比如 00—00—01    00—01—00

3.完成以上两个任务,就完成了与第一个题一样的效果了,

现在加入第三个模块,独立按键模块,我们规定如下:

1.独立按键一:按下按键,暂停,再按下,启动,(刚开始是暂停的)

2.独立按键二:暂停情况,修改时钟个位,个位加一,个位加到10,十位进一,加到24,变为0;

3.独立按键三:暂停情况,修改分钟个位,个位加一,个位加到10,十位进一,加到60,都变0;

4.独立按键四:暂停情况,修改秒钟个位,个位加一,个位加到10,十位进一,加到60,变为0;

下面为现象:

定时器时钟仿真

代码如下:模块化编程,一共用了4个模块,在我模块化编程大全里面有,直接调用即可,分别是

延迟模块,独立按键模块,定时器中断模块,动态数码管模块。

这里我们写main.c的代码:

#include <reg52.h>
#include "Nixie.h"
#include "Timer0.h"
#include "Key.h"
#define uint unsigned int
#define uchar unsigned charuchar keynumber,Mode;
uint hour_ge=0,hour_shi=0,minute_ge=0, minute_shi=0,second_ge,second_shi;//6个数码管刚好对应每一位void main()
{Timer0Init();while(1){keynumber= Key();if(keynumber){if(keynumber==1){Mode++;if(Mode>=2){Mode=0;}}if(keynumber==2){if(Mode==0){hour_ge++;if(hour_ge>=10){hour_ge=0;hour_shi++;}if(hour_shi==2&&hour_ge==4){hour_shi=0;hour_ge=0;}}}if(keynumber==3){if(Mode==0){minute_ge++;if(minute_ge>=10){minute_ge=0;minute_shi++;}if(minute_shi==6&&minute_ge==0){minute_shi=0;minute_ge=0;}}}if(keynumber==4){if(Mode==0){second_ge++;if(second_ge>=10){second_ge=0;second_shi++;}if(second_shi==6&&second_ge==0){second_shi=0;second_ge=0;}}}}Nixie(1,hour_shi);Nixie(2,hour_ge);Nixie(3,10);Nixie(4,minute_shi);Nixie(5,minute_ge);Nixie(6,10);Nixie(7,second_shi);Nixie(8,second_ge);}
}void Timer0_Routine() interrupt 1
{static unsigned int T0Count;TL0 = 0x18;		//设置定时初值TH0 = 0xFC;		//设置定时初值T0Count++;if(T0Count>=100)	//定时器分频,1s{T0Count=0;if(Mode==1){second_ge++;			//1秒到,second_ge自增if(second_ge>=10){second_ge=0;		//10秒到,second_ge清0,second_shi自增second_shi++;;if(second_shi==6){second_shi=0;	//60秒钟到,second_shi清0,minute_ge自增minute_ge++;if(minute_ge==10){minute_ge=0;minute_shi++;if(minute_shi==6){minute_shi=0;hour_ge++;if(hour_ge==10){hour_ge=0;hour_shi++;}if(hour_shi==2&&hour_ge==4){hour_shi=0;hour_ge=0;}}}}                         }}}
}

http://www.lryc.cn/news/296427.html

相关文章:

  • 单片机无线发射的原理剖析
  • Redis的过期键的删除策略
  • 放假--寒假自学版 day1(补2.5)
  • LLM(5) | Encoder 和 Decoder 架构
  • CV | Medical-SAM-Adapter论文详解及项目实现
  • C++初阶:容器(Containers)vector常用接口详解
  • flink写入es的参数解析
  • 逆向工程:揭开科技神秘面纱的艺术
  • 决策树的相关知识点
  • 【数据结构】单向链表实现 超详细
  • Opencc4j 开源中文繁简体使用介绍
  • vue 下载二进制文件
  • 数据结构之堆排序
  • 鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之ScrollBar组件
  • 读论文:DiffBIR: Towards Blind Image Restoration with Generative Diffusion Prior
  • 基于微信小程序的新生报到系统的研究与实现,附源码
  • 分享一下 uniapp 打包安卓apk
  • DevOps落地笔记-21|业务价值:软件发布的最终目的
  • 【动态规划】【前缀和】【数学】2338. 统计理想数组的数目
  • 【已解决】onnx转换为rknn置信度大于1,图像出现乱框问题解决
  • 多路服务器技术如何处理大量并发请求?
  • SpringBoot - 不加 @EnableCaching 标签也一样可以在 Redis 中存储缓存?
  • Linux------命令行参数
  • LLM少样本示例的上下文学习在Text-to-SQL任务中的探索
  • 双非本科准备秋招(19.2)—— 设计模式之保护式暂停
  • 使用SpringMVC实现功能
  • spring aop实现接口超时处理组件
  • c++设计模式之装饰器模式
  • WordPress如何实现随机显示一句话经典语录?怎么添加到评论框中?
  • 【退役之重学前端】vite, vue3, vue-router, vuex, ES6学习日记