51单片机可调时钟
基于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单片机的工作原理基于冯诺伊曼体系结构,即程序指令和数据存储在同一块存储器中,通过总线系统进行传输。
DIY基于51单片机的旋转LED数字电子钟

标签:DIY基于51单片机的旋转LED数字电子钟(红外线遥控调时)在网上看到不少老外做的各种旋转LED显示屏,非常COOL,我也动手用洞洞板试做了一个类似的显示屏,结果感觉还不错。
于是再接再励继续努力,将作品进一步改进,完善后制成如今这个样子。
由于刚学51单片机,加上制作电路板软件也是从零开始,的确花了我不少的时间和精力。
不过也就是在这艰难的独立制作中,真正学到了不少实在的东西。
本项目的关键是如何解决高速旋转的电路板如何供电,如何调时的问题。
我采用电机电刷的原理,将旋转轴钻空,通过一只插头将电源的从反面引到前面的电路板上,而这个旋转的插头又与固定在背板上的两个铜片接触的。
调时的问题有些困难,一是让电路板在旋转前与PC机相接,由电脑传送调时数据,这虽然可行但不方便。
还有就是用遥控方法,但此方案在调试方面有很大的困难。
显示方式上,我采用平衡式的两排LED,这除了在旋转时能较好的保持平衡外,主要能利用两边交替显示方式,比单排要快一倍。
本装置不仅是一个时钟,它还可以动态显示汉字及图案,这就看如何发挥了。
其具体制作过程如下:一。
旋转电机的制作从制作成本与方便考虑,选用旧电脑用的大软驱上的直流无刷电机,只是对局部进行改造。
就是这种古董软驱软驱上的直流无刷电机拆开后的电机仔细拆开直流电机,将带圆盘的铝轴从中开孔,让它刚好能插入一个插头。
将旋转轴加工成这样装配好以后按拆开时的顺序,反序将轴安装直流电机上。
电机装配完成后用两片铜片做的电刷电刷装好后的侧面图将电路板上较突出的元件改焊在反面,电机的电源接法。
从电路板标注的符号看,“+”为电源正,“G”为电源负,“C”与“M”端分别与电源正相连匀可使电机运转将一张旧唱片按电机座的位置开孔,而定位用的挡光板应根据电路板上感光组件的位置确定。
二。
电路板的制作本制作品用51单片机控制,具体电原理图如下:用Protel 99设计制作了电路板。
最后得到完成的作品。
遥控器用的是松下车载机的,只用了其中的六个键。
基于-51单片机可调数字钟的设计

师学院单片机技术课程实践——基于89C51单片机可调数字钟的仿真设计班级::学号:辅导老师:设计时间:1. 设计目的1.1设计目的(1)掌握51系列部定时/计数器的原理和基本应用;(2)掌握使用单片机处理复杂逻辑的方法;(3)掌握多位数码管动态显示的方法;(4)掌握独立式(和矩阵)键盘的编程方法;(5)掌握利用汇编语言编写单片机系统的应用软件的方法;(6) 巩固,加深和扩大单片机应用的知识面,提高综合及灵活运用所学知识解决工业控制的能力;(7) 培养针对课题需要,选择和查阅有关手册,图表及文献资料的自学能力,提高组成系统,编程,调试的动手能力;(8) 熟悉单片机用系统开发,研制的过程,软硬件设计方法,容及步骤.(9) 了解数字钟的组成及工作原理.1.2设计性能(1)用51单片机的定时/计数器TMR0产生一秒的定时时间,作为秒计数时间;(2)当一秒产生时,秒计数加1;(3)开机时,显示00.00.00,并开始连续计时;(4)计时满23.29.59时,返回00.00.00重新开始计时;(5)在以上设计基础上,在单片机的I/O口上分别接入四个按键:K0—控制“秒”的调整,每按一次加1秒;K1—控制“分”的调整,每按一次加1分;K2—控制“时”的调整,每按一次加1小时;K3—时间复位按键。
2.系统电路的方案2.1实现时钟计时的基本方法用AT89C51单片机的定时/计数器T0产生一秒的定时时间,作为秒计数时间,当一秒产生时,秒计数加1开机时。
显示00-00-00的时间,开始计时;计时满23-59-59时,返回00-00-00重新计时AT89C51单片机的部16位定时/计数器是一个可编程定时/计数器,它既可以工作在13位定时方式,也可以工作在16位定时方式和8位定时方式。
只要通过设置特殊功能寄存器TMOD,即可完成。
定时/计数器何时工作也是通过TCON特殊功能寄存器来设置的。
在此设计中,选择16位定时工作方式。
用51单片机和1602编写的时钟,可调时

