用51单片机做的电子时钟
51单片机作的电子钟程序及电路图

51单片机作的电子钟程序在很多地方已经有了介绍,对于单片机学习者而言这个程序基本上是一道门槛,掌握了电子钟程序,基本上可以说51单片机就掌握了80%。
常见的电子钟程序由显示部分,计算部分,时钟调整部分构成。
时钟的基本显示原理:时钟开始显示为0时0分0秒,也就是数码管显示000000,然后每秒秒位加1 ,到9后,10秒位加1,秒位回0。
10秒位到5后,即59秒,分钟加1,10秒位回0。
依次类推,时钟最大的显示值为23小时59分59秒。
这里只要确定了1秒的定时时间,其他位均以此为基准往上累加。
开始程序定义了秒,十秒,分,十分,小时,十小时,共6位的寄存器,分别存在30h,31h,32h,33h,34h,35h单元,便于程序以后调用和理解。
6个数码管分别显示时、分、秒,一个功能键,可以切换调整时分秒、增加数值、熄灭节电等功能全部集一键。
以下是部分汇编源程序,购买我们产品后我们用光盘将完整的单片机汇编源程序和烧写文件送给客户。
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 中断入口程序 ;; (仅供参考) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ORG 0000H ;程序执行开始地址LJMP START ;跳到标号START执行ORG 0003H ;外中断0中断程序入口RETI ;外中断0中断返回ORG 000BH ;定时器T0中断程序入口LJMP INTT0 ;跳至INTTO执行ORG 0013H ;外中断1中断程序入口RETI ;外中断1中断返回ORG 001BH ;定时器T1中断程序入口LJMP INTT1 ;跳至INTT1执行ORG 0023H ;串行中断程序入口地址RETI ;串行中断程序返回;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; 主程序 ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;START: MOV R0,#70H ;清70H-7AH共11个内存单元MOV R7,#0BH;clr P3.7 ;CLEARDISP: MOV @R0,#00H ;INC R0 ;DJNZ R7,CLEARDISP ;MOV 20H,#00H ;清20H(标志用)MOV 7AH,#0AH ;放入"熄灭符"数据MOV TMOD,#11H ;设T0、T1为16位定时器MOV TL0,#0B0H ;50MS定时初值(T0计时用)MOV TH0,#3CH ;50MS定时初值MOV TL1,#0B0H ;50MS定时初值(T1闪烁定时用)MOV TH1,#3CH ;50MS定时初值SETB EA ;总中断开放SETB ET0 ;允许T0中断SETB TR0 ;开启T0定时器MOV R4,#14H ;1秒定时用初值(50M S×20)START1: LCALL DISPLAY ;调用显示子程序JNB P3.7,SETMM1 ;P3.7口为0时转时间调整程序SJMP START1 ;P3.7口为1时跳回START1 SETMM1: LJMP SETMM ;转到时间调整程序SETMM; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; 1秒计时程序 ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;T0中断服务程序INTT0: PUSH ACC ;累加器入栈保护PUSH PSW ;状态字入栈保护CLR TR0 ;关闭定时器T0MOV A,#0B7H ;中断响应时间同步修正ADD A,TL0 ;低8位初值修正MOV TL0,A ;重装初值(低8位修正值)MOV A,#3CH ;高8位初值修正ADDC A,TH0 ;MOV TH0,A ;重装初值(高8位修正值)SETB TR0 ;开启定时器T0DJNZ R4, OUTT0 ;20次中断未到中断退出ADDSS: MOV R4,#14H ;20次中断到(1秒)重赋初值MOV R0,#71H ;指向秒计时单元(71H-72H)ACALL ADD1 ;调用加1程序(加1秒操作)MOV A,R3 ;秒数据放入A(R3为2位十进制数组合)CLR C ;清进位标志CJNE A,#60H,ADDMM ;ADDMM: JC OUTT0 ;小于60秒时中断退出ACALL CLR0 ;大于或等于60秒时对秒计时单元清0MOV R0,#77H ;指向分计时单元(76H-77H)ACALL ADD1 ;分计时单元加1分钟MOV A,R3 ;分数据放入ACLR C ;清进位标志CJNE A,#60H,ADDHH ;ADDHH: JC OUTT0 ;小于60分时中断退出ACALL CLR0 ;大于或等于60分时分计时单元清0MOV R0,#79H ;指向小时计时单(78H-79H)ACALL ADD1 ;小时计时单元加1小时MOV A,R3 ;时数据放入ACLR C ;清进位标志CJNE A,#24H,HOUR ;HOUR: JC OUTT0 ;小于24小时中断退出ACALL CLR0 ;大于或等于24小时小时计时单元清0OUTT0: MOV 72H,76H ;中断退出时将分、时计时单元数据移MOV 73H,77H ;入对应显示单元MOV 74H,78H ;MOV 75H,79H ;POP PSW ;恢复状态字(出栈)POP ACC ;恢复累加器RETI ;中断返回; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 闪动调时程序 ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;T1中断服务程序,用作时间调整时调整单元闪烁指示INTT1: PUSH ACC ;中断现场保护PUSH PSW ;MOV TL1, #0B0H ;装定时器T1定时初值MOV TH1, #3CH ;DJNZ R2,INTT1OUT ;0.3秒未到退出中断(50MS中断6次)MOV R2,#06H ;重装0.3秒定时用初值CPL 02H ;0.3秒定时到对闪烁标志取反JB 02H,FLASH1 ;02H位为1时显示单元"熄灭"MOV 72H,76H ;02H位为0时正常显示MOV 73H,77H ;MOV 74H,78H ;MOV 75H,79H ;INTT1OUT: POP PSW ;恢复现场POP ACC ;RETI ;中断退出FLASH1: JB 01H,FLASH2 ;01H位为1时,转小时熄灭控制MOV 72H,7AH ;01H位为0时,"熄灭符"数据放入分MOV 73H,7AH ;显示单元(72H-73H),将不显示分数据MOV 74H,78H ;MOV 75H,79H ;AJMP INTT1OUT ;转中断退出FLASH2: MOV 72H,76H ;01H位为1时,"熄灭符"数据放入小时MOV 73H,77H ;显示单元(74H-75H),小时数据将不显示MOV 74H,7AH ;MOV 75H,7AH ;AJMP INTT1OUT ;转中断退出; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 加1子程序 ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ADD1: MOV A,@R0 ;取当前计时单元数据到ADEC R0 ;指向前一地址SWAP A ;A中数据高四位与低四位交换ORL A,@R0 ;前一地址中数据放入A中低四位ADD A,#01H ;A加1操作DA A ;十进制调整MOV R3,A ;移入R3寄存器ANL A,#0FH ;高四位变0MOV @R0,A ;放回前一地址单元MOV A,R3 ;取回R3中暂存数据INC R0 ;指向当前地址单元SWAP A ;A中数据高四位与低四位交换ANL A,#0FH ;高四位变0MOV @R0,A ;数据放入当削地址单元中RET ;子程序返回; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 清零程序 ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;............. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 时钟调整程序 ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;当调时按键按下时进入此程序SETMM: cLR ET0 ;关定时器T0中断CLR TR0 ;关闭定时器T0LCALL DL1S ;调用1秒延时程序JB P3.7,CLOSEDIS ;键按下时间小于1秒,关闭显示(省电)MOV R2,#06H ;进入调时状态,赋闪烁定时初值SETB ET1 ;允许T1中断SETB TR1 ;开启定时器T1SET2: JNB P3.7,SET1 ;P3.7口为0(键未释放),等待SETB 00H ;键释放,分调整闪烁标志置1SET4: JB P3.7,SET3 ;等待键按下LCALL DL05S ;有键按下,延时0.5秒JNB P3.7,SETHH ;按下时间大于0.5秒转调小时状态MOV R0,#77H ;按下时间小于0.5秒加1分钟操作LCALL ADD1 ;调用加1子程序MOV A,R3 ;取调整单元数据CLR C ;清进位标志CJNE A,#60H,HHH ;调整单元数据与60比较HHH: JC SET4 ;调整单元数据小于60转SET4循环LCALL CLR0 ;调整单元数据大于或等于60时清0CLR C ;清进位标志AJMP SET4 ;跳转到SET4循环CLOSEDIS: SETB ET0 ;省电(LED不显示)状态。
简单的51单片机电子时钟

