单片机定时器时钟
单片机系统的时钟与定时器设计原理详解

单片机系统的时钟与定时器设计原理详解引言:随着现代电子技术的快速发展,单片机在各个领域得到了广泛应用。
在单片机系统中,时钟和定时器是非常重要的组成部分。
时钟用来驱动整个单片机系统的节奏,而定时器用于实现各种时间相关的功能。
本文将详细解析单片机系统中时钟和定时器的设计原理。
一、时钟设计原理:在单片机系统中,时钟充当着同步整个系统操作的功能。
它是一个稳定可靠的信号源,用于指导单片机各个部件的工作。
时钟信号通常由晶体振荡器产生,通过芯片内部的倍频电路进行频率提升。
常见的时钟频率有4MHz、8MHz、16MHz等。
时钟的设计需要考虑以下几个方面:1. 稳定性:时钟信号必须具有高稳定性,以确保整个系统的正常运行。
通常使用石英晶体作为振荡器,由于石英晶体具有稳定频率的特性,因此可以提供可靠和精确的时钟信号。
2. 频率选择:时钟频率的选择应根据具体的应用需求进行。
较高频率的时钟可以提高系统的处理速度,但同时也会增加功耗。
因此,在设计时应合理选择适当的时钟频率。
3. 电源噪声:电源噪声对时钟信号的稳定性有很大影响。
为了减小电源噪声对时钟的干扰,可以采用电源滤波电路,提高时钟信号的抗干扰能力。
4. 时钟分频:有时候需要减小时钟频率用于驱动其他外设,可以通过时钟分频器来实现。
分频器可以将高频的时钟信号分频得到较低频率的时钟信号。
二、定时器设计原理:定时器在单片机系统中有着广泛的应用,可以实现延时、定时、脉冲生成等功能。
定时器通常由一个计数器和相关的控制逻辑组成。
定时器的设计需要考虑以下几个方面:1. 计数器选择:在选择定时器时,需要根据需求选择适当的计数器位数。
通常,8位计数器可以计数255个时间单位,16位计数器可以计数65535个时间单位。
计数器的位数越大,可以表示的时间范围就越大,但同时也会增加硬件成本和资源占用。
2. 定时器模式:定时器可以有不同的工作模式,如定时模式、脉冲计数模式等。
定时模式用于实现定时功能,脉冲计数模式用于计算脉冲的个数。
单片机定时器 计数器

单片机定时器计数器单片机定时器/计数器在单片机的世界里,定时器/计数器就像是一个精准的小管家,默默地为系统的各种操作提供着精确的时间控制和计数服务。
无论是在简单的电子时钟、还是复杂的通信系统中,都能看到它们忙碌的身影。
那什么是单片机的定时器/计数器呢?简单来说,定时器就是能够按照设定的时间间隔产生中断或者触发事件的模块;而计数器则是用于对外部脉冲或者内部事件进行计数的功能单元。
我们先来看看定时器的工作原理。
想象一下,单片机内部有一个像小闹钟一样的东西,我们可以给它设定一个时间值,比如说 1 毫秒。
当单片机开始工作后,这个小闹钟就会以一个固定的频率开始倒计时,当倒计时结束,也就是 1 毫秒到了,它就会发出一个信号,告诉单片机“时间到啦”!这个信号可以用来触发各种操作,比如更新显示、读取传感器数据等等。
定时器的核心在于它的时钟源。
就好比小闹钟的动力来源,时钟源决定了定时器倒计时的速度。
常见的时钟源有单片机的内部时钟和外部时钟。
内部时钟一般比较稳定,但精度可能会受到一些限制;而外部时钟则可以提供更高的精度,但需要额外的电路支持。
再来说说计数器。
计数器就像是一个勤劳的小会计,不停地数着外面进来的“豆子”。
这些“豆子”可以是外部的脉冲信号,也可以是单片机内部产生的事件。
比如,我们可以用计数器来统计电机旋转的圈数,或者计算按键被按下的次数。
计数器的工作方式也有多种。
可以是向上计数,就是从 0 开始,不断增加,直到达到设定的最大值;也可以是向下计数,从设定的最大值开始,逐渐减少到 0。
还有一种更灵活的方式是双向计数,根据需要在向上和向下之间切换。
那么,定时器/计数器在实际应用中有哪些用处呢?比如说,在一个智能温度控制系统中,我们可以用定时器每隔一段时间读取一次温度传感器的数据,然后根据温度的变化来控制加热或者制冷设备的工作。
而计数器则可以用来统计设备运行的次数,以便进行维护和保养。
在电子时钟的设计中,定时器更是发挥了关键作用。
单片机 定时器实现24小时时钟程序