#include<reg52.h>#define uint unsigned int#define uchar unsigned charsbit rs=P1^0;sbit rw=P1^1;sbit lcden=P2^5;sbit dula=P2^6;sbit wela=P2^7;sbit k1=P3^0;sbit k2=P3^1;sbit k3=P3^2;sbit rd=P3^7;sbit beep=P2^3;uchar num1,num2,num3,num4,num0,num,numa,yue,ri; char shi,fen,miao,we;uint nian;uchar code table1[]=" 2013-05-06-MON ";uchar code table2[]=" 00-00-00 ";void delay(uint x){uint i,j;for(i=x;i>0;i--)for(j=110;j>0;j--);}void di(){beep=0;delay(100);beep=1;}void write_com(uchar com){rs=0;P0=com;delay(5);lcden=1;delay(5);lcden=0;delay(5);}void write_date(uchar date){rs=1;P0=date;delay(5);lcden=1;delay(5);lcden=0;delay(5);}void write_sfm(uchar add,uchar date) {uchar shi,ge;shi=date/10;ge=date%10;write_com(0x80+0x40+add);write_date(0x30+shi);write_date(0x30+ge);}void write_nyr(uchar add,uchar date) {uchar shi,ge;// qian=date/1000;// bai=date%1000/100;shi=date%100/10;ge=date%10;write_com(0x80+add);// write_date(0x30+qian);// write_date(0x30+bai);write_date(0x30+shi);write_date(0x30+ge);}/*void write_nian(uchar add,uchar date) {uchar qian,bai,shi,ge;qian=date%10000/1000;bai=date%1000/100;shi=date%100/10;ge=date%10;write_com(0x80+add);write_date(0x30+qian);write_date(0x30+bai);write_date(0x30+shi);write_date(0x30+ge);} */void write_week(uchar add,char we){//写液晶星期显示函数write_com(0x80+12);switch(we){case 1: write_date('M');delay(5);write_date('O');delay(5);write_date('N');break;case 2: write_date('T');delay(5);write_date('U');delay(5);write_date('E');break;case 3: write_date('W');delay(5);write_date('E');delay(5);write_date('D');break;case 4: write_date('T');delay(5);write_date('H');delay(5);write_date('U');break;case 5: write_date('F');delay(5);write_date('R');delay(5);write_date('I');break;case 6: write_date('S');delay(5);write_date('A');delay(5);write_date('T');break;case 7: write_date('S');delay(5);write_date('U');delay(5);write_date('N');break;}}void init() // 初始化函数{rw=0;dula=0;wela=0;lcden=0;fen=58;shi=10;miao=34;nian=11;write_com(0x38);write_com(0x0f);write_com(0x06);write_com(0x01);write_com(0x80);for(num=0;num<18;num++){write_date(table1[num]);delay(5);}write_com(0x80+0x40);for(num=0;num<12;num++){write_date(table2[num]);delay(5);}TMOD=0x01;TH0=(65536-45872)/256;TL0=(65536-45872)%256;num0++;EA=1;ET0=1;TR0=1;}void time0() interrupt 1{TH0=(65536-45872)/256;TL0=(65536-45872)%256;num0++;if(num0==20){ num0=0;miao++;if(miao==60){fen++;miao=0;if(fen==60){fen=0;shi++;if(shi==24)shi=0;we++;ri++;if(ri==32){ri=1;yue++;if(yue==13){yue=1;nian++;if(nian==30){nian=11;}write_nyr(3,nian);}write_nyr(6,yue);}write_nyr(9,ri);if(we==8){we=1;}write_week(12,we);}write_sfm(4,shi);}write_sfm(7,fen);}write_sfm(10,miao);}}void keyscan(){rd=0;if(k1==0)delay(5);if(k1==0){ num1++;while(!k1); //等于1就退出if(num1==1){write_com(0x80+0x40+11);write_com(0x0f);}if(num1==2){write_com(0x80+0x40+8);}if(num1==3){write_com(0x80+0x40+5);}if(num1==4){// num1=0;write_com(0x80+14);TR0=1;}if(num1==5){write_com(0x80+10);}if(num1==6){write_com(0x80+7);}if(num1==7){write_com(0x80+4);}if(num1==8){num1=0;write_com(0x0c);TR0=1;}}if(num1!=0){TR0=0;if(num1==1){if(k2==0){delay(5);if(k2==0){miao++;if(miao==59)miao=-1;while(!k2) ;write_sfm(10,miao);}}}if(num1==2){if(k2==0)delay(5);if(k2==0){fen++;if(fen==59)fen=-1;while(!k2);write_sfm(7,fen);}}if(num1==3){if(k2==0)delay(5);if(k2==0){shi++;if(shi==24)shi=0;while(!k2);write_sfm(4,shi);}}if(num1==4){if(k2==0){delay(5);if(k2==0){we++;if(we==8)we=1;while(!k2);write_com(0x80+12);write_week(12,we);}}}if(num1==5){if(k2==0)delay(5);if(k2==0){ri++;if(ri==32)ri=0;while(!k2);write_nyr(9,ri);}}if(num1==6){if(k2==0)delay(5);if(k2==0){yue++;if(yue==13)yue=1;while(!k2);write_nyr(6,yue);}}if(num1==7){if(k2==0)delay(5);if(k2==0){nian++;if(nian==30)nian=11;while(!k2);write_nyr(3,nian);}}}if(k3==0){delay(5);if(k3==0){while(!k3);switch(num1){case 1:miao--;if(miao==-1)miao=59; while(!k3);write_sfm(10,miao);break;case 2:fen--;if(fen==-1)fen=59; while(!k3);write_sfm(7,fen);break;case 3:shi--;if(shi==-1)shi=23; while(!k3);write_sfm(4,shi);break;case 4:we--;if(we==0)we=7; while(!k3); //write_com(0x80+12);write_week(12,we);break;case 5:ri--;if(ri==0)ri=31;while(!k3);write_nyr(9,ri);break;case 6:yue--;if(yue==0)yue=12;while(!k3);write_nyr(6,yue);break;case 7:nian--;if(nian==10)nian=30;while(!k3);write_nyr(3,nian);break;}}}}void main(){ init();while(1){// di();keyscan();}}。
51单片机可调时电子时钟程序