仿真图:C程序;#include<reg51.h>#define uint unsigned int#define uchar unsigned charsbit k1=P3^5;sbit k2=P3^6;sbit k3=P3^7;uchar code duan[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x40};//显示数组uchar hc[8]; //缓存数组uchar jishu,jishu1=0,k,set,shan,a,b,c,time; //变量定义char shi,fen,miao; //时分秒定义(必须为char不然按键会显乱码)//====延时子程序=====//void delay(uint t){uchar i;while(t--)for(i=110;i>0;i--);}//====按键子程序===//void key(){//====调节选择===//if(k1==0){delay(5);while(k1==0);if(++set==4) set=0;}//====时分秒,加调整=====// if(k2==0){delay(5);while(k2==0);if(set==1){if(++miao==60) miao=0;}if(set==2){if(++fen==60) fen=0;}if(set==3){if(++shi==24) shi=0;}}//====时分秒,减调整=====//if(k3==0){delay(5);while(k3==0);if(set==1){if(--miao<0) miao=59;}if(set==2){if(--fen<0) fen=59;}if(set==3){if(--shi<0) shi=23;}}//====调整闪烁====//if(set==1) a=0xff*shan; else{a=0;} if(set==2) b=0xff*shan; else{b=0;} if(set==3) c=0xff*shan; else{c=0;} }//=====中断初始化===//void init(){TMOD=0x01;TH0=(65535-5000)/256;TL0=(65535-5000)%256;EA=1;ET0=1;TR0=1;}//=====选择中断方式1=====//void tint(void) interrupt 1{TH0=(65535-5000)/256;TL0=(65535-5000)%256;//===10秒无操作跳出时间调整====//if(set!=0){if((k1==0)||(k2==0)||(k3==0)) time=0;if(time>=10) {set=0;time=0 ; }}//====时分秒即时==//jishu++;if(jishu==40){jishu=0;shan=!shan; //控制闪烁变量if(++k==4){ k=0;time++;if(++miao==60){miao=0;if(++fen==60){fen=0;if(++shi==24)shi=0;}}}}//=====显示位分离,存入缓存数组====//hc[0]= c|shi/10;hc[1]= c|shi%10;hc[2]=10;hc[3]=b|fen/10;hc[4]=b|fen%10;hc[5]=10;hc[6]=a|miao/10;hc[7]=a|miao%10;jishu1++;if(jishu1==8)jishu1=0;P2=(P2+1)%8; //138位扫描P0=duan[hc[jishu1]]; //显示段扫描}void main(){init(); //中断初始化P2=0x00; //138初始位校正(去掉显示会后移一位)while(1){key(); //按键程序}}。
基于51单片机的多功能电子钟设计

