我们今天来接触一下新的案例,电子钟在我们的生活中出现的非常多,那我们就尝试用代码将其显示在我们的八位数码管上
相关案例为:
- 扫描频率可改变的电子钟
- 实时时钟测试
- 可校准的实时时钟
- 多功能电子钟
- 可与PC通信的实时时钟
我们将主要介绍扫描频率可改变的电子钟
扫描频率可改变的电子钟
实验现象
数字钟是通过计数模拟时钟,将计数值转换成时间形式,以格式时-分-秒在LED数码管上进行显示,并通过按键调节扫描频率
该实验分8个等级,通过对应8个二极管从左至右指示扫描频率越来越高的8中扫描频率。总体达到软件计时,扫描频率可调的效果
工作原理
操作流程
代码解析
- 全局变量设置
bit btKey1Current; //key1当前的状态
bit btKey1Past; //key1前一个状态
uchar ucLedCnt; //流水灯累计延时器
uint uiDigSelectCnt; //数码管位选延时器
- P0(8位)和P2.3需要设置成推挽输出,以驱动电路正常发光。
按键作为输入,不需推挽
涉及寄存器及配置值如下:
P2M1=0x00;
P2M0=0xff;
P0M1=0x00;
P0M0=0xff;
P3M0=0x00;
P3M1=0x00;
- 通过定时器0,采用方式1,在定时器中断中进行计数值的累加
涉及寄存器(含可位寻址)及配置如下:
TMOD=0x01;//定时器0,方式1
EA=1;//打开总的中断
ET0=1;//开启定时器中断
TH0=(65535-1000)/256;
TL0=(65535-1000)%256;
TR0=1;//启动定时器
PT0=1;
P2M1=0x00;
P2M0=0xff;
P0M1=0x00;
P0M0=0xff;
具体的过程的代码就不详细叙述了
实时时钟测试
实验现象
数码管会出现实时的时钟,断开USB端口,不给实验板外部供电,时钟依然走秒
实验原理
- 实时时钟的核心是晶振,晶振频率为32768 Hz 。
- 它为分频计数器提供精确的与低功耗的实基信号。
- 它可以用于产生秒、分、时、日等信息。
- 为了确保时钟长期的准确性,晶振必须正常工作,不能够收到干扰
那实时时钟的晶振频率为什么是32768Hz?
实时时钟时间是以振荡频率来计算的。
故它不是一个时间器而是一个计数器。而一般的计数器都是16位的。
又因为时间的准确性很重要,故震荡次数越低,时间的准确性越低。所以必定是个高次数。
32768 Hz = 2^15 即分频15次后为1Hz,周期 = 1s;
经过工程师的经验总结32768 Hz,时钟最准确。
电路原理图
-
DS1302的2、3引脚外接32.768kHz 晶振的晶振,为芯片提供计时脉冲
通过秒寄存器的最高位控制晶振的工作状态
当为高时,停止工作;当为低时,晶振开始工作,实时模块自动计时。 -
RTC_SCLK引脚作为输入引脚,用于在串行接口上控制数据的输入与输出
-
RTC_IO引脚作为输入输出引脚,为实时时钟的数据线。
-
RTC_/RST引脚作为输入引脚,在读、写数据时必须置为高电平。
该引脚有两个功能:
第一,CE开始控制字访问移位寄存器的控制逻辑;
其次,CE 提供结束单字节或多字节数据传输的方法,
传输方法如下所示:
-
单个字节读:
在前8个SCLK时钟周期内,上升沿写入控制字,在后8个SCLK时钟周期内,下降沿读取数据字;均从最低位开始 -
单个字节写:
在前8 个 SCLK 时钟周期,上升沿写入控制字,在后 8 个 SCLK 时钟周期,上升沿写入数据字;均从最低位开始
可校准的实时时钟
实验现象
数码管会出现实时的时钟,通过按键key1以及导航键可以实现时间的精确校准
实验原理
程序主要是利用导航按键和数字按键综合校准时钟,利用ADC口对来自导航按键不同方向的电压值进行采集,并将采集后的转换结果获取高三位值,将此值作为导航按键方向判断标准。
导航按键是通过ADC采集电压的改变从而判断按下的方向
数字按键是通过电平的直接改变判断是否按下
导航按键的上键:控制时分秒的数值增1;
导航按键的下键:控制时分秒的数值减1;
K1键:进入或退出时间设置状态;
我们前面已经说过了时钟的原理图
这里直接介绍导航按键的原理图
导航按键的不同方向对应的不同的电压值,通过不同的AD值实现不同的按键操作,从而实现对值的设置
注意:
左边小正方形中对应的就是导航键,不同方向,由于电阻不同,其电压也不同
右下角三个为K3-K1这三个按键,一旦按下,其对应的KEY1 KEY2 KEY3就会显示低电平
多功能电子钟
实验现象
各按键功能:
(故可以实现年月日设置,时间设置,闹钟设置)
导航按键的上键:控制时分秒的数值增1;
导航按键的下键:控制时分秒的数值减1;
导航按键的左键:对小时进行调节;
导航按键中心按下:多分钟进行调节;
导航按键的右键:对秒钟进行调节;
K1键:开始进行走秒;
K2键:进入时分秒设置状态或者闹钟设置状态
K3键:进入或退出万年历设置状态;
实验原理
实验原理与上一个相似,只是要实现的功能更复杂,这主要就是需要代码来实现了
可与PC通信的实时时钟
实验现象
从DS1302芯片中读取实时时钟模块的年、月、日、时、分、秒,对获取实时时钟模块的数据信息通过串口发送给上位机进行显示,
同时上位机可以发送指令给单片机,包含地址、校准值信息,来修改单片机寄存器值,实现单片机校时功能
实验原理
由于是需要上位机,下位机来实现通信,即可以相互发送信息等
我们就需要先来了解一下串口通信的电路图
这幅图我目前还没看懂,就先不解释了/(ㄒoㄒ)/~~
对于我们这个实验,我们需要只要是如何实现的
- 读取实时时钟信息
从实时时钟模块读取到年、月、日、时、分、秒信息,通过年、月、日计算阴历年、月、日、星期,将年、月、日、星期、时、分、秒、阴历年、阴历月、阴历日10个字节通过定时器定时地、连续地通过串口发送给上位机, - 上位机对获取到的10个字节进行解析并进行显示到对应的控件上面。上位机通过选定地址、校准值,点击发送按钮,连续发送0xf0、寄存器地址、校准值3个字节给下位机,
- 下位机通过缓存保存串口收到的数据,判断接收到的第一个字节是0xf0,第二个字节对应地址、第三个字节对应校准值,对实时时钟进行写操作,在写之前注意禁止写保护,晶振停止工作,寄存器写入数据,启动晶振,重写写保护。同时按键1控制年月日、时分秒的显示。
实验总框图设计流程
后面如何学习有所体会会继续补充的哈!