//*******************基于51单片机的可调时电子时钟实验**********************////***电子时钟前两位为分钟,后两位为秒钟,逢38秒进1分***********************////***按下调时键第一次,秒钟闪烁,进入编辑状态******************************////***按下调时键第二次,分钟闪烁,进入编辑状态******************************////***按下调时键第三次,则确定**********************************************////***在编辑状态下,按下增/减按钮,闪烁位则进行加/减操作********************////***若在编辑状态下,按下增/减按钮时间超过1S,则闪烁位以0.5秒的速度自加1***//#include<reg51.h>#define uint unsigned int#define uchar unsigned charsbit wela1=P2^4;sbit wela2=P2^5;sbit wela3=P2^6;sbit wela4=P2^7;sbit key1=P1^5;sbit key2=P1^6;sbit key3=P1^7;//位定义uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};uchar miao,fen,mode,modeflag;//模式标志位bit flag,flash,miao_long,fen_long;//*********延时子函数*************// void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}//********定时器T0和变量的初始化****// void T0_init(){miao=00;fen=00;mode=0;modeflag=0;flash=0;flag=0;P2=0x0f;//锁存允许接口全部置低电平TMOD=0x01;//选择定时器工作方式TH0=(65536-2000)/256;TL0=(65536-2000)%256;//赋初值EA=1;//开总中断ET0=1;//开定时器中断TR0=1;//启动定时器}//*******数码管显示子函数***********// void display(){if(flag==0)//闪烁标志位为0时不闪烁{wela1=1;P0=table[fen/10];wela1=0;wela2=1;P0=table[fen%10];wela2=0; //送数给分位显示wela3=1;P0=table[miao/10];wela3=0;wela4=1;P0=table[miao%10];wela4=0; //送数给秒位显示}else //闪烁标志位为1时闪烁{if(mode==1)//模式为1,即调秒{if(miao_long==0)//没有长按加、减按钮{if(flash==0)//当闪烁等于0时{wela3=1;P0=table[miao/10];wela3=0;wela4=1;P0=table[miao%10];wela4=0;}else//当闪烁等于1时{P0=0xff;wela3=0;wela4=1;P0=0xff;wela4=0;}}else//长按了加、减按钮{wela3=1;P0=table[miao/10];wela3=0;wela4=1;P0=table[miao%10];wela4=0;}}else//模式为2,即调分{wela3=1;P0=table[miao/10];wela3=0;wela4=1;P0=table[miao%10];wela4=0; //在秒位熄灭的那一刻,按下调时键时,要把秒位点亮if(fen_long==0)//没有长按加、减按钮{if(flash==0){P0=table[fen/10];wela1=0;wela2=1;P0=table[fen%10];wela2=0;}else{wela1=1;P0=0xff;wela1=0;wela2=1;P0=0xff;wela2=0;}}else//长按了加、减按钮{wela1=1;P0=table[fen/10];wela1=0;wela2=1;P0=table[fen%10];wela2=0;}}}}//*********key1按钮子程序**************//void key1_scan(){if(key1==0){delay(10);//消抖if(key1==0){modeflag++;//模式标志位自加1flag=1;//闪烁标志位打开mode++;//模式自加1if(mode==3)//只在模式1:调秒,模式2:调分中间选择mode=0;while(!key1);//松手检测}}else if(modeflag==3)//按键次数到了第三次{modeflag=0;flag=0;while(!key1);}}//************key2,key3子程序**************//void key23_scan(){if(key2==0)//加数的操作{delay(10);if(key2==0){if(mode==1)//如果是模式1的话,key2键对秒加1{miao++;if(miao==38)//38秒进1分miao=0;delay(1000);//若按下的时间超过了1S钟,则视为长按while(!key2){miao_long=1;miao++;if(miao==38)miao=0;delay(200);}miao_long=0;//跳出长按,恢复短按的状态}else if(mode==2)//如果是模式2的话,key2键对分加一{fen++;if(fen==60)//60分钟进1fen=0;delay(1000);//若按下的时间超过了1S钟,则视为长按while(!key2){fen_long=1;fen++;if(fen==60)fen=0;delay(200);}fen_long=0;//跳出长按,恢复短按的状态}}else if(key3==0)//减数的操作{delay(10);if(key3==0){if(mode==1)//如果是模式1的话,key3键对秒减一{miao--;if(miao==0)miao=37;delay(1000);//若按下的时间超过了1S钟,则视为长按while(!key3){miao_long=1;miao--;if(miao==0)miao=37;delay(200);}miao_long=0;//跳出长按,恢复短按的状态}else if(mode==2)//如果是模式2的话,key3键对分减一{fen--;if(fen==0)fen=59;delay(1000);//若按下的时间超过了1S钟,则视为长按while(!key3)fen_long=1;fen--;if(fen==0)fen=59;delay(200);}fen_long=0;//跳出长按,恢复短按的状态}}}}void main(){T0_init();while(1){key1_scan();key23_scan();}}void T0_time() interrupt 1{static uchar t=0;static uint i=0;TH0=(65536-50000)/256;TL0=(65536-50000)%256;if(flag==0)//时间显示调整{i++;if(i==20){i=0;miao++;if(miao==38){miao=0;fen++;if(fen==60){fen=0;}}}}t++;if(t==10){t=0;flash=~flash;//闪烁标志位取反}display();}。
基于汇编语言的51单片机可调数字钟的设计