基于51单片机的多功能电子钟设计1. 本文概述随着现代科技的发展,电子时钟已成为日常生活中不可或缺的一部分。
本文旨在介绍一种基于51单片机的多功能电子钟的设计与实现。
51单片机因其结构简单、成本低廉、易于编程等特点,在工业控制和教学实验中得到了广泛应用。
本文将重点阐述如何利用51单片机的这些特性来设计和实现一个具有基本时间显示、闹钟设定、温度显示等功能的电子钟。
本文的结构安排如下:将详细介绍51单片机的基本原理和特点,为后续的设计提供理论基础。
接着,将分析电子钟的功能需求,包括时间显示、闹钟设定、温度显示等,并基于这些需求进行系统设计。
将详细讨论电子钟的硬件设计,包括51单片机的选型、时钟电路、显示电路、温度传感器电路等。
软件设计部分将介绍如何通过编程实现电子钟的各项功能,包括时间管理、闹钟控制、温度读取等。
本文将通过实验验证所设计的电子钟的功能和性能,并对实验结果进行分析讨论。
通过本文的研究,旨在为电子钟的设计提供一种实用、经济、可靠的方法,同时也为51单片机的应用提供一个新的实践案例。
2. 51单片机概述51单片机,作为一种经典的微控制器,因其高性能、低功耗和易编程的特性而被广泛应用于工业控制、智能仪器和家用电器等领域。
它基于Intel 8051微处理器的架构,具备基本的算术逻辑单元(ALU)、程序计数器(PC)、累加器(ACC)和寄存器组等核心部件。
51单片机的核心是其8位CPU,能够处理8位数据和执行相应的指令集。
51单片机的内部结构主要包括中央处理单元(CPU)、存储器、定时器计数器、并行IO口、串行通信口等。
其存储器分为程序存储器(ROM)和数据存储器(RAM)。
程序存储器通常用于存放程序代码,而数据存储器则用于存放运行中的数据和临时变量。
51单片机还包含特殊功能寄存器(SFR),用于控制IO端口、定时器计数器和串行通信等。
51单片机的工作原理基于冯诺伊曼体系结构,即程序指令和数据存储在同一块存储器中,通过总线系统进行传输。
利用51单片机制作的电子时钟