#include <reg51.h>#include <intrins.h>#define uint unsigned int#define uchar unsigned charsbit LS138A = P2^2; //定义138译码器的输入A脚由P2.2控制sbit LS138B = P2^3; //定义138译码器的输入脚B由P2.3控制sbit LS138C = P2^4; //定义138译码器的输入脚C由sbit k1=P2^0;sbit k2=P2^1 ;sbit k3=P2^5;bit flag;uchar sec=0,min=0,hour=12;uchar count_10ms, DelayCNT;int m=1;//此表为LED 的字模, 共阴数码管0-9 -unsigned char code Disp_Tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};void delay(uint z){int x,y;for(x=z;x>0;x--)for(y=20;y>0;y--) ;}void timer(){TMOD=0x01;TH0=0xdc;TL0=0x00;EA=1;ET0=1;TR0=1;}void key(){ int t;if(k1==0){delay(30);if(k1==0){ while(!k1);t++;m=t%2;}}}/************主函数**********************/ main(){ unsigned int i ;unsigned int LedOut[10];timer();while(1) //进入循环状态{if(m==0){if(k2==0){delay(30);if(k2==0)while(!k2);hour++;}if(hour>=24)hour=0;if(k3==0){delay(30);if(k3==0)while(!k3);min++;}if(min>=60)min=0;}LedOut[0]=Disp_Tab[hour/10];LedOut[1]=Disp_Tab[hour%10];LedOut[2]=Disp_Tab[10];LedOut[3]=Disp_Tab[min/10];LedOut[4]=Disp_Tab[min%10];LedOut[5]=Disp_Tab[10];LedOut[6]=Disp_Tab[sec/10];LedOut[7]=Disp_Tab[sec%10];for( i=0; i<9; i++) //实现8位动态扫描循环{P0 = LedOut[i]; //将字模送到P0口显示switch(i) //使用switch 语句控制位选也可以是用查表的方式学员可以试着自己修改{case 0:LS138A=0; LS138B=0; LS138C=0; break;case 1:LS138A=1; LS138B=0; LS138C=0; break;case 2:LS138A=0; LS138B=1; LS138C=0; break;case 3:LS138A=1; LS138B=1; LS138C=0; break;case 4:LS138A=0; LS138B=0; LS138C=1; break;case 5:LS138A=1; LS138B=0; LS138C=1; break;case 6:LS138A=0; LS138B=1; LS138C=1; break;case 7:LS138A=1; LS138B=1; LS138C=1; break;}delay(10);}}}void timer1() interrupt 1 // 中断函数{TH0=0xdc;TH0=0x00;key();if(m){{count_10ms++;}if(count_10ms==10){count_10ms=0;sec++;if(sec>=60){sec=0;min++;if(min>=60){min=0;hour++;if(hour>=24){hour=0;sec=0;min=0;}}}}}}。
基于单片机定时闹钟的设计

基于单片机定时闹钟的设计随着科技的快速发展,嵌入式系统已经深入到我们生活的各个角落。
其中,单片机以其高效性、灵活性和低成本性,广泛应用于各种设备的设计中。
本文将探讨如何基于单片机设计一个定时闹钟。
一、硬件需求1、单片机:选择一个适合你项目的单片机。
比如Arduino UNO,它具有丰富的IO口和易于使用的开发环境。
2、显示模块:为了能直观地展示时间,你需要一个LCD显示屏。
可以选择常见的16x2字符型LCD显示屏。
3、按键模块:用于设定时间和闹钟功能。
一般可以选择4个按键,分别代表功能设置、小时加、小时减和分钟加。
4、蜂鸣器:当到达设定时间时,蜂鸣器会发出声音提醒。
二、软件需求1、开发环境:你需要一个适用于你单片机的开发环境,例如Arduino IDE。
2、编程语言:一般使用C或C++进行编程。
3、程序设计:你需要编写一个程序来控制单片机,让其根据设定时间准时唤醒。
程序应包括初始化和设定时间的功能,以及到达设定时间后的闹钟提醒功能。
三、设计流程1、硬件连接:将单片机、显示模块、按键模块和蜂鸣器按照要求连接起来。
2、初始化:在程序中初始化所有的硬件设备。
3、时间设定:通过按键模块设定时间。
你需要编写一个函数来处理按键输入,并在LCD显示屏上显示当前时间。
4、闹钟提醒:在程序中加入一个计时器,当到达设定时间时,程序会唤醒并触发蜂鸣器发出声音。
5、循环检测:在主循环中不断检测时间是否到达设定时间,如果到达则触发闹钟提醒,然后继续检测。
四、注意事项1、时钟源:你需要一个稳定的时钟源来保证闹钟的准确性。
可以考虑使用网络时钟或者GPS模块。
2、功耗优化:如果你的设备需要长时间运行,那么需要考虑到功耗的问题,比如使用低功耗的单片机或者在不需要闹钟提醒的时候关闭蜂鸣器等。
3、人机交互:考虑增加更多的功能以满足用户的需求,如设置多个闹钟、调整闹钟的音量等。
4、安全性:保证设备的电源稳定,避免在突然断电的情况下数据丢失或设备损坏。
单片机定时闹钟课程设计

