基于STC12C5A60S2 51单片机+DS1302的多功能数字电子表设计方案(内含源码、PCB)
原标题:基于51单片机的多功能数字电子表设计方案(内含源码、PCB)
第一章 项目计划
1.1 项目分析
1.1.1 项目名称
多功能数字电子表
1.1.2 项目的发展趋势
随着现代电子技术的发展,人们对钟表的精确度的要求也越来越高。机械钟虽然不会被淘汰,但它所表现出来的作用有所限制,它未来的发展也不会无穷无尽。在满足现代人生活节奏的同时,电子表不单为时间而生,它将有很大的发展空间,比如现在流行的电话手表,一个电子表还可以用来跑步计数,查看天气,温度检测等等。电子表的发展也随着时代的发展一起前进,正好迎合了我们的项目多功能数字电子表。在不久的将来,通过人类的不断进步,电子表的功能将逐渐增加,比如导航,视频通话等都有可能实现。
1.1.3 市场需求
过去几年市场对电子表的需求越来越大每年销量增长加快,其中精度高,功能多样的电子表的需求更是猛增。使用电子表的人群主要是学生,上班族。他们需要价格较低,功能丰富的电子表,因此我们团队设计研发一种低价的多功能电子表来满足市场需求。
1.2 方案设计
1.2.1 项目功能
多功能数字电子表将实现以下功能:
1.时间功能。显示当前时间,精确到秒,并且当时间有误时,用户可以手动校准。
2.日期功能。日期是年、月、日。用户可通过按键来切换查看当前日期,也可以实现手动设置进行校准。
3.闹钟功能。用户可通过按键设置闹钟。
4.秒表功能。用户可进行启动、暂停(继续)、清零操作,精确到0.01秒。
5.倒计时功能。用户设置初始时间按下启动键电子表开始倒计时,当时时间归零时,响铃提醒用户。
1.2.2项目材料及计划
该设计中单片机采用STC12C5A60S2和低功耗实时时钟芯片DS1302搭配上按
键来实现基本功能。STC12C5A60S2单片机集高速、低功耗、超强抗干扰于一身。选择具有涓细电流充电能力的低功耗实时时钟电路DS1302对时间进行计时,它可以精确到秒,还具备闰年补偿等多种功能,而且该芯片的使用寿命长,误差小,还具有时间校准等功能。显示这方面我们打算用数码管显示,但根据最后的需要可能有变,目前有液晶和数码管显示这两种方案,液晶比普通数码管相比硬件连接更复杂,价格更贵,对系统的要求较高。此外,我们还将用到的材料是蜂鸣器,用于闹铃和倒计时的响铃提醒。按键可用于切换显示、时间校准、闹钟的设定等功能。
除了以上的器件外,在项目设计过程中我们还会用到其他一些电子元件,比如电容,电阻,三极管等等。
1.3 可行性分析
我方团队三人各有所长,李林航擅长程序设计和编写,有些较为丰富的经验,参加过多次比赛,成绩优异,彭建峰在电路设计方面很有经验,主要负责电路方面的主体任务,梁斌则在各个方面协助两位组员,并且主要负责报告的撰写整合,采购原件等任务。分工合作,通过硬件和编程结合,和实际的手工操作,就可以实现多功能数字电子表功能。在按键不超过三个的条件下,要实现多个功能,可以采用按键结合共同作用来实现多个功能。
第二章 设计说明
2.1 功能指标
2.1.1 显示器
选用共阴极4位数码管作为显示器。
2.1.2 按键
设计三个按键,通过按键操作来实现切换和设置功能,可分别显示时、分、秒、年份、月份、天数、秒表、倒计时、闹钟。考虑到功能多,按键少,所以我们采用了组合键操作来减少按键数量节约设计空间和成本。
2.1.3 蜂鸣器
选用蜂鸣器作为闹钟和倒计时的响铃提醒,采用单片机推挽式输出和9013来控制其正常工作。
2.1.4 单片机
选用STC12C5A60S2单片机,它是高速、低功耗、超强抗干扰的新一代8051单片机。并且它的功能性强,价格合理,用起来也比较方便主要具有以下几个特点: 4KB可改编程序Flash储存器。、全静态工作、128*8字节内部RAM、32个外部双向输入/输出(I/O)口、中断优先级有四种状态可定义、2个16位可编程定时计数器、低功耗和掉电模式。配合DS1302时钟芯片,用C语言编写程序来完成项目的软件需求。
2.2 设计原理及原理图
我们多功能电子表原理图如图2-1所示,包括的元器件有:4位数码管、STC12C5A60S2单片机、电阻、DS1302时钟芯片、振荡器、ISP下载器、蜂鸣器、瓷片电容,按键以及三极管。用三线制SPI串行通信协议控制DS1302相应的寄存器修改和读取它的时间数据(BCD码),再通过转码函数将其数据转换成十进制数后控制数码管显示。通过按键切换读取或更改对应的时间,再通过设置STC12C5A60S2的定时器完成秒表和倒计时功能。
图2-1 电子表电路设计原理图
2.3 关键硬件模块设计原理
2.3.1 振荡电路
在电子表的设计中,振荡电路是必不可少的。它用于产生一个标准频率,也就是时间标准信号,然后通过分频器产生时间脉冲。其频率精度与稳定性决定了多功能电子表时间的准确度。为了使电路更容易起震,频率更稳定,并联两个22pF的瓷片电容。如图2-2。
我们采用的是12M石英晶振。
图2-2 振荡电路
2.3.2 显示器
采用4位共阴极数码管作为显示器,段选端接P0口,位选端接P2口高四位。数码管直接由P0口电流驱动,串联1k电阻控制电流大小,P2口直接连接数码管的选择位即可,如图2-3。
I/O口输出电压约为5V, 红色发光二极管导通压降约为1.8-2.2V,数码管工作总电流不超过20mA,可以计算出限流电阻为(5V-1.8V)/(20mA/8)=1.28kΩ, (5V-2.2V)/(20mA/8)=1.12kΩ。所以电阻阻值在1.12k-1.28kΩ之间均可。但为了留有冗余本方案设计的限流电阻为1.3kΩ。
图2-3 显示器电路
2.3.3 按键
三个按键分别接到P2.0,P2.1,P2.2口,并联,用户通过按键来实现相应功能,如图2-4。
图2-4 按键电路
当童锁打开时,只有K1可以工作,用来切换显示,K2和K3不能工作。
当童锁关闭时,按键K1切换设置的位置,按键K2和K3进行加减操作,具体功能如下:
1、按K1切换显示时、分、秒、年、月、日。K2进行减操作,K3进行加操作。
2、按K1切换设置闹钟,K2进行减操作,K3进行加操作,K2,K3一起按进行开/关闹钟。
3、按K1切换设置秒表,K2开始/暂停,K3清零。
4、按K1切换设置倒计时,K2进行减操作,K3进行加操作。
2.3.4 DS1302时钟芯片
该芯片可提供秒、分、时、日、月、年,并且具有闰年补偿功能。如图2-5
图2-5 时钟芯片电路
X1和X2接32.768kHz的晶振,使得芯片能正常工作。RET控制移位寄存器或复位。
VCC2接输入电源,VCC1接大电容的正极,在主电源失效时保持时间和日期数据。该芯片工作于VCC1和VCC2中较大者。当VCC2比VCC1高0.2V时,VCC2给DS1302供电,当VCC1比VCC2高时,VCC1给DS1302供电,GND接地,DS1302连接单片机外接4.7k上拉电阻来确保芯片可以正常工作。
SCLK用来同步串行接口上的数据动作。I/O表示输入与推挽输出,I/O管脚是三线接口的双向数据管脚,为了使其正常工作。CE是输入,当CE信号在读写时要保持高电平。为了使它们连接单片机能够正常工作,我们依次外接了一个47k的上拉电阻。
2.3.5 蜂鸣器
采用蜂鸣器作为闹铃。蜂鸣器结构简单,控制方便。占用单片机I/O口P2.3,用NPN型三极管9013控制蜂鸣器。三极管基极连接单片机I/O口,发射极接地,当P2.3引脚为高电平时,三极管导通,使得蜂鸣器正常工作,如图2-6。
图2-6 蜂鸣器电路
2.3.6 电源电路
图2-7 电源电路
采用了大容量电解电容旁边并联一只小电容的电路结构作用有三:一是作为本集成电路的蓄能电容;二是滤除该器件产生的高频噪声,切断其通过供电回路进行传播的通路;三是防止电源携带的噪声对电路构成干扰。
2.4 软件设计
2.4.1 main程序
void main(void)
{
P2M0 = 0xff;
P2M1 = 0x00; //P2强推挽输出
P0M0 = 0xff;
P0M1 = 0x00; //P0强推挽输出
//****************定时器初始化*******************
TMOD= 0x12; //设置定时器1为方式1,定时器0为方式2
TH1 = -10; //2.5ms中断一次
TL1 = -250;
TH0 = -250; //0.25ms中断一次
TL0 = -250;
TR1 = 1; //打开定时器1
ET1 = 1; //打开定时器1中断
ET0 = 1; //打开定时器0中断
EA = 1; //开总中断
display(); //读取DS1302的时间信息并数码管显示
while(1)
{
if(cKey)
{
DisposeKEY(); //按键扫描
}
if (hour > 23 || second > 59 || minute > 59)
{
Ds1302Init();
}
}
}
}
2.4.2 定时器0
void IntT0() interrupt 1
{
if (DJS == 1) //倒计时模式
{
uchar j,k;
j++;
if(j == 40) //中断40次0.01s
{
j = 0;
if (k == 0)
{
k = 100;
if (DL == 0)
{
if (DH == 0)
{
DD = 1; //倒计时结束标志位
TR0 = 0; //关闭定时器0
return;
}
DH--;
DL = 60;
}
DL--;
}
k--;
}
}
else //秒表模式
{
uchar i;
i++;
if(i == 40) //中断40次0.01s
{
i = 0;
mL++;
if(mL == 100) //中断4000次1s
{
mL = 0;
mH++;
if(mH == 60) //中断240000次一分钟
{
mH = 0;
}
}
}
}
}
2.4.3 定时器1
void IntT1() interrupt 3
{
TH1 = -10; //2.5ms中断一次
TL1 = -250;
//*************************中断次数计数******************
nTimer++;
if(nTimer == 200)
{
SMG = ~SMG; //0.5s数码管亮/灭一次
nTimer = 0;
}
//*************************显示刷新******************
P0 = 0; //先清显示再换位选
if ((Nhour == hour && Nminute == minute && kk == 1)||(DD == 1))
{
P2 = acLEDCS[cScanIndex]|0x0f; //送位选数据
}
else
{
P2 = acLEDCS[cScanIndex]|0x07; //送位选数据
}
P0 = acLED[cScanIndex++]; //送显示数据,位选指针移位
cScanIndex &= 3; //位选指针回位
DisposeKEY();
//*************************扫描按键******************
if(nDelayKey==0)
{
cKey = P2 & 0x07; // 取键值P10、P11、P12
if(cKey != 0x07)nDelayKey=100; // 设置延迟时间削颤
else
{
bStill=0;
cLongDelay=0;
} // 松键
}
else // 利用DelayKey按键消颤
{
nDelayKey--;
if(nDelayKey==0)
{
cKeyCode = P2 &0x07; // 取键值P10、P11、P12
if(cKey != cKeyCode)
{
cKeyCode = 0;
}
}
}
}
2.5 Proteus仿真图
当童锁打开时,只有K1可以工作,用来切换显示,K2和K3不能工作。
当童锁关闭时,按键K1切换设置的位置,按键K2和K3进行加减操作,如图3-1
3-1 电路Proteus仿真图
2.6 流程图
主程序流程图:
4-1 主程序流程图
注:I/O口初始化将P0、P2设置为强推挽输出。
定时器初始化设置定时器1为方式1,定时器0为方式2。
定时器1的流程图:
定时器0流程图:
2.7 PCB图 见图5-1
责任编辑:David
【免责声明】
1、本文内容、数据、图表等来源于网络引用或其他公开资料,版权归属原作者、原发表出处。若版权所有方对本文的引用持有异议,请联系拍明芯城(marketing@iczoom.com),本方将及时处理。
2、本文的引用仅供读者交流学习使用,不涉及商业目的。
3、本文内容仅代表作者观点,拍明芯城不对内容的准确性、可靠性或完整性提供明示或暗示的保证。读者阅读本文后做出的决定或行为,是基于自主意愿和独立判断做出的,请读者明确相关结果。
4、如需转载本方拥有版权的文章,请联系拍明芯城(marketing@iczoom.com)注明“转载原因”。未经允许私自转载拍明芯城将保留追究其法律责任的权利。
拍明芯城拥有对此声明的最终解释权。