利用51单片机制作的电子时钟最近研究起来了单片机,用的是国产STC98C52 芯片。
STC89C52 是STC公司生产的一种低功耗、高性能CMOS8 位微控制器,具有8K 在系统可编程Flash 存储器。
STC89C52 使用经典的MCS-51 内核,但做了很多的改进使得芯片具有传统51 单片机不具备的功能。
在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得STC89C52 为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。
买了很长时间了可是一直在那里放着,今天重新拿出来写了一段电子时钟的C++程序,利用充电宝供电,当作电子时钟挺不错的。
功能:4 个七段数码管作为时钟显示的主体两个显示小时,两个显示分钟,8 个LED 灯作为秒数的闪烁,4 个独立按键分别为hour+1,hour+10,minute+1,minute+10。
查询LED 电路,接入端为P1到P1。
数码管采用了驱动芯片,接入端为P2到P2。
按键的接入端如图所示。
有了各种电路的接入端,我们利用keil 进行编程。
/* * Copyright (c) 2015,烟台大学计算机学院* All right reserved. * 作者:邵帅* 文件:temp.c* 完成时间:2015 年05 月29 日*/ #include #define uchar unsigned char sbit P2_0 = P2;sbit P2_1 = P2;sb it P2_2 = P2 ;sbit P2_3 = P2;sb it key1=P3 ;//按键sbit key2=P3;sb it key3=P3;sb it key4=P3 ;static unsigned char second,minute,hour;unsigned int tcount;unsigned char m;uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};void delay(uchar。
基于51单片机的电子时钟设计

基于51单片机的电子时钟设计
摘要:本文论述了基于51单片机的电子时钟设计,包括硬件设计与软件编程。
其中,硬件设计包括基本指示灯、DS1302时钟芯片等的选择与连接,时钟电路、晶振电路的设计等。
软件编程包括时钟显示的实现,时钟校准、闹钟等功能的实现等。
本设计具有精度高、操作简便、易于实现等特点,可广泛应用于各种场合。
关键词:51单片机;电子时钟;硬件设计;软件编程
前言
随着人们生活水平的提高,电子时钟已经成为人们生活中必不可少的物品,目前市场上各种类型的电子时钟层出不穷。
本文以51单片机为基础,设计了一款高精度、易于操作的电子时钟,采用DS1302时钟芯片作为时钟驱动芯片,实现了时钟的准确显示、校准、闹钟等功能。
硬件设计
硬件设计主要包括控制器、时钟驱动、显示装置以及电源。
本设计采用了AT89C51单片机作为控制器,一块DS1302时钟芯片作为时钟驱动,LED数字管作为显示装置。
同时,本设计采用了USB供电方式,其电源电压为5V。
软件编程
软件编程主要包括时钟显示、时钟校准、闹钟功能的实现等。
时钟显示采用了动态显示方式,实现了时间的精确定位。
同时,本设计还具有时钟校准功能,在程序接通时,可自动对时钟进行校准,保证时钟的精确度。
此外,本设计还具有设置闹钟的功能,用户可在指定时间响起闹钟。
结论本文以51单片机为基础,设计了一款高精度、易于操作的电子时钟。
通过对硬件设计、软件编程的设计与实现,使得该产品能够准确显示时间,保证了时钟的稳定性,满足了时间的要求,目前已
得到广泛应用。
基于51单片机的电子时钟设计