单片机定时闹钟课程设计一、课程目标知识目标:1. 让学生掌握单片机的基本原理,理解定时器的功能和工作原理。
2. 使学生掌握定时闹钟程序编写的基本方法,了解中断处理的相关知识。
3. 帮助学生了解电子时钟的基本构成,掌握时间计算和显示的相关技巧。
技能目标:1. 培养学生动手实践能力,学会使用编程软件编写、调试程序,实现单片机定时闹钟功能。
2. 提高学生分析问题和解决问题的能力,能够独立完成定时闹钟课程的各项任务。
3. 培养学生团队协作能力,学会在项目过程中进行有效沟通和分工合作。
情感态度价值观目标:1. 培养学生对单片机编程的兴趣,激发他们探索未知、自主学习的精神。
2. 培养学生勇于尝试、不怕失败的品质,提高他们面对困难时的心理素质。
3. 增强学生的创新意识,鼓励他们发挥想象力和创造力,设计出具有个性的定时闹钟作品。
课程性质分析:本课程属于电子技术与应用领域的实践课程,旨在让学生通过动手实践,掌握单片机定时闹钟的设计与制作。
学生特点分析:学生处于中学阶段,具有一定的电子技术基础和编程能力,对新鲜事物充满好奇,喜欢动手实践。
教学要求:1. 结合课本知识,注重理论与实践相结合,提高学生的实际操作能力。
2. 注重培养学生的创新精神和团队协作能力,提高他们的综合素质。
3. 以学生为主体,关注个体差异,因材施教,使每个学生都能在课程中取得进步。
二、教学内容1. 单片机基础原理回顾:包括单片机的结构、工作原理、定时器/计数器功能。
2. 定时器编程技术:重点讲解定时器的初始化、中断处理程序编写,以及定时器应用实例。
- 教材章节:第三章《单片机定时器/计数器》3. 中断系统原理:介绍中断的概念、中断优先级、中断向量表,以及中断处理流程。
- 教材章节:第四章《中断系统》4. 显示技术:讲解数码管、LCD等显示器件的工作原理和编程方法。
- 教材章节:第五章《显示技术》5. 定时闹钟设计与实现:包括闹钟功能的整体设计、程序编写、调试与优化。
51单片机定时器初值的计算

51单片机定时器初值的计算单片机定时器的初值计算是指根据所需的定时时间和时钟频率,确定定时器的计数初值。
单片机定时器的计数值是由定时器的预分频系数和定时器的溢出值构成的。
首先,需要明确以下两个参数:1.所需的定时时间:即所需的定时时间长度,例如需定时1秒钟。
2.时钟频率:即单片机的主频,例如时钟频率为12MHz。
然后,按照以下步骤进行定时器初值的计算。
步骤一:计算定时器的预分频系数首先,根据定时时间和时钟频率计算所需的总计数值,以此作为参考。
计数值=定时时间×时钟频率例如,在定时1秒钟时,假设时钟频率为12MHz,则计数值=1×12MHz=12,000,000。
然后,选择一个适当的预分频系数,使得计数值能够在定时器的计数范围内。
预分频系数分为若干个级别,一般有2、4、8等。
选择预分频系数的目的是使得计数值能够在定时器的计数范围内。
步骤二:计算定时器的溢出值根据选择的预分频系数,计算定时器的溢出值。
溢出值=2^P-计数值/预分频系数其中P为定时器的位数,例如8位或16位。
例如,在AT89S52单片机中,定时器是8位的,选择的预分频系数为12,则溢出值=2^8-1,000,000/12=223步骤三:计算定时器初值定时器的初值即为溢出值,即定时器初始时的计数值。
定时器的计数器将从初值开始计数,当计数器溢出时,定时器将触发中断或执行相应的操作。
例如,在AT89S52单片机中,定时器的初值为223需要注意的是,不同的单片机有不同的定时器计数范围、位数和预分频系数,因此具体的计算方法和参数需要根据所用的单片机型号而定。
总结起来,单片机定时器初值的计算可以通过以下步骤完成:1.根据所需的定时时间和时钟频率,计算总计数值。
2.根据定时器的计数范围,选择适当的预分频系数。
3.计算定时器的溢出值。
4.定时器初值即为溢出值。
基于单片机的定时闹钟设计