目录摘要 (3)Abstract (4)引言 (5)第一章绪论 (6)1.1 课题的背景 (6)1.2课题的来源 (7)1.3课题的意义 (7)第二章设计目的及要求 (8)2.1设计目的 (8)2.2设计要求 (8)2.1.1 基本要求 (8)2.1.2 高级要求 (8)2.1.3毕业设计作品要求 (9)第三章系统方案选择与论证 (10)3.1方案选择 (10)3.1.1方案比较 (10)3.1.2 芯片的选择 (10)3.2方案论证 (11)3.2.1显示模块方案选择与论证 (11)3.2.2时钟信号方案选择与论证 (11)3.3电路设计最终方案 (12)第四章系统电路的总体方案 (13)4.1数字钟的工作原理 (13)4.1.1实现时钟计时的基本方法 (14)4.1.2数字钟的时间显示 (15)4.1.3数字钟的启、停及时间调整 (15)4.2总体设计 (16)第五章系统的硬件设计 (17)5.1 AT89C52单片机最小系统 (17)5.2单片机的概念 (17)5.2.1单片机的结构 (17)5.2.2单片机的功能介绍 (20)5.3复位电路 (23)5.4电源电路 (24)5.5时钟振荡电路 (24)5.6键盘控制电路 (24)5.7 LED数码管显示电路 (26)第六章系统的软件设计 (28)6.1系统软件设计流程图 (28)6.2 系统中断流程图 (29)6.3 子程序说明 (31)6.3.1 按键扫描 (31)6.3.2 数码管动态扫描 (32)第七章数字钟元件清单和软件介绍 (33)7.1数字钟元件清单 (33)7.2 软件介绍 (33)7.2.1软件调试 (34)7.2.2硬件调试 (34)第八章总结 (35)参考文献 (36)致谢 (37)附录 (38)附录一系统程序源代码 (38)附录二电路原理图 (44)基于汇编语言的51单片机可调数字钟的设计摘要在当今社会,随着计算机在社会领域的渗透和大规模集成电路的发展,单片机的应用正在不断地走向深入,由于它具有功能强,体积小,功耗低,价格便宜,工作可靠,使用方便等特点,因此它特别适合于与控制有关的系统,越来越广泛地应用于自动控制,智能化仪器,仪表,数据采集,军工产品以及家用电器等各个领域,单片机往往是作为一个核心部件来使用,在根据具体硬件结构,以及针对具体应用对象特点的软件相结合,以作完善。
基于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单片机可调电子时钟