基于51单片机的电子时钟设计51单片机是一种广泛应用于嵌入式系统的微控制器,由于其性能稳定、易于编程和成本相对较低的特点,被广泛应用于各种电子设备中。
在现代社会,电子时钟已经成为人们日常生活中不可或缺的工具。
随着科技的不断发展,电子时钟在功能和外观上都得到了极大的提升,如今的电子时钟不仅可以显示时间,还能设置闹钟、定时、显示温湿度等功能。
本文通过对51单片机的应用和实践,设计了一款功能丰富的电子时钟,旨在探讨如何利用51单片机实现电子时钟的设计与制作过程。
首先,我们将介绍51单片机的基本原理和特点。
51单片机是一种8位微控制器,由Intel公司于1980年推出,至今已有数十年的历史。
它采用哈佛结构,具有较高的工作速度和稳定性,适合用于各种嵌入式系统。
51单片机的指令系统简单,易于学习和掌握,因此被广泛用于各种嵌入式应用中。
除此之外,51单片机的外围设备丰富,可以通过外部扩展模块实现各种功能,如串口通信、定时器、数模转换等,这也为我们设计电子时钟提供了便利。
其次,我们将详细介绍基于51单片机的电子时钟的设计和实现过程。
电子时钟主要由时钟模块、显示模块、闹钟模块等部分组成,通过合理的接线和程序设计实现各种功能。
首先,我们设计时钟模块,通过外部晶振产生时钟信号,并利用51单片机的定时器模块实现时间的精确计算和显示。
同时,我们还设计了显示模块,采用数码管或液晶屏显示时间和日期信息,通过数字或字符的组合,使信息直观清晰。
此外,闹钟模块也是电子时钟的重要功能之一,我们可以设置闹钟时间,并在设定时间触发闹钟功能,提醒用户。
通过合理的程序设计,我们可以实现电子时钟的各种功能,并提升用户体验。
最后,我们将讨论基于51单片机的电子时钟在实际生活中的应用前景和发展趋势。
随着智能家居的快速发展,电子时钟作为家庭必备的电子设备,其功能和外观需求也在不断提升。
未来,基于51单片机的电子时钟将会更加智能化,可以与手机、电视等智能设备联动,实现更多个性化的功能。
基于51单片机的电子时钟
闹钟提醒电路
本次设计是通过蜂鸣器来完成闹钟提醒的功能的,蜂鸣器与芯片的P2.0相连。
按键控制电路
键盘是最常用的输入设备,是实现人机对话的纽带,具体来说键盘接口应完成以下操作功能: (1)键盘扫描,以判定是否有键被按下; (2)键识别,以确定闭合键的位置; (3)排除多建、复键及去抖。 以上这些功能通常是以软硬件结合的方式来完成的,即在软件的配合下由接口电路来完成。
键盘显示方案
AT89C52的P0口和P1口外接八个LED数码管(LED7~LED0)构成显示 器 , 用 P0 口 LED 的 段 码 输 出 口 , P1 口 做 八 个 LED 数 码 管 的 位 选 输 出 口 , P3.0~P3.2外接三个按键K1、K2、K3构成键盘电路。
硬件电路
显示电路
void time() interrupt 1
//定时器中断
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
tt++;
if(tt==20)
{ tt=0;
miao++;
if(miao==60)
{
miao=0;
fen++;
if(fen==60)
{
fen=0;
shi++;
if(shi==24)
{
shi=0;
}
}
write_n_sfm(n_shi,n_fen,n_miao);
else
write_sfm(shi,fen,miao);
if(n_shi==shi&&n_fen==fen)
基于51单片机,电子显示时钟带闹钟、整点报时、日期、星期
{ StrTab[1]=second/10; //秒十位
StrTab[0]=second%10; //秒个位
StrTab[2]=10; //间隔符-
StrTab[4]=minute/10; //分十位
StrTab[3]=minute%10; //分个位
StrTab[5]=10; //间隔符-
void display(uchar w[32])
{ unsigned int i,j,c=0;
if(a==0)//正常时间显示
{ for(i=0;i<8;i++) //依次将数组w中八个数取出,并显示
{ P2=weikong_code[i]; //位选
j=w[i]; //取出要显示的数码
P0=tab[j]; //取出段选编码
if(month==13)
{month=1; year++;
if(year==10000)
year=0;}}
week++;//星期走
if(week==8)
week=1;
data1();
week1();
while(second==err);
}
}
/**********************键盘扫描子程序*************************/
{if(dБайду номын сангаасy==30); //闰年29天
{day=1; month++;
if(month==13)
{month=1; year++;
if(year==10000)
year=0;}}}
基于51单片机的简易电子钟设计
基于51单片机的简易电子钟设计一、设计目的现代社会对于时间的要求越来越精确,电子钟成为家庭和办公场所不可缺少的设备之一、本设计基于51单片机,旨在实现一个简易的电子钟,可以显示当前的时间,并且能够通过按键进行时间的调整和设置闹钟。
二、设计原理本设计主要涉及到51单片机的IO口、定时器、中断、LCD显示技术等方面知识。
1.时钟模块时钟模块采用定时器0的中断进行时间的累加和更新。
以1秒为一个时间单位,每当定时器0中断发生,就将时间加1,并判断是否需要更新小时、分钟和秒的显示。
同时,根据用户按键的操作,可以调整时间的设定。
2.显示模块显示模块采用16x2字符LCD显示屏,通过51单片机的IO口与LCD连接。
可以显示当前时间和设置的闹钟时间。
初次上电或者重置后,LCD显示时间为00:00:00,通过定时器中断和键盘操作,实现时间的更新和设定闹钟功能。
3.键盘模块键盘模块采用矩阵键盘连接到51单片机的IO口上,用于用户进行时间的调整和设置闹钟。
通过查询键盘的按键状态,根据按键的不同操作,实现时间的调整和闹钟设定功能。
4.中断模块中断模块采用定时器0的中断,用于1秒的定时更新时间。
同时可以添加外部中断用于响应用户按键操作。
三、主要功能和实现步骤1.系统初始化。
2.设置定时器,每1秒产生一次中断。
3.初始化LCD显示屏,显示初始时间00:00:00。
4.查询键盘状态,判断是否有按键按下。
5.如果按键被按下,根据不同按键的功能进行相应的操作:-功能键:设置、调整、确认。
-数字键:根据键入的数字进行时间的调整和闹钟设定。
6.根据定时器的中断,更新时间的显示。
7.判断当前时间是否与闹钟设定时间相同,如果相同,则触发闹钟,进行提示。
8.循环执行步骤4-7,实现连续的时间显示和按键操作。
四、系统总结和改进使用51单片机设计的简易电子钟可以显示当前时间,并且实现时间的调整和闹钟设定功能。
但是由于硬件资源有限,只能实现基本的功能,不能进行其他高级功能的扩展,例如闹铃的音乐播放、温度、湿度的显示等。
51单片机电子时钟设计
51单片机电子时钟设计电子时钟是一种非常实用的电子设备,它可以准确地显示时间,并拥有一系列的功能,如闹钟、日历等。
使用51单片机设计电子时钟,可以实现这些功能,同时还能够进行功能扩展,更好地满足用户需求。
首先,我们需要硬件上的准备工作。
51单片机需要与时钟(晶振)和显示器(LCD模块)进行连接。
晶振是提供单片机时钟脉冲的源头,LCD模块用于显示时间和各种功能。
同时,在电路中还需要进行一些扩展,如实时时钟模块(RTC模块)、按键模块等。
在软件设计方面,主要需要考虑以下几个方面:1.时钟脉冲:通过配置晶振的频率,可以生成单片机所需的时钟脉冲。
这个脉冲控制了单片机的运行速度,从而影响到时钟的准确性。
需要根据晶振频率进行相关配置。
2.时间的获取和计算:通过RTC模块可以获取当前的时钟数据(包括年、月、日、时、分、秒)。
在程序中,需要通过相应的接口获取这些数据,并进行计算。
比如,在显示时钟的时候,可以通过获取秒数、分钟数和小时数,并将其转换为相应的字符串进行显示。
3.菜单和按键功能:为了实现更多的功能,我们可以通过按键来实现菜单切换和功能选择。
在程序中,需要对按键进行扫描,判断按键的状态,然后进行相应的操作。
比如,按下菜单键可以进入菜单界面,通过上下键选择不同的功能,再通过确定键进行确认。
4.闹钟功能:闹钟功能是电子时钟中常见的功能之一、通过设置闹钟时间,并进行闹钟的开启或关闭,可以在指定的时间点触发相应的报警动作。
在程序中,需要编写逻辑判断闹钟是否到达指定的时间,然后触发报警。
5.日历功能:除了显示时间,电子时钟还可以显示当前的日期,包括年、月、日。
在程序中,需要编写相关的逻辑来获取日期数据,并进行显示。
通过以上的步骤,我们可以基本实现一个简单的电子时钟功能。
当然,根据用户的需求,还可以进行更多的功能扩展,比如添加温湿度监测、自动调光等功能。
总结起来,51单片机电子时钟的设计主要包括硬件和软件两个方面。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
用51单片机做的电子时钟程序如下:#includeunsigned char codetable1[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f ,0x40,0x76};//字码表0-9,最后一个是一横"-"unsigned int i,a,b,c,d,flag,flag1;unsigned int sec,min,h,nm,nh,nz;unsigned int w,day,mon,year;int miao1,miao2,miao3;sbit keyled=P1^0;sbit key2=P1^1;sbit keyinc=P1^2; sbit keymood=P1^3; sbit BEEP=P1^4; void second();void minute();void hour();void time();void riqi();void xianshi();void delay10ms(); void delay20ms();void tiaoshi();void miaobiao();void miaotime();void week();void naozhong();void shengyin();//前几天刚用了下定时器,想起来之前用汇编写的时钟程序基本没有什么功能,所以这几天就用C再写了下//这个时钟的功能是模仿我自己的手表写的,功能完全一样,有秒表,闹钟,可以显示年月日及星期/{if(min==nm&&h==nh)//时间到了,闹钟响{shengyin(); //闹钟的声音程序}}if(c==0||c==2){if(keymood==0){miao1=0;miao2=0;miao3=0;}}while(b==1)//保证按键只按一次,没有重复按键{tiaoshi();goto B1; //如果b还等于1,刚重复扫描秒表界面}}/{ i=0; //将i清零,保证每次进入都是一样的B2:if(nz==0){ if(min==nm&&h==nh) {shengyin();}}naozhong();while(b==2){ tiaoshi();goto B2;}}{ i=1;B3:if(nz==0){ if(min==nm&&h==nh){shengyin();}}xianshi(); //显示程序,用i的大小来分配,相当于调时、分、秒就显示时间,调年月日就显示日期while(b==3){tiaoshi();goto B3;}}/{ i=0;if(nz==0){ if(min==nm&&h==nh) {shengyin();}}second();minute();hour();}if(keyinc==0){ delay10ms();if(keyinc==0){B: riqi();while(keyinc==0) {goto B;}}}if(keymood==0) {delay10ms();if(keymood==0) {N: naozhong(); }while(keymood==0){goto N;}}tiaoshi();/{if(flag>10) //在flag>10的时候关闭所有的数码管,其他时间开启相应位,这样就可以达到闪烁的目的了{P3=0xff;}else{P3=0x7f;}}else //如果i不等于1,刚正常显示,不会闪烁{P3=0x7f;}P2=table1[secge];for(a=0;a<100;a++); if(i==1){if(flag>10){P3=0xff;}else{P3=0xbf;}}else //如果i不等于1,刚正常显示,不会闪烁{P3=0xbf;}P2=table1[secshi];for(a=0;a<100;a++);P3=0xdf;P2=table1[10];for(a=0;a<100;a++);//*******************************分显示程序***************************void minute(){int minge,minshi;minge=min%10;minshi=min/10;if(i==2){if(flag>10) {P3=0xff;}else{P3=0xef;}}else{P3=0xef;}P2=table1[minge];for(a=0;a<100;a++);if(i==2){if(flag>10){P3=0xff;}else{P3=0xf7;}}else{P3=0xf7;}P2=table1[minshi];for(a=0;a<100;a++);P3=0xfb;P2=table1[10];for(a=0;a<100;a++);}//*********************************时显示程序*************************void hour(){int hourge,hourshi;hourge=h%10;hourshi=h/10;if(i==3) {if(flag>10) {P3=0xff;}else{P3=0xfd;}}else{P3=0xfd;}P2=table1[hourge];for(a=0;a<100;a++); if(i==3){if(flag>10){P3=0xff; }else{P3=0xfe; }}else{P3=0xfe; }P2=table1[hourshi];for(a=0;a<100;a++);}//*****************************年、月、日显示程序************************void riqi(){int dayge,dayshi;int monge,monshi;int yearge,yearshi;dayge=day%10;dayshi=day/10;if(i==4) {if(flag>10) {P3=0xff;}else{P3=0x7f;}}else{P3=0x7f;}P2=table1[dayge];for(a=0;a<100;a++); if(i==4){if(flag>10){P3=0xff;}else{P3=0xbf;}}else{P3=0xbf;}P2=table1[dayshi];for(a=0;a<100;a++); P3=0xdf;P2=table1[10];for(a=0;a<100;a++); monge=mon%10; monshi=mon/10;if(i==5){if(flag>10){P3=0xff;}else{P3=0xef;}}else{P3=0xef;}P2=table1[monge];for(a=0;a<100;a++); if(i==5){if(flag>10){P3=0xff;}else{P3=0xf7;}}else{P3=0xf7;}P2=table1[monshi]; for(a=0;a<100;a++); P3=0xfb;P2=table1[10];for(a=0;a<100;a++); yearge=year%10;yearshi=year/10; if(i==6){if(flag>10) {P3=0xff;}else{P3=0xfd;}}else{P3=0xfd;}P2=table1[yearge];for(a=0;a<100;a++); if(i==6){if(flag>10){P3=0xff; }else{P3=0xfe; }}else{P3=0xfe; }P2=table1[yearshi];for(a=0;a<100;a++);}//*****************************星期显示程序****************************void week(){if(i==7){if(flag>10){P3=0xff; }else{P3=0xef; }}else{P3=0xef; }P2=table1[w];for(a=0;a<100;a++);}//*****************************秒表显示程序************************void miaobiao(){int miao1ge,miao1shi;int miao2ge,miao2shi;int miao3ge,miao3shi;miao1ge=miao1%10;miao1shi=miao1/10;P3=0x7f;P2=table1[miao1ge]; for(a=0;a<100;a++); P3=0xbf;P2=table1[miao1shi]; for(a=0;a<100;a++); P3=0xdf;P2=table1[10];for(a=0;a<100;a++); miao2ge=miao2%10; miao2shi=miao2/10;P3=0xef;P2=table1[miao2ge]; for(a=0;a<100;a++); P3=0xf7;P2=table1[miao2shi]; for(a=0;a<100;a++); P3=0xfb;P2=table1[10];for(a=0;a<100;a++); miao3ge=miao3%10; miao3shi=miao3/10;P3=0xfd;P2=table1[miao3ge];for(a=0;a<100;a++);P3=0xfe;P2=table1[miao3shi];for(a=0;a<100;a++);}//****************************闹钟显示程序************************void naozhong(){int nmge,nmshi;int nhge,nhshi;nmge=nm%10;nmshi=nm/10;if(i==1||i==3||i==5||i==7) {if(flag>10){P3=0xff;}elseP3=0xef;}}else{P3=0xef;}P2=table1[nmge];for(a=0;a<100;a++); if(i==1||i==3||i==5||i==7)if(flag>10) {P3=0xff;}else{P3=0xf7;}}elseP3=0xf7;}P2=table1[nmshi];for(a=0;a<100;a++); P3=0xfb; //显示一横P2=table1[10];for(a=0;a<100;a++); nhge=nh%10;nhshi=nh/10;if(i==2||i==4||i==6)if(flag>10) {P3=0xff;}else{P3=0xfd;}}elseP3=0xfd;}P2=table1[nhge];for(a=0;a<100;a++); if(i==2||i==4||i==6) {if(flag>10){P3=0xff;}else{P3=0xfe;}}else{P3=0xfe;}P2=table1[nhshi];for(a=0;a<100;a++);P3=0xdf; //显示HP2=table1[11];for(a=0;a<100;a++);}//*******************************调时显示***********************void xianshi(){if(i>3&&i<7){riqi();}else if(i==7) {week(); }else{second(); minute(); hour();}}//***********************************闹钟声音程序****************void shengyin(){BEEP=~BEEP;for(a=0;a<10;a++);}//***************************时钟加1程序*******************************void time(){if(flag==90){flag=0;sec++;if(sec==60){sec=0;min++;if(min==60){min=0;h++;。