定时闹钟的激活机 制
优点: 相比没有激活功能的定时闹钟,设 有激活机制的定时闹钟省去了用户在 不 需要闹铃提示的时候手动去暂停发出 警 报声的定时闹钟的麻烦。
开始
设置闹钟时间
闹钟是否激活? N
Y 闹钟时间= 当前时间? N
Y 蜂鸣器发 出警示声
S4键被 N 按下? Y
结束
图2 闹钟程序流程 图
3 .闹铃响起的条件和停止
1 响起的条件 2 定时闹钟发出警报声需要满足以下两个
条件: 3 系统时间与设定的闹铃时间相等 4 闹铃提示功能被激活,即显示屏上有
“N” 5 的提示信息。 6 闹铃停止的两种方法 7 按一次K4键撤销闹铃提示服务。 8 等待系统时间分位与设定的闹铃时间分
系统仿真电路图
实物图
结束
谢谢观看 !
(2).第二次按K1键, 光标从分位跳到时 位, , 表示当前设置的是闹钟的时位。
(3).当将闹钟的分位和时位均设置完毕 时, 第三次按下K1键, 光标消失, 系统正 常显 示时间和日期等信息。
2 .闹铃的开启
即使系统设有闹铃时间,蜂鸣器也不 一定会在设定时间发出警报声。为避免闹 铃在用户不需要的时候响起,该定时闹钟 系统采用了闹钟激活机制。只有在设置了 闹钟时间并且用户有激活闹铃服务的时候, 蜂鸣器才会在设定时间发出警报声。激活 方式: 按一次K4键。再按一次则会取消。当 闹铃激活时,LCD显示屏上会出现“N”的 提示信息,提示有闹钟提示开启。
图1 实时时钟程序流程 图
图二 1602型LCD的驱动程序流程图
二、 时间和日期的修改
在系统正常运行过程中, 当K1键第一次 被按下时, 关闭定时器(TR0=0), 并且在 时间的秒位出现闪烁的光标, 提示用户现在 更改的是时间的秒位部分。可通过继续按 K1来选择需要调整的其他位, 利用K2进行加 运算, K3进行减运算。直到K1键被第十次按 下的时候, 打开定时器(TR0=1)。系统回 到显示时间和日期的模式下。
第6章STC15F2K60S2单片机定时器及可编程时钟输出《单片机原理及应用》