目录摘要 (2)Abstract (3)1.设计目的 (4)2.设计任务 (4)2.1.任务1:开机界面的设置 (4)2.2.任务2:LCD-1602显示日期时间 (4)2.3.任务3:时间与日期的调整 (4)3.硬件设计 (4)3.1.STC89C51(51单片机) (4)3.2.LCD-1602液晶显示屏 (5)4.软件设计 (7)4.1.应用软件 (7)4.2.程序框图 (7)4.3.使用说明 (7)4.4.注意事项 (8)4.5.调试结果 (8)5.收获 (9)附录: (10)附录A.硬件图 (10)附录B.主要程序 (11)摘要电子时钟是单片机系统的一个应用,由硬件和软件相配合使用。
本文通过对单片机的控制实现日历功能电子时钟的设计,以达到学习、了解单片机相关指令在各方面的应用。
硬件由主控器、显示电路、键盘接口等三个模块组成。
该时钟设计以STC-89C51作为主控器,控制显示时钟信息;显示模块用LCD-1602液晶屏;键盘接口电路由普通按键完成。
软件利用C语言编程实现单片机的控制功能。
关键词:电子时钟、单片机、LCD-1602液晶显示AbstractElectronic clock is a single chip microcomputer system application, by the use of hardware and software. In this paper, through the control of single-chip microcomputer to achieve the design of the electronic clock, in order to achieve learning, to understand the microcontroller related instructions in various aspects of the application. The hardware is composed of three modules, such as the main controller, the display circuit, the keyboard interface and so on. The clock is designed with STC-89C51 as the main controller, controlling the display clock information; the display module uses the LCD-1602 LCD screen; the keyboard interface circuit is completed by the ordinary button. Software uses C language programming microcontroller control functions.Key words: electronic clock, single chip microcomputer,LCD-1602 liquid crystal display1.设计目的该电子时钟由C语言编写而成,利用单片机定时器控制时钟运行,实现按键调整时间和日期的功能。