第6章STC15F2K60S2单片机定时器及可编程时钟输出《单片机原理及应用》本文介绍了STC15F2K60S2单片机的定时器和可编程时钟输出功能。
单片机定时器是单片机中常用的功能模块之一,可以用于定时、计时、延时等应用。
STC15F2K60S2单片机具有多个定时器,包括定时/计时器的选择,工作模式的设置,定时器中断的配置等。
另外,该单片机还具备可编程时钟输出功能,可以用于生成各种频率的时钟信号。
一、STC15F2K60S2单片机定时器概述STC15F2K60S2是一款杰出的8051内核单片机,它具有多种功能和丰富的接口资源,适用于各种应用场景。
定时器是其中一个重要的功能模块,可以用于实现各种定时任务,例如周期性的数据采集、定时触发等。
STC15F2K60S2单片机具有4个定时器,分别为T0、T1、T2和T3。
每个定时器又分为两个独立的计时/定时模块,通常称之为T0高速定时器和T0低速定时器等。
这些定时器的工作频率由系统时钟频率决定,可以通过定时器控制寄存器来设置时钟来源和分频系数。
二、STC15F2K60S2单片机定时器的工作模式定时器有多种工作模式可供选择,常用的有定时器模式和计数器模式。
定时器模式主要用于实现定时功能,可以根据需求设置定时时长和触发条件。
计数器模式主要用于计数功能,可以将外部事件转换为内部计数脉冲,用于测量时间间隔或者脉冲频率。
STC15F2K60S2单片机定时器的工作模式可以通过相关的寄存器位进行配置。
例如,可以通过T2CON寄存器的T2M0和T2M1位来选择定时器2的工作模式,可以选择定时器模式、16位自动重载模式、13位同步计数器模式,或者外部事件计数器模式。
三、STC15F2K60S2单片机定时器中断的配置定时器中断是使用定时器功能的常用方法之一,可以在定时达到设定值时触发中断,执行相应的中断服务程序。
STC15F2K60S2单片机的定时器可以设置使能定时器中断,并通过相关的中断使能寄存器来控制定时器中断的使能和优先级。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
思路
1.硬件准备。
备齐所需硬件。
2.软件模拟或开发板演示。
3.软件编写。
4.问题提出与解决。
5.焊接电路。
一、硬件准备
1.四个按键。
用于调时、分、秒,一个备用。
2.单片机一片。
STC。
3.1602液晶电路。
1个液晶屏,1个10K电阻,1个10欧电阻,1个可变电阻。
4.排阻,10K。
5.晶振电路。
含1个晶振、2个30pF电容。
6.复位电路。
含1个按键、1个10K电阻,1个1K电阻,1个10uF电容。
7.电源电路。
电源接口、1个1K电阻,1个发光二极管,1个10uF电容。
购买:
10个按键,10个30pF电容,10个发光二极管,10个10uF电容,10个1K电阻,10个10K 电阻。
二、开发板模拟
1.初步设计:按直觉感受下设计过程,感知到存在的问题,以便提高关注度。
1)显示初始时间:给定初始显示值,如12:34:52,分别使用1、2、4、5、7、8数码管显示。
2)时间递增:用计时器计时,秒60则分进1,分60则时进1,时24则归零。
3)调时按键:用四个独立按键分别调时、分、秒,留一个备用。
4)复位归零:按复位按钮,则全部归零。
2.过程实施:根据直觉设想,分别实现模块功能并实际验证与修改
1)自由显示数码管:参照现有程序,阅读理解后直接拷贝。
①共阳极数码管如下图:
静态显示时,每个数码管需要1组8个I/O口,而实际需要六个数码管,显然不够。
译码器可以解决该问题。
②译码器实现动态显示数码管。
译码器三个输入端的8种组合,可以有8个输出端。
这样单片机的3个I/O口就可以完成一个数码管显示。
但是,要同时显示两个数码管,一个译码器是不可以解决的,这就需要两个译码器并能控制其通断,这就需要额外的I/O口。
为解决此问题,下面提出一个规划:功能:6个单片机I/O口,最多能同时显示8个数码管,这就需要9个译码器。
方法:3个单片机口用于控制1个译码器,这样就可以有8个接口,用于控制其它8个译码器通断,另外3个单片机口用于同时提供给8个译码器数值,而谁要显示,由1个译码器的输出口控制。
另外给予适当延时,以实现动态显示。
问题:这样就需要9个译码器,硬件需求比较大。
假设能控制数码管的接口,这样1个译码器就够了。
③多个数码管动态显示。
1个74HC138译码器,用于控制共阴数码管的位选取;1个74HC573锁存器,用于提供数码管数值。
控制开断时间,可实现多个数码管动态显示。
原理图如下:
原理简介:数码管共阴极位选由74HC138译码器控制,数据端由74HC573锁存器控制,单片机P0口控制锁存器数据端。
译码器输出互斥值以决定哪个数码管显示,依次循环来动态显示数码管。
P0口在每次循环赋予不同值,通过位选以传递给对应的数码管。
另外,也可以不用译码器,用P2口直接作位选控制。
2)程序编写:编写时钟显示程序,下载到开发板显示时钟。
①显示初始时间:12-34-52
建立一个数组,给8个数码管分别赋予对应值。
赋值给P0口,通过锁存器传递给数码管;再通过译码器以控制位选依次循环以动态显示。
小问题:1. 每个数值对应的16进制码是多少?(可根据已有程序查询)2. 译码器动态位选时有没有次序要求?(理论上应没有,实验时加以关注)
程序主体如下:
//数码管数值代码0-9
unsigned char code Disp_Tab[] =
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; //段码控制
//建立数组,存储赋给P0口以传递到数码管的数值
Ledout[0]=Disp_Tab[1]; //值为1
Ledout[1]=Disp_Tab[2]; //值为2
Ledout[2]=Disp_Tab[10]; //值为-
Ledout[3]=Disp_Tab[4]; //值为4
Ledout[4]=Disp_Tab[6; //值为6
Ledout[5]=Disp_Tab[10]; //值为-
Ledout[6]=Disp_Tab[3]; //值为3
Ledout[7]=Disp_Tab[8]; //值为8
//循环依次将数值传递到数码管,再利用位选端逐次显示。
注意,每个值只能对应一个位选,否则会出现混乱
for( i=0; i<8; i++)
{
LE = 0; //输出使能,锁存器不输出数据
P0 = LedOut[7-i]; //硬件数码管为从右到左
LE = 1; //输出使能,锁存器将8位数据一口吐出
P2 = dispbit[i]; //使用查表法进行位选
delay(150); //扫描间隔时间太长会数码管会有闪烁感
}
LE = 0; //锁存器不输出数据
②按秒计时。
两种解决方案:一是递增整数,通过求余分别赋值到时分秒;二是进位法,秒到60分增1,分到60时增1。
计时方法有两种:一是用延迟函数,一般不太准,但可应付作业,且程序简单;二是用定时器,相对准确,且可拓展学习范围。
此处采用由简到难的顺利逐步实现,故先采用整数求余数和延迟函数。
整数求余:递增值为一整数allSCount,由延迟函数判定,约1秒递增依次,有现成程序。
对60求余得秒secCount,求除得总分allMCount,secCount对10求余为秒个位,对10求除为秒十位;allMinCount再对60求余得具体分minCount,继续求余得分个位,求除得分十位;对allMCount求除60得总时allHCount,再对24求余得具体时hourCount,对10求余得时个位,求除得时十位。
程序为:
int allSCount=0;//总秒数初始为0
int secCount=allSCount%60;//得具体秒数
Ledout[0]=Disp_Tab[secCount%10];//右1数码管为秒个位
Ledout[1]=Disp_Tab[secCount%10];//右2数码管为秒十位
int allMCount=allSCount/60;//得总分钟数
int minCount=allMCount%60;//得具体分钟数
Ledout[3]=Disp_Tab[minCount%10];//右4数码管为秒个位
Ledout[4]=Disp_Tab[minCount%10];//右5数码管为秒十位
int allHCount=allMCount/60;//得总小时数
int hourCount=allHCount%24;//得具体小时数
Ledout[6]=Disp_Tab[hourCount%10];//右6数码管为秒个位
Ledout[7]=Disp_Tab[hourCount%10];//右7数码管为秒十位
3)调时功能
①主要问题:1. 如何捕捉按键?(从按键扫描入手或可解决)2. 如何实现选中时、分、秒的闪烁以提示调时选项?3. 如果为了解决问题1,则要求实时扫描按键,那如何避免它与时钟计时程序冲突呢?因为实时扫描时不能做其他事情。
(假设计时程序运行很快,设置扫描标志,比如按键按零次,执行计时程序;另外可通过中断以实现多线程)
②键盘扫描测试:功能键扫描计数keyFunCount,每检测到低电位则增加1。
未按时,keyFun=0,执行主计时程序;keyFun=1,则P1.1=0,LED1亮;keyFun=2,则P1.2=0,LED2亮。
主要程序:
计时程序timeRun();
键盘扫描:keyFun键为P3.1,keyFunCount初始值为零,if(keyFun==0) 表示按下一次,则keyFunCount++,然后根据keyFunCount值执行timeRun、LED1亮、LED2亮等函数,当大于3时,则清零。
问题反馈:1. 延时参数要大于5000,否则按键一次很容易跳多次。
2. 选择功能键后,如何让对应数码管跳动,以指示可以调整?3. 选中功能键后,为何最左边的数码管会亮,而其他的都灭?(理论上应都灭)
③功能键闪烁:选中功能键后,对应的时、分、秒闪烁,以表示可以用增减键调整。
此时,计时依旧,故应该在位选着手。