带闹钟的电子钟(单片机)

合集下载

单片机电子闹钟程序亲自编写-可用

单片机电子闹钟程序亲自编写-可用

单片机电子闹钟程序(亲自编写-可用)————————————————————————————————作者:————————————————————————————————日期:学校电子钟,有闹钟功能,按键可调时间,可调打铃时间,打铃时间长短显示,每个模块有功能注释。

其中正常时间显示和闹钟时间显示可用一个开关来调整。

芯片选择STC89C52程序:#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned int//定义显示段码uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};uchar codebbtime[]={0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; uchar clock[]={0,0,0,0};uchar clock1[]={12,30,0};uchar weikong[6];uchar bbduration=4;uchar lingtime=9;//学校打铃时间组uchar shangwu1[]={8,30};uchar shangwu2[]={10,0};uchar shangwu3[]={10,20};uchar shangwu4[]={11,50};uchar xiawu1[]={13,30};uchar xiawu2[]={15,00};uchar xiawu3[]={15,15};uchar xiawu4[]={16,45};//按键定义sbit mode=P1^7;sbit sec_clr=P1^0;sbit min_set_add=P1^3;sbit min_set_sub=P1^4;sbit hour_set_add=P1^1;sbit hour_set_sub=P1^2;sbit bb_set_add=P1^5;sbit bb_set_sub=P1^6;sbit speaker=P2^6;//延时函数void delay(unsigned int t){while(t--);//时钟进位函数void clockjinwei(){clock[0]++;if(clock[0]==20){clock[1]++;clock[0]=0;if(clock[1]==60){clock[2]++;clock[1]=0;if(clock[2]==60){clock[3]++;clock[2]=0;if(clock[3]==24)clock[3]=0;}}}}//定时器0中断服务函数void timer0(void) interrupt 1 using 1 {TMOD=0x01;TH0=0x3c;TL0=0xb0;clockjinwei();}//时钟分位显示函数void fenwei(){weikong[0]=clock[3]/10;weikong[1]=clock[3]%10;weikong[2]=clock[2]/10;weikong[3]=clock[2]%10;weikong[4]=clock[1]/10;weikong[5]=clock[1]%10;}//闹钟分位显示函数void naofen(){weikong[0]=clock1[0]/10;weikong[1]=clock1[0]%10;weikong[2]=clock1[1]/10;weikong[3]=clock1[1]%10;weikong[4]=clock1[2]/10;weikong[5]=clock1[2]%10; }//闹钟定时显示函数void naozhongdisplay(){uchar z,s;uchar x=0x01;naofen();for(z=0;z<6;z++){P2=0;P0=table[weikong[z]];P2=x;x=_crol_(x,1);for(s=0;s<255;s++);}}//时钟显示函数void display(){uchar i,j;uchar x=0x01;fenwei();for(i=0;i<6;i++){P2=0;P0=table[weikong[i]];P2=x;x=_crol_(x,1);for(j=0;j<255;j++);}}//总显示函数void zhongxian(){if(mode==1)delay(100);if(mode==1)display();if(mode==0)delay(100);if(mode==0)naozhongdisplay();}//按键处理程序void key_set(){zhongxian();P1=0xff;if(min_set_add==0){delay(100);if(min_set_add==0){if(mode==1){clock[2]++;if(clock[2]==60){clock[2]=0;}while(min_set_add==0)zhongxian();}}if(mode==0){clock1[1]++;if(clock1[1]==60){clock1[1]=0;}while(min_set_add==0)zhongxian();}}//if(min_set_sub==0){delay(100);if(min_set_sub==0){if(mode==1){clock[2]--;if(clock[2]==0)clock[2]=59;}while(min_set_sub==0)zhongxian();if(mode==0){clock1[1]--;if(clock1[1]==0)clock1[1]=59;}while(min_set_sub==0)zhongxian();}}//if(hour_set_add==0){delay(100);if(hour_set_add==0){if(mode==1){clock[3]++;if(clock[3]==24){clock[3]=0;}while(hour_set_add==0)zhongxian();}if(mode==0){clock1[0]++;if(clock1[0]==24){clock1[0]=0;}while(hour_set_add==0)zhongxian();}}}//if(hour_set_sub==0){delay(100);if(hour_set_sub==0){if(mode==1){clock[3]--;if(clock[3]==0)clock[3]=23;}while(hour_set_sub==0)zhongxian();if(mode==0){clock1[0]--;if(clock1[0]==0)clock1[0]=23;}while(hour_set_sub==0)zhongxian();}}//if(sec_clr==0){delay(100);if(sec_clr==0){clock[1]=0;}while(sec_clr==0)zhongxian();}}//闹钟响铃函数void bb(){if(clock[1]<=bbduration){speaker=1;delay(100);speaker=0;}else speaker=0;}//打铃函数void daling(){if(clock[1]<=lingtime){speaker=1;delay(100);speaker=0;}else speaker=0;}//时间比较函数void bijiao(){if(clock[3]==shangwu1[0]){if(clock[2]==shangwu1[1])daling();}if(clock[3]==shangwu2[0]){if(clock[2]==shangwu2[1])daling();}if(clock[3]==shangwu3[0]){if(clock[2]==shangwu3[1])daling();}if(clock[3]==shangwu4[0]){if(clock[2]==shangwu4[1])daling();}if(clock[3]==xiawu1[0]){if(clock[2]==xiawu1[1])daling();}if(clock[3]==xiawu2[0]){if(clock[2]==xiawu2[1])daling();}if(clock[3]==xiawu3[0]){if(clock[2]==xiawu3[1])daling();}if(clock[3]==xiawu4[0]){if(clock[2]==xiawu4[1])daling();}}//闹钟比较void naobijiao(){if(clock[3]==clock1[0]){if(clock[2]==clock1[1]||clock[2]==clock1[1]+1||clock[2]==clock1[1]+2) bb();}}//响铃时长显示函数void bbtimeshow(){P3=bbtime[bbduration];if(bbduration>15)bbduration=0;}//响铃按键处理函数void bbtime_set(){bbtimeshow();if(bb_set_add==0){delay(100);if(bb_set_add==0)bbduration++;while(bb_set_add==0)bbtimeshow();}if(bb_set_sub==0){delay(100);if(bb_set_sub==0)bbduration--;while(bb_set_sub==0)bbtimeshow();}}//主程序void main(){EA=1;ET0=1;TR0=1;while(1){key_set();bijiao();bbtime_set();naobijiao();}}电路图:分四部分显示:如果在学习这个程序过程中有什么问题,可以发邮件到询问。

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

C51单片机实现电子闹钟

C51单片机实现电子闹钟

课程名称:单片机原理与接口技术实践设计课题:基于MCS 51单片机实现电子闹钟功能的设计学院:电子与信息工程学院专业:通信工程小组成员:电子闹钟在科学技术高度发展的今天,千家万户都少不了它,所以很多家庭个人都需要有一个电子闹钟,为人们提供报时方便,但普通电子闹钟不够方便实用。

本文给出了一种基于MCS51单片机实现电子闹钟功能的设计方法,从而给人们带来更为方便的工作与生活。

一.电子闹钟简介我们设计的电子闹钟是以MCS51单片机中的计时器作为时钟,用8位数码管显示当前时间,并且可以设置闹钟时间,并在设置的时间点发出闹铃。

简易闹钟具有以下功能:1.时钟能准确地走时,并可以通过数码管进行显示2.复位后可以进行当前时间的设置3.可以随意设置闹钟时间,闹钟会在设置时间响铃整个系统的任务要求:1)输入数字按键的功能。

保证数字的输入。

2)复位电路的功能。

所有时间回到初始化状态,用于启动设定时间参数(调时或设定闹钟时间);3)显示电路的功能。

当输入数字时显示24小时时间功能。

4)闹铃功能设置闹铃的时间后.能按设置好的时间准时闹铃。

二.系统方案的设计要求根据以上各模块并结合显示屏的功能及元器件材料的情况,决定采用AT89C51为内核显示设计方案。

先进行系统的整体规划确定整个系统的功能,然后按照每个功能的具体要求,进行各个模块的实物设计并逐个调试,待全部通过后,进行整个系统的联调,最终实现一个完整的系统。

整个系统的设计步骤如下:在单片机最小系统的基础上,完成按键电路和复位电路的设计。

完成显示电路、数字按键、单片机时钟电路。

Ⅰ硬件设计系统硬件的设计可以根据系统的各个功能,把整个系统划分成若干个模块,分别对这些模块来进行设计,然后在通过单片机程序来实现对各个硬件模块功能的调度。

本系统涉及到的硬件模块有:按键电路、数码管显示电路、单片机时钟电路、蜂鸣器电路。

各部分实现功能如下:按键电路:提供按键信号。

单片机时钟电路、复位电路:提供内部时钟。

51单片机c语言电子钟(已加入调时、闹铃、整点报时功能)

51单片机c语言电子钟(已加入调时、闹铃、整点报时功能)

51单片机c语言电子钟(已加入调时、闹铃、整点报时功能)效果图:程序如下://51单片机c语言电子钟(已加入调时、闹铃、整点报时功能)#include<reg51.h>#include<absacc.h>#define uchar unsigned char#define uint unsigned int/*七段共阴管显示定义*///此表为LED 的字模,共阴数码管0-9 -uchar code dispcode[] ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; //段码控制/*定义并初始化变量*/uchar seconde=0;//秒uchar minite=0;//分uchar hour=12; //时uchar shi=0;//闹铃功能uchar fen=0;uchar bjcs;//报警次数sbit P1_0=P1^0; //second 调整定义sbit P1_1=P1^1; //minite调整定义sbit P1_2=P1^2; //hour调整定义sbit P1_5=P1^5; //整点报时sbit P1_3=P1^3; //闹铃功能,调整时间sbit P1_6=P1^6; //调整时sbit P1_7=P1^7; //调整分sbit P1_4=P1^4; //关闭闹铃/*函数声明*/void delay(uint k ); //延时子程序void time_pro( ); //时间处理子程序void display( ); //显示子程序void keyscan( ); //键盘扫描子程序/*xx子程序*/void delay (uint k){uchar j;while((k--)!=0){for(j=0;j<125;j++){;}}}/*时间处理子程序*/void time_pro(void){if(seconde==60){seconde=0;minite++;if(minite==60){minite=0;hour++;if(hour==24){hour=0;}}}}/*显示子程序*/void display(void){if(P1_3==1){P2=0XFE; P0=dispcode[seconde%10];//秒个位delay(1);P2=0XFD;P0=dispcode[seconde/10];//秒十位delay(1);P2=0XFB;P0=dispcode[10];//间隔符-delay(1);P2=0XF7;P0=dispcode[minite%10];//分个位delay(1);P2=0XEF;P0=dispcode[minite/10];//分十位delay(1);P2=0XDF;P0=dispcode[10];//间隔符-delay(1);P2=0XBF;P0=dispcode[hour%10];//时个位delay(1);P2=0X7F;P0=dispcode[hour/10];//时十位delay(1);}}/*键盘扫描子程序*/void keyscan(void){if(P1_0==0)//秒位的调整{delay (30);if(P1_0==0){seconde++;if(seconde==60){seconde=0;}}delay(250);}if(P1_1==0)//分位的调整{delay(30);if(P1_1==0){minite++;if(minite==60){minite=0;}}delay(250);}if(P1_2==0)//时位的调整{delay(30);if(P1_2==0){hour++;if(hour==24){hour=0;}}delay(250);}}/*整点报警*/void zhengdian (void){if((seconde==0)&(minite==0))//整点报时{P1_5=0;delay(1000);P1_5=1;}}/*定时闹钟*/void dingshi(void){if(P1_3==0)//按住P1_3BU不松,显示闹铃设置界面,分别按P1_6、P1_7设置闹铃时间。

C51单片机实现电子闹钟

C51单片机实现电子闹钟

课程名称:单片机原理与接口技术实践设计课题:基于MCS 51单片机实现电子闹钟功能的设计学院:电子与信息工程学院专业:通信工程小组成员:电子闹钟在科学技术高度发展的今天,千家万户都少不了它,所以很多家庭个人都需要有一个电子闹钟,为人们提供报时方便,但普通电子闹钟不够方便实用。

本文给出了一种基于MCS51单片机实现电子闹钟功能的设计方法,从而给人们带来更为方便的工作与生活。

一.电子闹钟简介我们设计的电子闹钟是以MCS 51单片机中的计时器作为时钟,用8位数码管显示当前时间,并且可以设置闹钟时间,并在设置的时间点发出闹铃。

简易闹钟具有以下功能:1.时钟能准确地走时,并可以通过数码管进行显示2.复位后可以进行当前时间的设置3.可以随意设置闹钟时间,闹钟会在设置时间响铃整个系统的任务要求:1)输入数字按键的功能。

保证数字的输入。

2)复位电路的功能。

所有时间回到初始化状态,用于启动设定时间参数(调时或设定闹钟时间);3)显示电路的功能。

当输入数字时显示24小时时间功能。

4)闹铃功能设置闹铃的时间后.能按设置好的时间准时闹铃。

二.系统方案的设计要求根据以上各模块并结合显示屏的功能及元器件材料的情况,决定采用AT89C51为核显示设计方案。

先进行系统的整体规划确定整个系统的功能,然后按照每个功能的具体要求,进行各个模块的实物设计并逐个调试,待全部通过后,进行整个系统的联调,最终实现一个完整的系统。

整个系统的设计步骤如下:在单片机最小系统的基础上,完成按键电路和复位电路的设计。

完成显示电路、数字按键、单片机时钟电路。

Ⅰ硬件设计系统硬件的设计可以根据系统的各个功能,把整个系统划分成若干个模块,分别对这些模块来进行设计,然后在通过单片机程序来实现对各个硬件模块功能的调度。

本系统涉及到的硬件模块有:按键电路、数码管显示电路、单片机时钟电路、蜂鸣器电路。

各部分实现功能如下:按键电路:提供按键信号。

单片机时钟电路、复位电路:提供部时钟。

基于51单片机,电子显示时钟带闹钟、整点报时、日期、星期

基于51单片机,电子显示时钟带闹钟、整点报时、日期、星期
void xianshishuzu()
{ 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单片机,旨在实现一个简易的电子钟,可以显示当前的时间,并且能够通过按键进行时间的调整和设置闹钟。

二、设计原理本设计主要涉及到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单片机设计的简易电子钟可以显示当前时间,并且实现时间的调整和闹钟设定功能。

但是由于硬件资源有限,只能实现基本的功能,不能进行其他高级功能的扩展,例如闹铃的音乐播放、温度、湿度的显示等。

基于C51单片机的数字时钟课程设计(C语言带闹钟)

基于C51单片机的数字时钟课程设计(C语言带闹钟)

单片机技术课程设计数字电子钟学院:班级:姓名:学号:教师:摘要电子钟在生活中应用非常广泛,而一种简单方便的数字电子钟则更能受到人们的欢迎。

所以设计一个简易数字电子钟很有必要。

本电子钟采用AT89C52单片机为核心,使用12MHz 晶振与单片机AT89C52 相连接,通过软件编程的方法实现以24小时为一个周期,同时8位7段LED数码管(两个四位一体数码管)显示小时、分钟和秒的要求,并在计时过程中具有定时功能,当时间到达提前定好的时间进行蜂鸣报时。

该电子钟设有四个按键KEY1、KEY2、KEY3、KEY4和KEY5键,进行相应的操作就可实现校时、定时、复位功能。

具有时间显示、整点报时、校正等功能。

走时准确、显示直观、运行稳定等优点。

具有极高的推广应用价值。

关键词:电子钟 AT89C52 硬件设计软件设计目录NO TABLE OF CONTENTS ENTRIES FOUND.一、数字电子钟设计任务、功能要求说明及方案介绍1.1 设计课题设计任务设计一个具有特定功能的电子钟。

具有时间显示,并有时间设定,时间调整功能。

1.2 设计课题的功能要求说明设计一个具有特定功能的电子钟。

该电子钟上电或按键复位后能自动显示系统提示符“d.1004-22”,进入时钟准备状态;第一次按电子钟启动/调整键,电子钟从12时59分0秒开始运行,进入时钟运行状态;按电子钟S5键,则电子钟进入时钟调整状态,此时可利用各调整键调整时间,调整结束后可按S5键再次进入时钟运行状态。

1.3 设计课的设计总体方案介绍及工作原理说明本电子钟主要由单片机、键盘、显示接口电路和复位电路构成,设计课题的总体方案如图1所示:图1-1总体设计方案图本电子钟的所有的软件、参数均存放在AT89C52的Flash ROM和内部RAM 中,减少了芯片的使用数量简化了整体电路也降低了整机的工作电流。

键盘采用动态扫描方式。

利用单片机定时器及计数器产生定时效果通过编程形成数字钟效果,再利用数码管动态扫描显示单片机内部处理的数据,同时通过端口读入当前外部控制状态来改变程序的不同状态,实现不同功能。

单片机闹钟原理

单片机闹钟原理

单片机闹钟原理
单片机闹钟是一种利用单片机控制的电子设备,用于显示时间并在特定时间点发出警报提醒人们。

它的工作原理如下:
1. 时钟电路:使用晶振和电容等元件组成的时钟电路,提供稳定的振荡信号为单片机提供精确的时间基准。

2. 单片机控制:利用单片机内部的定时器或外部时钟模块,编写程序控制时钟的运行,实现时间的增加和显示。

3. 显示模块:使用液晶显示屏或数码管等显示模块,将单片机计算得到的时间信息以可视化的形式呈现给用户。

4. 按键输入:设有按键输入模块,通过用户的按键操作来设置闹钟的时间、开关闹钟等功能。

5. 闹铃功能:在设定的时间点,单片机控制警报电路发出声音或振动等警示信号,提醒用户。

6. 电源模块:提供电源给单片机和其他电路模块,可以使用电池、适配器等方式。

通过以上几个主要模块的配合,单片机闹钟可以实现时间的显示、闹钟的设置和报警功能。

用户可以根据自己的需求设定闹钟时间,并通过闹铃功能在设定的时间点提醒自己。

同时,单片机闹钟还可以具备其他功能,如温湿度测量、光感应等,以满足不同的使用场景。

基于单片机的定时闹钟设计

基于单片机的定时闹钟设计

定时闹钟的激活机 制
优点: 相比没有激活功能的定时闹钟,设 有激活机制的定时闹钟省去了用户在 不 需要闹铃提示的时候手动去暂停发出 警 报声的定时闹钟的麻烦。
开始
设置闹钟时间
闹钟是否激活? 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)。系统回 到显示时间和日期的模式下。

51单片机设置的电子闹钟(可调时间和闹钟)

51单片机设置的电子闹钟(可调时间和闹钟)

#include<reg52.h>#define uint unsigned int#define uchar unsigned char#define LED P0 // 数码管的段选#define LIGHT P1 // 时分秒位的指示灯#define WS P2 // 数码管的位选sbit key1=P3^0; // 时间暂停/开始sbit key2=P3^1; // 时间/闹钟设置sbit key3=P3^2; // 增加sbit key4=P3^3; // 减少sbit alarm=P3^6; // 闹铃uchar tab[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; // 0-9 uchar tab_dp[10]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef}; // 0.-9.(带小数点)uchar data1[]={0,0,0,0,0,0};uchar data2[]={0,0,0,0,0,0};uint t,k,kk,k1,flag;uint bbh,bbm,bbs,bbh1,bbm1,bbs1;uint sec,min,hour,sec1,min1,hour1; // 定义秒,分,时void init();void display();void display_bb();void delay( uint );void keyscan();void main(){init();while(1){keyscan();if(k1==0||k1==1||k1==2||k1==3) // 显示调节时间{display();}if(k1==4||k1==5||k1==6) // 显示调节闹钟{display_bb();}if((bbh==hour)&&(bbm==min)&&data1[4]==0&&data1[5]==5) // 5s报时{alarm=~alarm;delay(1);}if((bbs==sec)&&(bbm==min)&&(bbh==hour)) // 可调报时{alarm=~alarm;delay(1);}}}void init(){WS=LIGHT=flag=0;sec=min=hour=0; // 将0赋给时分秒TMOD=0x01; // 方式1 P129(见课本)TH0=0x3c; // 65536-50000=15536=0x3cb0(50ms) P128(见课本)TL0=0xb0;EA=1; // 开总中断 P161(见课本)TR0=1; // 定时/计数器0开启ET0=1; // 定时器/计数器0溢出中断启动 P161(见课本)}void delay( unsigned int t) // 延时函数{unsigned int i;while(t--)for(i=0;i<125;i++);}void display() // 显示时间函数{if(TF0==1) // 定时器/计数器溢出 P130(见课本){TF0=0; // 清中断标志位t++;if(t==20) // (50ms*20=1s){t=0;sec++; // 秒加1if(sec==60) // 秒为60,则清零,分加1 {sec=0;min++;}if(min==60) // 分为60,则清零,时加1{min=0;hour++;}if(hour==24)// 时为24,则清零{hour=0;}}}data1[5]=sec%10;data1[4]=sec/10;data1[3]=min%10;data1[2]=min/10;data1[1]=hour%10;data1[0]=hour/10;WS=0xdf; // 1101 1111 ,低电平显示LED=tab[data1[5]];delay(1);WS=0xef; // 1110 1111LED=tab[data1[4]];delay(1);WS=0xf7; // 1111 0111LED=tab_dp[data1[3]];delay(1);WS=0xfb; // 1111 1011LED=tab[data1[2]];delay(1);WS=0xfd; // 1111 1101LED=tab_dp[data1[1]];delay(1);WS=0xfe; // 1111 1110LED=tab[data1[0]];delay(1);}void display_bb() // 显示闹钟函数{data2[5]=bbs%10;data2[4]=bbs/10;data2[3]=bbm%10;data2[2]=bbm/10;data2[1]=bbh%10;data2[0]=bbh/10;WS=0xdf; // 1101 1111 ,低电平显示LED=tab[data2[5]];delay(1);WS=0xef; // 1110 1111LED=tab[data2[4]];delay(1);WS=0xf7; // 1111 0111LED=tab_dp[data2[3]];delay(1);WS=0xfb; // 1111 1011LED=tab[data2[2]];delay(1);WS=0xfd; // 1111 1101LED=tab_dp[data2[1]];delay(1);WS=0xfe; // 1111 1110LED=tab[data2[0]];delay(1);}void keyscan() // 键盘扫描{if(key1==0) // 暂停/开始{++kk;while(!key1){display();if(kk==1){TR0=0;if(k1==0||k1==1||k1==2||k1==3) // 显示调节时间{display();}if(k1==4||k1==5||k1==6) // 显示调节闹钟{display_bb();}if(key2==0) // 模式选择(调节时间/闹钟){k1++;while(!key2){if(k1==1) // 第1次按下{sec1=sec; // 保存秒的数值sec=88; // 显示88,表示可以调节秒的数值了display(); // 显示88sec=sec1; // 恢复前一刻秒的数值}if(k1==2){min1=min;min=88;display();delay(1);min=min1;}if(k1==3){hour1=hour;hour=88;display();delay(1);hour=hour1;}if(k1==4){sec1=bbs; // 保存秒的数值bbs=66; // 显示66,表示可以调节秒的数值了display_bb(); // 显示66bbs=sec1; // 恢复前一刻秒的数值}if(k1==5){min1=bbm;bbm=66;display_bb();delay(10);bbm=min1;}if(k1==6){hour1=bbh;bbh=66;display_bb();delay(10);bbh=hour1;}if(k1==7){k1=0;display();}}}if(key3==0) // 时间/闹钟增加设置{while(!key3){if(k1==1){sec++; // 秒加1delay(60);if(sec==60)sec=0;display();}if(k1==2){min++;delay(60);if(min==60)min=0;display();}if(k1==3){hour++;delay(60);if(hour==24)hour=0;display();}if(k1==4){bbs++; // 秒加1delay(60);if(bbs==60)bbs=0;display_bb();}if(k1==5){bbm++;delay(60);if(bbm==60)bbm=0;display_bb();}if(k1==6){bbh++;delay(60);if(bbh==24)display_bb();}if(k1==7){k1=0;display();}}}if(key4==0) // 时间/闹钟减少设置 {while(!key4){if(k1==1){sec--; // 秒加1delay(60);if(sec==0)sec=60;display();}if(k1==2){min--;delay(60);if(min==0)min=60;display();}if(k1==3){hour--;delay(60);if(hour==0)hour=24;display();}if(k1==4){bbs--; // 秒减1delay(60);if(bbs==0)display_bb();}if(k1==5){bbm--;delay(60);if(bbm==0)bbm=60;display_bb();}if(k1==6){bbh--;delay(60);if(bbh==0)bbh=24;display_bb();}if(k1==7){k1=0;display();}}}}}if(kk==2){kk=0;k1=0;TR0=1;}}}。

51单片机数字时钟(带闹钟)

51单片机数字时钟(带闹钟)

51单片机数字时钟(带闹钟)计算机硬件综合课程设计报告课目:学院:班级:姓名:指导教师:目录1.1 功能需求1.2 设计要求2.1 总体描述2.2 系统总体框图2.3 Proteus仿真电路图3 软件设计流程及描述3.1 程序流程图3.2 函数模块及功能4 心得体会附:源程序11.1功能需求(1)实现数字时钟准确实时的计时与显示功能;(2)实现闹钟功能,即系统时间到达闹钟时间时闹铃响;(3)实现时间和闹钟时间的调时功能;(4)刚启动系统的时候在数码管上滚动显示数字串(学号)。

1.2设计要求(1)应用MCS-51单片机设计实现数字时钟电路;(2)使用定时器/计数器中断实现计时;(3)选用8个数码管显示时间;(4)使用3个按钮实现调时间和闹钟时间的功能。

按钮1:更换模式(模式0:正常显示时间;模式1:调当前时间的小时;模式2;调当前时间的分钟;模式3:调闹钟时间的小时;模式4:调闹钟时间的分钟);按钮2:在非模式0下给需要调节的时间数加一,但不溢出;按钮3:在非模式0下给需要调节的时间数减一,但不小于零;(5)在非0模式下,给正在调节的时间闪烁提示;(6)使用扬声器实现闹钟功能;(7)采用C语言编写程序并调试。

2.1总体描述(1)单片机采用AT89C51型;(2)时间显示电路:采用8个共阴极数码管,P1口驱动显示数字,P2口作为扫描信号;(3)时间设置电路:P3.0、P3.1、P3.2分别连接3个按键,实现调模式,时间加和时间减;(4)闹钟:P3.3口接扬声器。

2.2系统总体框图2.3Proteus仿真电路图3 软件设计流程及描述3.1 程序流程图(1) void display_led()(2)学号的滚动显示函数;(3) void display()显示时间以及显示调节时间和闹钟时间的闪烁;(4)voidkey_prc()键盘功能函数,实现3个按键有关的模式转换以及数字加一减一;(5) void init()初始化设置中断;(6) void time1() interrupt 3定时器1中断函数,实现计时功能。

最新单片机作品 液晶显示多功能电子钟 带音乐闹铃

最新单片机作品 液晶显示多功能电子钟 带音乐闹铃

最新单片机作品液晶显示多功能电子钟带音乐闹铃(写在前面的:很想了解无线供电技术,志同道合者共勉。

力求把QQ空间打造成技术交流中心--张自变)最新单片机作品:液晶显示多功能电子钟(带音乐闹铃)楼主卜晓旸 2011-05-23 12:28最近重温了一下单片机的部分知识,做了一个LCD1602的电子钟。

还记得上次做的电子钟已经是09年初的事情了。

不说什么先上图:图一、正面(实际比图片稍微漂亮点)图二、背面(因为用手拿的时候会碰到时钟芯片和单片机的晶振焊点,所以贴了这么一个标签挡一下:))视频:功能简介:1、日期,星期,时间的显示功能。

2、一路闹钟。

铃声为那个啥歌曲来着忘了,以前单片机书上的一个例子。

3、实时温度显示。

4、自定义logo。

5、三级背光亮度调节。

6、掉电走时(貌似这是必须的)。

电路图:点击下载大图源代码(Keil编译通过):1602万年历_带闹钟_MT1.zip估算了一下所有器件成本大概二十多块钱。

不过人工成本太高。

写程序不说,光焊这块板子就花了我一整天,咱一天的工资也不菲啊。

呵呵。

不过如果做成PCB倒是可以省相当部分时间。

/*///LCD1602单片机万年历(带闹钟功能)//作者:卜晓旸//时间:2011年5月8日//版本:1.0/*/#include reg52.h#define uint unsigned int#define uchar unsigned char//LCD1602引脚定义sbit rs=P2^7;sbit rd=P2^6;sbit lcdcs=P2^5;sbit lcdbacklight1=P2^1;sbit lcdbacklight0=P2^0;uchar backlight=2;//DS18B20定义uchar count,s1num,tempint,f,tempth,settemp;//温度整数部分和小数部分;int tempdf,c;sbit TMDAT=P1^6;//DS18B20数据线//DS1302定义uchar nian,yue,ri,shi,fen,miao,zhou;sbit ACC0=ACC^0;sbit ACC7=ACC^7;sbit T_RST=P2^2;//ds1302-5 sbit T_IO=P2^3;//ds1302-6 sbitT_CLK=P2^4;//ds1302-7//显示缓冲区uchar lcd1602_one="2011-05-08 6MT1";a uchar lcd1602_two="11:08:23 30^C";//运行状态标志位uchar status=0;//0:正常运行1:年调节2:月调节3:日调节4:周调节//5:时调节6:分调节7:秒调节8:闹钟设置是否开启9:闹钟时设置//10:闹钟分设置11:logo第一位设置12:logo第二位设置13:logo第三位设置//20:保存设置21:闹钟模式//按键定义sbit MODE=P3^2;sbit UP=P3^3;sbit DOWN=P3^4;//每月天数定义用于日期调整code uchar days={31,28,31,30,31,30,31,31,30,31,30,31};//按键按下时当前秒数用于长时间没有设置操作时时钟进入正常走时状态uchar key_click_sec,now_sec;//闹钟设置显示缓冲区uchar alarm_on="OFF";uchar alarm_time="07:10";//闹钟设置缓冲区code uchar alarm_set_one="Alarm:";code uchar alarm_set_two="Logo:";//闹钟显示缓冲区code uchar alarm_one="*?:?*";code uchar alarm_two="*Alarm*";//闹钟用变量定义sbit BEEP=P1^4;code uint cyc={1800,1600,1440,1351,1200,1079,960};//音阶1-7的半周期数code uchartone={13,15,16,16,15,16,13,12,12,13,15,16,16,15,16,13,13,13,15,16,16,15,16,13,12,12,15,13,12,13,12,11,12,6,6,12,15,13,12,6,6,15,13, 12,13,12,11,12,6,5,6,0xff};//乐曲《康定情歌》的简谱表code uchartime={8,8,8,4,4,8,8,12,4,8,8,8,4,4,8,16,8,8,8,8,4,4,8,8,12,4,8,8,4,4,4,4,8,24,8,24,8,24,8,16,8,8,8,4,4,4,4,8,16,8,32};//节拍表uchar H0,L0,cnt;/*延时函数*/void delay(uint ms){uint i,j;for(j=0;j ms;j++)for(i=0;i 120;i++);}//*LCD1602相关函数*/*LCD1602写命令函数*/void write_command(uchar command) {rs=0;P0=command;lcdcs=1;lcdcs=0;}/*LCD1602写数据函数*/void write_data(uchar data0){rs=1;P0=data0;lcdcs=1;lcdcs=0;}/*初始化LCD1602函数*/void init_1602()rd=0;delay(15);write_command(0x38);delay(5);write_command(0x0c);delay(5);write_command(0x06);delay(5);}/*LCD1602时钟显示函数*/void display_1602(){uchar j;write_command(0x80);//液晶显示位置delay(5);for(j=0;j sizeof(lcd1602_one)-1;j++) {write_data(lcd1602_one[j]);}write_command(0x80+0x40);//液晶显示位置delay(5);for(j=0;j sizeof(lcd1602_two)-1;j++) {write_data(lcd1602_two[j]);delay(5);}}/*LCD1602闹钟设置显示函数*/void display_1602_alarm_set(){uchar j;write_command(0x80);//液晶显示位置delay(5);for(j=0;j sizeof(alarm_set_one)-1;j++) {write_data(alarm_set_one[j]);}for(j=0;j sizeof(alarm_on)-1;j++){write_data(alarm_on[j]);delay(5);}write_data('');delay(5);for(j=0;j sizeof(alarm_time)-1;j++) {write_data(alarm_time[j]);delay(5);}write_data('');delay(5);write_command(0x80+0x40);//液晶显示位置delay(5);for(j=0;j sizeof(alarm_set_two)-1;j++){write_data(alarm_set_two[j]);delay(5);}write_data(lcd1602_one[13]);delay(5);write_data(lcd1602_one[14]);delay(5);write_data(lcd1602_one[15]);delay(5);for(j=0;j 7;j++){write_data('');delay(5);}}/*LCD1602闹钟显示函数*/void display_1602_alarm() {uchar j;write_command(0x80);//液晶显示位置delay(5);for(j=0;j 5;j++){write_data(alarm_one[j]);delay(5);}for(j=0;j sizeof(alarm_time)-1;j++) {write_data(alarm_time[j]);delay(5);}for(j=10;j sizeof(alarm_one)-1;j++) {write_data(alarm_one[j]);delay(5);}write_command(0x80+0x40);//液晶显示位置delay(5);for(j=0;j sizeof(alarm_two)-1;j++) {write_data(alarm_two[j]);delay(5);}}//*DS18B20相关函数*//*/*初始化DS18B20子程序*/void set_ds18b20(){while(1){uchar dela,flag;flag=0;TMDAT=1;dela=1;while(--dela);TMDAT=0;//数据线置低电平dela=250;while(--dela);//低电平保持500us TMDAT=1;//数据线置高电平dela=30;while(--dela);//高电平保持60us while(TMDAT==0)//判断DS18B20是否发出低电平信号{dela=210;//DS18B20响应,延时420us while(--dela);if(TMDAT)//DS18B20发出高电平初始化成功,返回{flag=1;//DS18B20初始化成功标志break;}}if(flag)//初始化成功,再延时480us,时序要求{dela=240;while(--dela);break;}}}/*读DS18B20子程序*/void read_ds18b20(){uchar dela,i,j,k,temp,temph,templ;j=3;//读2位字节数据do{for(i=8;i 0;i--)//一个字节分8位读取{temp=1;//读取1位右移1位TMDAT=0;//数据线置低电平dela=1;while(--dela);TMDAT=1;//数据线置高电平dela=4;while(--dela);//延时8us if(TMDAT)//读取1位数据temp|=0x80;dela=25;//读取1位数据后延时50us while(--dela);}if(j==3)templ=temp;//读取的第一字节存templ if(j==2)temph=temp;//读取的第二字节存temph if(j==1)tempth=temp;//读取的第3字节存tempth TH的值}while(--j);f=0;if((temph&0xf8)!=0x00)//若温度为负的处理,对二进制补码的处理{f=1;//为负温度f置1 temph=~temph;templ=~templ;k=templ+1;templ=k;if(k 255){temph++;}}tempdf=templ&0x0f;//将读取的数据转换成温度值,整数部分存tempint,小数部分存tempdf c=(tempdf*625);tempdf=c;templ=4;temph=4;tempint=temph|templ;//两字节合并为一个字节}/*写DS18B20子程序*/void write_ds18b20(uchar command){uchar dela,i;for(i=8;i 0;i--)//将一字节数据一位一位写入{TMDAT=0;//数据线置低电平dela=6;//延时12us while(--dela);TMDAT=command&0x01;//将数据放置在数据线上dela=25;//延时50us while(--dela);command=command 1;//准备发送下一位数据TMDAT=1;//发送完一位数据,数据线置高电平}}/*DS18B20获得温度更新显示缓冲区*/void get_temperature(){set_ds18b20();//初始化DS18B20 write_ds18b20(0xcc);//发跳过ROM 匹配命令write_ds18b20(0x44);//发温度转换命令delay(5);set_ds18b20();write_ds18b20(0xcc);//发跳过ROM匹配命令write_ds18b20(0xbe);//发出读温度命令read_ds18b20();//将读出的温度数据保存到tempint和tempdf处lcd1602_two[12]=0x30+tempint%10;lcd1602_two[11]=0x30+tempint%100/10;}//*DS1302相关函数*//*/*DS1302:写入操作(上升沿)*/void write_byte(uchar da){uchar i;ACC=da;for(i=8;i 0;i--){T_IO=ACC0;T_CLK=0;T_CLK=1;ACC=ACC 1;}}/*DS1302:读取操作(下降沿)*/ uchar read_byte(void){uchar i;for(i=0;i 8;i++){ACC=ACC 1;T_CLK=1;T_CLK=0;ACC7=T_IO;}return(ACC);}/*DS1302:写入数据(先送地址,再写数据)*/ void write_1302(uchar addr,uchar da) {T_RST=0;//停止工作T_CLK=0;T_RST=1;//重新工作write_byte(addr);//写入地址write_byte(da);T_RST=0;T_CLK=1;}/*DS1302:读取数据(先送地址,再读数据)*/ uchar read_1302(uchar addr){uchar temp;T_RST=0;//停止工作T_CLK=0;T_RST=1;//重新工作write_byte(addr);//写入地址temp=read_byte();T_RST=0;T_CLK=1;//停止工作return(temp);}/*DS1302:获取当前温度更新显示缓冲区*/ void get_1302time(){miao=read_1302(0x81);fen=read_1302(0x83);shi=read_1302(0x85);ri=read_1302(0x87);yue=read_1302(0x89);nian=read_1302(0x8d);zhou=read_1302(0x8b);lcd1602_two[8]=0x30+miao%16;lcd1602_two[7]=0x30+miao/16;lcd1602_two[5]=0x30+fen%16;lcd1602_two[4]=0x30+fen/16;lcd1602_two[2]=0x30+shi%16;lcd1602_two[1]=0x30+shi/16;lcd1602_one[9]=0x30+ri%16;lcd1602_one[8]=0x30+ri/16;lcd1602_one[6]=0x30+yue%16;lcd1602_one[5]=0x30+yue/16;lcd1602_one[3]=0x30+nian%16;lcd1602_one[2]=0x30+nian/16;lcd1602_one[11]=0x30+zhou%16;}//*中断处理函数*//*/*定时器0中断用于产生音阶方波*/ void cntint0(void)interrupt 1 {TH0=H0;TL0=L0;BEEP=~BEEP;//BEEP是音乐信号输出脚,BEEP反相,产生方波}/*定时器1中断用于产生节拍延时*/void cntint1(void)interrupt 3{cnt++;//计数初值为0,所以不用赋值}//*按键处理函数*//*/*按键扫描用于设置时间*/void time_set_key_scan(){//年设置if(status==1){write_command(0x80+0x03);//光标显示位置delay(5);write_command(0x0d);delay(5);//UP按键处理if(UP==0){delay(10);if(UP==0){lcd1602_one[3]++;if(lcd1602_one[3]'9') {lcd1602_one[3]='0';lcd1602_one[2]++;if(lcd1602_one[2]'9') {lcd1602_one[2]='0';}}display_1602();//获取当前时钟秒数key_click_sec=read_1302(0x81);key_click_sec=(key_click_sec/16)*10+(key_click_sec%16);}while(!UP);}//DOWN按键处理if(DOWN==0){delay(10);if(DOWN==0){lcd1602_one[3]--;if(lcd1602_one[3]'0'){lcd1602_one[3]='9';lcd1602_one[2]--;if(lcd1602_one[2]'0'){lcd1602_one[2]='9';}}display_1602();//获取当前时钟秒数key_click_sec=read_1302(0x81);key_click_sec=(key_click_sec/16)*10+(key_click_sec%16);}while(!DOWN);}}//月设置else if(status==2){write_command(0x80+0x06);//光标显示位置delay(5);write_command(0x0d);delay(5);//UP按键处理if(UP==0){delay(10);if(UP==0){lcd1602_one[6]++;if(lcd1602_one[6]'9'&&lcd1602_one[5]=='0') {lcd1602_one[6]='0';lcd1602_one[5]++;}if(lcd1602_one[6]'2'&&lcd1602_one[5]=='1') {lcd1602_one[6]='1';lcd1602_one[5]='0';}display_1602();//获取当前时钟秒数key_click_sec=read_1302(0x81);key_click_sec=(key_click_sec/16)*10+(key_click_sec%16);}while(!UP);}//DOWN按键处理if(DOWN==0){delay(10);if(DOWN==0){lcd1602_one[6]--;if(lcd1602_one[6]'0'&&lcd1602_one[5]=='1'){lcd1602_one[6]='9';lcd1602_one[5]--;}if(lcd1602_one[6]'1'&&lcd1602_one[5]=='0'){lcd1602_one[6]='2';lcd1602_one[5]='1';}display_1602();//获取当前时钟秒数key_click_sec=read_1302(0x81);key_click_sec=(key_click_sec/16)*10+(key_click_sec%16);}while(!DOWN);}}//日设置else if(status==3){uchar nowMonthDays=days[(lcd1602_one[5]-0x30)*10+(lcd1602_one[6]-0x30)-1];write_command(0x80+0x09);//光标显示位置delay(5);write_command(0x0d);delay(5);//UP按键处理if(UP==0){delay(10);if(UP==0){lcd1602_one[9]++;if(lcd1602_one[9]'9'){lcd1602_one[9]='0';lcd1602_one[8]++;if(lcd1602_one[8]'9'){lcd1602_one[8]='0';}}if((lcd1602_one[8]-0x30)*10+(lcd1602_one[9]-0x30)nowMonthDays) {lcd1602_one[9]='1';lcd1602_one[8]='0';}display_1602();//获取当前时钟秒数key_click_sec=read_1302(0x81);key_click_sec=(key_click_sec/16)*10+(key_click_sec%16);}while(!UP);}//DOWN按键处理if(DOWN==0){delay(10);if(DOWN==0){lcd1602_one[9]--;if(lcd1602_one[9]'0'){lcd1602_one[9]='9';lcd1602_one[8]--;if(lcd1602_one[8]'0'){lcd1602_one[8]='9';}}if((lcd1602_one[8]-0x30)*10+(lcd1602_one[9]-0x30)1) {lcd1602_one[9]=nowMonthDays%10+0x30;lcd1602_one[8]=nowMonthDays/10+0x30;;}display_1602();//获取当前时钟秒数key_click_sec=read_1302(0x81);key_click_sec=(key_click_sec/16)*10+(key_click_sec%16);}while(!DOWN);}}//周设置else if(status==4){write_command(0x80+0x0b);//光标显示位置delay(5);write_command(0x0d);delay(5);//UP按键处理if(UP==0){delay(10);if(UP==0){lcd1602_one[11]++;if(lcd1602_one[11]'7'){lcd1602_one[11]='1';}display_1602();//获取当前时钟秒数key_click_sec=read_1302(0x81);key_click_sec=(key_click_sec/16)*10+(key_click_sec%16);}while(!UP);}//DOWN按键处理if(DOWN==0){delay(10);if(DOWN==0){lcd1602_one[11]--;if(lcd1602_one[11]'1'){lcd1602_one[11]='7';}display_1602();//获取当前时钟秒数key_click_sec=read_1302(0x81);key_click_sec=(key_click_sec/16)*10+(key_click_sec%16);}while(!DOWN);}}//时设置else if(status==5){write_command(0x80+0x40+0x02);//光标显示位置delay(5);write_command(0x0d);delay(5);//UP按键处理if(UP==0){delay(10);if(UP==0){lcd1602_two[2]++;if(lcd1602_two[2]'9'){lcd1602_two[2]='0';lcd1602_two[1]++;if(lcd1602_two[1]'9'){lcd1602_two[1]='0';}}if((lcd1602_two[1]-0x30)*10+(lcd1602_two[2]-0x30)23) {lcd1602_two[2]='0';lcd1602_two[1]='0';}display_1602();//获取当前时钟秒数key_click_sec=read_1302(0x81);key_click_sec=(key_click_sec/16)*10+(key_click_sec%16);}while(!UP);}//DOWN按键处理if(DOWN==0){delay(10);if(DOWN==0){lcd1602_two[2]--;if(lcd1602_two[1]!='0'&&lcd1602_two[2]'0') {lcd1602_two[2]='9';lcd1602_two[1]--;if(lcd1602_two[1]'0'){lcd1602_two[1]='9';}}if(lcd1602_two[1]=='0'&&lcd1602_two[2]'0'){lcd1602_two[2]='3';lcd1602_two[1]='2';}display_1602();//获取当前时钟秒数key_click_sec=read_1302(0x81);key_click_sec=(key_click_sec/16)*10+(key_click_sec%16);}while(!DOWN);}}//分设置else if(status==6){write_command(0x80+0x40+0x05);//光标显示位置delay(5);write_command(0x0d);delay(5);//UP按键处理if(UP==0){delay(10);if(UP==0){lcd1602_two[5]++;if(lcd1602_two[5]'9'){lcd1602_two[5]='0';lcd1602_two[4]++;if(lcd1602_two[4]'9'){lcd1602_two[4]='0';}}if((lcd1602_two[4]-0x30)*10+(lcd1602_two[5]-0x30)59) {lcd1602_two[5]='0';}display_1602();//获取当前时钟秒数key_click_sec=read_1302(0x81);key_click_sec=(key_click_sec/16)*10+(key_click_sec%16);}while(!UP);}//DOWN按键处理if(DOWN==0){delay(10);if(DOWN==0){lcd1602_two[5]--;if(lcd1602_two[4]!='0'&&lcd1602_two[5]'0'){lcd1602_two[5]='9';if(lcd1602_two[4]'0'){lcd1602_two[4]='9';}}if(lcd1602_two[4]=='0'&&lcd1602_two[5]'0'){lcd1602_two[5]='9';lcd1602_two[4]='5';}display_1602();//获取当前时钟秒数key_click_sec=read_1302(0x81);key_click_sec=(key_click_sec/16)*10+(key_click_sec%16);}while(!DOWN);}}//秒设置else if(status==7){write_command(0x80+0x40+0x08);//光标显示位置delay(5);write_command(0x0d);delay(5);//UP按键处理if(UP==0){delay(10);if(UP==0){lcd1602_two[8]++;if(lcd1602_two[8]'9'){lcd1602_two[8]='0';lcd1602_two[7]++;if(lcd1602_two[7]'9'){lcd1602_two[7]='0';}}if((lcd1602_two[7]-0x30)*10+(lcd1602_two[8]-0x30)59) {lcd1602_two[8]='0';lcd1602_two[7]='0';}display_1602();//获取当前时钟秒数key_click_sec=read_1302(0x81);key_click_sec=(key_click_sec/16)*10+(key_click_sec%16);}while(!UP);}//DOWN按键处理if(DOWN==0){delay(10);if(DOWN==0){lcd1602_two[8]--;if(lcd1602_two[7]!='0'&&lcd1602_two[8]'0') {lcd1602_two[8]='9';lcd1602_two[7]--;if(lcd1602_two[7]'0'){lcd1602_two[7]='9';}}if(lcd1602_two[7]=='0'&&lcd1602_two[8]'0') {lcd1602_two[8]='9';lcd1602_two[7]='5';}display_1602();//获取当前时钟秒数key_click_sec=read_1302(0x81);key_click_sec=(key_click_sec/16)*10+(key_click_sec%16);}while(!DOWN);}}}/*按键扫描用于设置闹钟*/void alarm_key_scan(){//闹钟设置模式if(status==8){write_command(0x80+0x08);//光标显示位置delay(5);write_command(0x0d);delay(5);//UP按键处理if(UP==0){delay(10);if(UP==0){if(alarm_on[2]=='N')//闹钟开{alarm_on[0]='O';alarm_on[1]='F';alarm_on[2]='F';}else{alarm_on[0]='';alarm_on[1]='O';alarm_on[2]='N';}display_1602_alarm_set();//获取当前时钟秒数key_click_sec=read_1302(0x81);key_click_sec=(key_click_sec/16)*10+(key_click_sec%16);}while(!UP);}//DOWN按键处理if(DOWN==0){delay(10);if(DOWN==0){if(alarm_on[2]=='N')//闹钟开{alarm_on[0]='O';alarm_on[1]='F';alarm_on[2]='F';}else{alarm_on[0]='';alarm_on[1]='O';alarm_on[2]='N';}display_1602_alarm_set();//获取当前时钟秒数key_click_sec=read_1302(0x81);key_click_sec=(key_click_sec/16)*10+(key_click_sec%16);}while(!DOWN);}}//闹钟时设置else if(status==9){write_command(0x80+0x0b);//光标显示位置delay(5);write_command(0x0d);delay(5);//UP按键处理if(UP==0){delay(10);if(UP==0){alarm_time[1]++;if(alarm_time[1]'9'){alarm_time[1]='0';alarm_time[0]++;if(alarm_time[0]'9'){alarm_time[0]='0';}}if((alarm_time[0]-0x30)*10+(alarm_time[1]-0x30)23) {alarm_time[1]='0';}display_1602_alarm_set();//获取当前时钟秒数key_click_sec=read_1302(0x81);key_click_sec=(key_click_sec/16)*10+(key_click_sec%16);}while(!UP);}//DOWN按键处理if(DOWN==0){delay(10);if(DOWN==0){alarm_time[1]--;if(alarm_time[0]!='0'&&alarm_time[1]'0'){alarm_time[1]='9';if(alarm_time[0]'0'){alarm_time[0]='9';}}if(alarm_time[0]=='0'&&alarm_time[1]'0'){alarm_time[1]='3';alarm_time[0]='2';}display_1602_alarm_set();//获取当前时钟秒数key_click_sec=read_1302(0x81);key_click_sec=(key_click_sec/16)*10+(key_click_sec%16);}while(!DOWN);}}。

基于C51单片机的数字时钟课程设计(C语言带闹钟)

基于C51单片机的数字时钟课程设计(C语言带闹钟)

单片机技术课程设计数字电子钟学院:班级:姓名:学号:教师:摘要电子钟在生活中应用非常广泛,而一种简单方便的数字电子钟则更能受到人们的欢迎。

所以设计一个简易数字电子钟很有必要。

本电子钟采用AT89C52单片机为核心,使用12MHz 晶振与单片机AT89C52 相连接,通过软件编程的方法实现以24小时为一个周期,同时8位7段LED数码管(两个四位一体数码管)显示小时、分钟和秒的要求,并在计时过程中具有定时功能,当时间到达提前定好的时间进行蜂鸣报时。

该电子钟设有四个按键KEY1、KEY2、KEY3、KEY4和KEY5键,进行相应的操作就可实现校时、定时、复位功能。

具有时间显示、整点报时、校正等功能。

走时准确、显示直观、运行稳定等优点。

具有极高的推广应用价值。

关键词:电子钟 AT89C52 硬件设计软件设计目录NO TABLE OF CONTENTS ENTRIES FOUND.一、数字电子钟设计任务、功能要求说明及方案介绍1.1 设计课题设计任务设计一个具有特定功能的电子钟。

具有时间显示,并有时间设定,时间调整功能。

1.2 设计课题的功能要求说明设计一个具有特定功能的电子钟。

该电子钟上电或按键复位后能自动显示系统提示符“d.1004-22”,进入时钟准备状态;第一次按电子钟启动/调整键,电子钟从12时59分0秒开始运行,进入时钟运行状态;按电子钟S5键,则电子钟进入时钟调整状态,此时可利用各调整键调整时间,调整结束后可按S5键再次进入时钟运行状态。

1.3 设计课的设计总体方案介绍及工作原理说明本电子钟主要由单片机、键盘、显示接口电路和复位电路构成,设计课题的总体方案如图1所示:图1-1总体设计方案图本电子钟的所有的软件、参数均存放在AT89C52的Flash ROM和内部RAM 中,减少了芯片的使用数量简化了整体电路也降低了整机的工作电流。

键盘采用动态扫描方式。

利用单片机定时器及计数器产生定时效果通过编程形成数字钟效果,再利用数码管动态扫描显示单片机内部处理的数据,同时通过端口读入当前外部控制状态来改变程序的不同状态,实现不同功能。

基于单片机的电子时钟的设计与实现

基于单片机的电子时钟的设计与实现

基于单片机的电子时钟的设计与实现电子时钟是一种使用微处理器或单片机作为主控制器的数字时钟。

它不仅能够显示当前时间,还可以具备其他附加功能,如闹钟、日历、温度显示等。

一、设计目标设计一个基于单片机的电子时钟,实现以下功能:1.显示时间:小时、分钟和秒钟的显示,采用7段LED数码管来显示。

2.闹钟功能:设置闹钟时间,到达设定的时间时会发出提示音。

3.日历功能:显示日期、星期和月份。

4.温度显示:通过温度传感器获取当前环境温度,并显示在LED数码管上。

5.键盘输入和控制:通过外部键盘进行时间、日期、闹钟、温度等参数的设置和调整。

二、硬件设计1.单片机选择:选择一款适合的单片机作为主控制器,应具备足够的输入/输出引脚、中断和定时器等功能,如STC89C522.时钟电路:使用晶振为单片机提供稳定的时钟源。

3.7段LED数码管:选择合适的尺寸和颜色的数码管,用于显示小时、分钟和秒钟。

4.温度传感器:选择一款适合的温度传感器,如DS18B20,用于获取环境温度。

5.喇叭:用于发出闹钟提示音。

6.外部键盘:选择一款适合的键盘,用于设置和调整时间、日期、闹钟等参数。

三、软件设计1.初始化:设置单片机定时器、外部中断和其他必要的配置。

2.时间显示:通过定时器中断,更新时间,并将小时、分钟和秒钟分别显示在相应的LED数码管上。

3.闹钟功能:设置闹钟时间,定时器中断检测当前时间是否与闹钟时间一致,若一致则触发警报。

4.日历功能:使用定时器中断,更新日期、星期和月份,并将其显示在LED数码管上。

5.温度显示:通过定时器中断,读取温度传感器的数据,并将温度显示在LED数码管上。

6.键盘输入和控制:通过外部中断,读取键盘输入,并根据输入进行相应的操作,如设置时间、闹钟、日期等。

7.警报控制:根据设置的闹钟时间,触发警报功能,同时根据用户的设置进行控制。

四、测试与调试完成软件设计后,进行系统测试与调试,包括验证显示时间、日期、温度等功能的准确性,以及闹钟和警报功能的触发与控制。

51单片机设置的电子闹钟(可调时间和闹钟)

51单片机设置的电子闹钟(可调时间和闹钟)

#include<reg52.h>#define uint unsigned int#define uchar unsigned char#define LED P0 // 数码管的段选#define LIGHT P1 // 时分秒位的指示灯#define WS P2 // 数码管的位选sbit key1=P3^0; // 时间暂停/开始sbit key2=P3^1; // 时间/闹钟设置sbit key3=P3^2; // 增加sbit key4=P3^3; // 减少sbit alarm=P3^6; // 闹铃uchar tab[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; // 0-9uchar tab_dp[10]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef}; // 0.-9.(带小数点)uchar data1[]={0,0,0,0,0,0};uchar data2[]={0,0,0,0,0,0};uint t,k,kk,k1,flag;uint bbh,bbm,bbs,bbh1,bbm1,bbs1;uint sec,min,hour,sec1,min1,hour1; // 定义秒,分,时void init();void display();void display_bb();void delay( uint );void keyscan();void main(){init();while(1){keyscan();if(k1==0||k1==1||k1==2||k1==3) // 显示调节时间{display();}if(k1==4||k1==5||k1==6) // 显示调节闹钟{display_bb();}if((bbh==hour)&&(bbm==min)&&data1[4]==0&&data1[5]==5) // 5s报时{alarm=~alarm;delay(1);}if((bbs==sec)&&(bbm==min)&&(bbh==hour)) // 可调报时{alarm=~alarm;delay(1);}}}void init(){WS=LIGHT=flag=0;sec=min=hour=0; // 将0赋给时分秒TMOD=0x01; // 方式1 P129(见课本)TH0=0x3c; // 65536-50000=15536=0x3cb0(50ms) P128(见课本)TL0=0xb0;EA=1; // 开总中断P161(见课本)TR0=1; // 定时/计数器0开启ET0=1; // 定时器/计数器0溢出中断启动P161(见课本)}void delay( unsigned int t) // 延时函数{unsigned int i;while(t--)for(i=0;i<125;i++);}void display() // 显示时间函数{if(TF0==1) // 定时器/计数器溢出P130(见课本){TF0=0; // 清中断标志位t++;if(t==20) // (50ms*20=1s){t=0;sec++; // 秒加1if(sec==60) // 秒为60,则清零,分加1{sec=0;min++;}if(min==60) // 分为60,则清零,时加1{min=0;hour++;}if(hour==24)// 时为24,则清零{hour=0;}}}data1[5]=sec%10;data1[4]=sec/10;data1[3]=min%10;data1[2]=min/10;data1[1]=hour%10;data1[0]=hour/10;WS=0xdf; // 1101 1111 ,低电平显示LED=tab[data1[5]];delay(1);WS=0xef; // 1110 1111LED=tab[data1[4]];delay(1);WS=0xf7; // 1111 0111LED=tab_dp[data1[3]];delay(1);WS=0xfb; // 1111 1011LED=tab[data1[2]];delay(1);WS=0xfd; // 1111 1101LED=tab_dp[data1[1]];delay(1);WS=0xfe; // 1111 1110LED=tab[data1[0]];delay(1);}void display_bb() // 显示闹钟函数{data2[5]=bbs%10;data2[4]=bbs/10;data2[3]=bbm%10;data2[2]=bbm/10;data2[1]=bbh%10;data2[0]=bbh/10;WS=0xdf; // 1101 1111 ,低电平显示LED=tab[data2[5]];delay(1);WS=0xef; // 1110 1111LED=tab[data2[4]];delay(1);WS=0xf7; // 1111 0111LED=tab_dp[data2[3]];delay(1);WS=0xfb; // 1111 1011LED=tab[data2[2]];delay(1);WS=0xfd; // 1111 1101LED=tab_dp[data2[1]];delay(1);WS=0xfe; // 1111 1110LED=tab[data2[0]];delay(1);}void keyscan() // 键盘扫描{if(key1==0) // 暂停/开始{++kk;while(!key1){display();if(kk==1){TR0=0;if(k1==0||k1==1||k1==2||k1==3) // 显示调节时间{display();}if(k1==4||k1==5||k1==6) // 显示调节闹钟{display_bb();}if(key2==0) // 模式选择(调节时间/闹钟){k1++;while(!key2){if(k1==1) // 第1次按下{sec1=sec; // 保存秒的数值sec=88; // 显示88,表示可以调节秒的数值了display(); // 显示88sec=sec1; // 恢复前一刻秒的数值}if(k1==2){min1=min;min=88;display();delay(1);min=min1;}if(k1==3){hour1=hour;hour=88;delay(1);hour=hour1;}if(k1==4){sec1=bbs; // 保存秒的数值bbs=66; // 显示66,表示可以调节秒的数值了display_bb(); // 显示66bbs=sec1; // 恢复前一刻秒的数值}if(k1==5){min1=bbm;bbm=66;display_bb();delay(10);bbm=min1;}if(k1==6){hour1=bbh;bbh=66;display_bb();delay(10);bbh=hour1;}if(k1==7){k1=0;display();}}}if(key3==0) // 时间/闹钟增加设置{while(!key3){if(k1==1){sec++;// 秒加1if(sec==60)sec=0;display();}if(k1==2){min++;delay(60);if(min==60)min=0;display();}if(k1==3){hour++;delay(60);if(hour==24)hour=0;display();}if(k1==4){bbs++; // 秒加1delay(60);if(bbs==60)bbs=0;display_bb();}if(k1==5){bbm++;delay(60);if(bbm==60)bbm=0;display_bb();}if(k1==6){bbh++;delay(60);if(bbh==24)bbh=0;display_bb();if(k1==7){k1=0;display();}}}if(key4==0) // 时间/闹钟减少设置{while(!key4){if(k1==1){sec--; // 秒加1delay(60);if(sec==0)sec=60;display();}if(k1==2){min--;delay(60);if(min==0)min=60;display();}if(k1==3){hour--;delay(60);if(hour==0)hour=24;display();}if(k1==4){bbs--; // 秒减1delay(60);if(bbs==0)bbs=60;display_bb();if(k1==5){bbm--;delay(60);if(bbm==0)bbm=60;display_bb();}if(k1==6){bbh--;delay(60);if(bbh==0)bbh=24;display_bb();}if(k1==7){k1=0;display();}}}}}if(kk==2){kk=0;k1=0;TR0=1;}}}。

带闹钟的智能电子时钟单片机课程设计

带闹钟的智能电子时钟单片机课程设计

微处理器综合设计实践报告题目:智能电子时钟的设计院系:电子与信息工程学院专业:电子科学与技术年级姓名:学号:指导老师:一、课程设计目的:综合应用所学的微处理器原理,汇编语言及相关硬件知识,设计一个具有一定功能的电路。

熟练掌握仿真器和编程器的使用。

二、课程设计要求:在面包板上搭建好硬件电路。

以单片机为核心器件,组成一个电子时钟系统。

系统显示用4位7段LED显示器,显示当前时间的小时和分。

能够通过按键实现对当前时间的调整,系统时间到整点后能够通过蜂鸣器报时,时间为1s;能通过按键设置闹钟时间,闹钟时间到后,通过蜂鸣器报时。

三、系统组成与工作原理:1、电路原理图2、工作原理(1)设计原理及思路本课程设计要求以AT89C52单片机为核心器件,组成一个电子时钟系统。

我们可以利用单片机自带的定时器功能来进行定时,再通过一些软件编程来构造出一个时钟,同时也可以利用软件的编程来实现所要求的其他功能。

通过四个按键开关来控制电子时钟的工作模式。

KEY1、KEY2分别对应时钟的调时和调分。

KEY3可以设置闹钟,进入闹钟模式后,KEY1、KEY2将转变成闹钟的调时和调分键。

此外,当按下KEY4就可以进入秒表模式,进入秒表模式以后,KEY1可以控制秒表的开始于暂停,KEY2可以对秒表清零,再次按下KEY4键便退出秒表模式。

程序运行时主程序一直在循环查询各按键的状态,并将当前时间与闹钟设定时间不断进行比较,如果时间相同则响铃,同时通过动态显示的方式将相应的时间显示在数码管显示器上。

与此同时,整个过程中时钟的时间都是由单片机的定时器进行计时的。

单片机的P0口负责输出段码,P2.0~P2.3对应四个数码管的位选端,分别为数码管1号、2号、3号、4号(由右至左编号);P1.0对应蜂鸣器;P2.4~P2.7对应四个按键4、3、2、1(由上至下编号)。

各个分电路:a.蜂鸣器电路当P1.0为低电平时,三极管导通,蜂鸣器开始工作b.上电复位电路在通电瞬间,电容C通过电阻R20充电,RST端出现正脉冲,用以复位。

基于单片机的LCD1602电子时钟设计

基于单片机的LCD1602电子时钟设计

基于单片机的LCD1602电子时钟设计近年来,随着物联网和智能设备的快速发展,电子时钟作为一种常见的智能设备,广泛应用于家庭、办公室等各种场合。

本文将基于单片机设计一款LCD1602电子时钟,实现时间显示、闹钟设置等功能。

一、硬件设计1.单片机选择在本设计中,选择常用的51系列单片机AT89C51,具有丰富的外设资源和强大的处理能力。

该单片机具有8位数据总线、16位地址总线,并且集成了定时/计数器、中断控制器和串行通信接口等外设。

2.显示模块选择3.时钟模块选择通过接入DS1302时钟模块,可以实现实时时钟的功能。

DS1302模块具有时钟计数器、电压检测电路、串行通信接口等,并且具有低功耗特点。

4.控制板设计根据LCD1602的引脚连接方式,设计一个控制板,用于将单片机、显示模块和时钟模块等连接在一起。

同时,需注意设计供电电路、外设输入输出电平等电路。

二、软件设计1.初始化设置通过单片机的GPIO口配置,将LCD1602和DS1302对应的引脚设置为输出模式,同时初始化LCD显示屏并进行清屏操作。

此外,需设置DS1302时钟模块的时钟、日期、闹钟等参数。

2.时间显示通过读取DS1302时钟模块的计数器,获得当前的小时、分钟和秒数,然后将其格式化为HH:MM:SS的形式,并通过LCD显示出来。

3.时间设置通过单片机的外部中断,当用户按下设置按钮后,进入时间设置模式。

在时间设置模式下,用户可以通过按下不同的按键来调整小时、分钟和秒数。

调整完成后,再次按下设置按钮即可保存设置。

4.闹钟设置通过单片机的定时器中断,设定一个闹钟定时器。

当闹钟定时器触发时,触发相应的中断,然后通过LCD显示闹钟提示。

此外,用户也可以通过按下按钮来设置闹钟时间,并通过单片机的外部中断进行处理。

5.闹钟响铃当闹钟时间到达时,触发相应的中断,通过LCD显示闹钟提示,并通过蜂鸣器发出响铃声。

总结通过本设计,可以实现一款功能齐全的LCD1602电子时钟。

基于单片机的多功能LCD时钟

基于单片机的多功能LCD时钟

基于单片机的多功能LCD时钟
该时钟的设计思路是通过单片机控制液晶显示器,实时更新时间、日期、温度等信息;同时,结合外部输入信号,实现闹钟功能。

首先,该时钟通过单片机内部定时器实现时间的计时。

通过精确定时器,可以实现秒、分、时的显示和更新。

单片机内部具有RTC(Real-
Time Clock)模块,可实现对日期和时间的实时监控。

其次,该时钟通过温度传感器获取环境温度,并通过单片机控制液晶
屏实时显示。

温度传感器可以是热敏电阻、热敏电容等。

另外,该时钟具有闹钟功能,用户可以设置闹钟时间。

当时间到达设
定的闹钟时间时,时钟会发出报警声音,提醒用户。

此外,该时钟还可以显示日历。

通过单片机计算当前日期,并显示在
液晶屏上。

时钟基于单片机的控制,具有灵活性高、功能强大、可靠性较好等优点。

其通过外设接口与用户进行交互,使得用户操作简单、方便。

整个时钟的设计和制作过程分为硬件设计和软件设计两个部分。

其中,硬件设计包括电路原理图设计、PCB布局设计、外设选型等;软件设计则
包括单片机程序设计、液晶显示程序设计、闹钟功能实现等。

总结起来,基于单片机的多功能LCD时钟是一种功能强大的电子时钟,通过单片机控制液晶显示器实现时间、日期和温度的显示和更新,同时结
合闹钟功能,提供给用户全方位的时间与日期信息。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

课程设计带闹钟的电子钟系别:计算机科学与技术系专业(班级):计算机科学与技术2011级本<2>班作者(学号):汪静(51102012011)指导教师:张自军完成日期: 2013年12月05日二○一二年12月28日20世纪末,电子技术获得了飞速的发展。

在其推动下,现代电子产品几乎渗透了社会的各个领域,有力地推动了社会生产力的发展和社会信息化程度的提高。

同时也使现代电子产品性能进一步提高,产品更新换代的节奏也越来越快。

时间对人们来说总是那么宝贵,工作的忙碌性和繁杂性容易使人忘记当前的时间。

忘记了要做的事情,当事情不是很重要的时候,这种遗忘无伤大雅。

但是,一旦重要事情,一时的耽误可能酿成大祸。

例如,许多火灾都是由于人们一时忘记了关闭煤气或是忘记充电时间。

所以有必要制作一个定时系统。

随时提醒这些容易忘记时间的人。

而钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表原先的报时功能。

诸如定时自动报警、按时自动打铃、时间程序自动控制、定时广播、定时启闭电路、定时开关烘箱、通断动力设备,甚至各种定时电气的自动启用等等。

所有这些,都是以钟表数字化为基础的。

因此,研究数字钟及扩大其应用,有着非常现实的意义。

随着生活水平的提高,人们越来越追求人性化的事物。

传统的时钟已不能满足人们的需求。

而现代的时钟不仅需要模拟电路技术和数字电路技术而且更需要单片机技术,增加数字钟的功能。

利用软件编程尽量做到硬件电路简单稳定,减小电磁干扰和其他环境干扰,减小因元器件精度不够引起的误差,但是数字钟还是可以改进和提高如选用更精密的元器件。

但与机械式时钟相比已经具有更高的准确性和直观性,且无机械装置,具有更长的使用寿命,因此得到了广泛的使用。

数字钟通过数字电路实现时、分、秒。

数字显示的计时装置,广泛用于个人家庭、车站、码头办公室等公共场所成为人们日常生活中不可少的必需品。

由于数字集成电路的发展和石英晶体振荡器的广泛应用,使得数字钟的精度远远超过老式钟表。

多功能数字钟的应用非常普遍。

由单片机作为数字钟的核心控制器,通过它的时钟信号进行实现计时功能,将其时间数据经单片机输出,利用显示器显示出来。

通过键盘可以进行校时、定时等功能。

输出设备显示器可以用液晶显示技术和数码管来显示技术。

本系统利用单片机实现具有计时、校时等功能的数字时钟,是以单片机AT89C51为核心元件同时采用LED数码管显示器动态显示“时”、“分”、“秒”的现代计时装置。

另外具有校时功能,秒表功能,和定时器功能,利用单片机实现的数字时钟具有编程灵活,便于功能的扩充等优点。

前言 (1)摘要 (1)ABSTRACT .............................................. 错误!未定义书签。

第1章课题的背景 .. (2)1.1课题的来源 (2)1.2课题研究的目的和意义 (2)1.3应解决的主要问题及达到的技术要求 (2)第2章方案的选择和论证 (3)2.1单片机型号的选择 (3)2.2按键的选择 (3)2.3显示器的选择 (3)2.4计时部分的选择 (3)2.5发音部分的设计 (4)2.6显示器驱动电路 (4)2.7电源的选择 (4)第3章数字电子钟的设计原理和方法 (5)3.1设计原理 (5)3.2硬件电路的设计 (5)3.2.1 AT89C51单片机简介 (5)3.2.2 键盘电路的设计 (6)3.2.3 段码驱动电路 (6)3.2.4 蜂鸣器驱动电路 (6)3.3软件部分的设计 (7)3.3.1 主程序部分的设计 (7)3.3.2 中断定时器的设置 (7)3.3.3 闹钟子函数 (8)3.3.4 计时函数 (9)3.3.4 键盘扫描函数 (11)3.3.5 时间和闹钟的设置 (11)第4章实验结果 (13)总结 (14)致谢 (15)参考文献 (16)附录 (17)摘要单片机自20世纪70年代问世以来,以其极高的性能价格比,受到人们的重视和关注,应用很广、发展很快。

而51单片机是各单片机中最为典型和最有代表性的一种。

本设计以AT89C51芯片为核心,辅以必要的外围电路,设计了一个结构简单,功能齐全的电子时钟,它由5V直流电源供电。

在硬件方面,除了CPU外,使用六个四段、两个两段、一个一段的LED数码管来进行显示,LED采用的是动态扫描显示,使用74LS245芯片进行驱动。

通过LED能够较为准确地显示时、分、秒。

四个简单的按键实现对时间的调整。

软件方面采用C语言编程。

整个电子钟系统能完成时间的显示、调时、校时和三组定时闹钟并附带上调节温度的功能。

选用单片机最小系统应用程序,添加比较程序、时间调整程序及蜂鸣程序,通过时间比较程序触发蜂鸣,实现闹钟功能,完成设计所需求的软件环境。

介绍并使用Keil 单片机模拟调试软件,测试程序的可行性并用Proteus进行仿真。

关键词:单片机,定时器,中断,闹钟,LED第1章课题的背景1.1 课题的来源随着生活水平的提高,人们越来越追求人性化的事物,传统的时钟已不能满足人们的需求。

现代的时钟不仅需要模拟电路技术而且需要数字电路技术和单片机技术,增加时钟的功能。

数字电子钟可利用软件编程尽量做到硬件电路简单稳定,减小电磁干扰和其他环境干扰,减小因元器件精度不够引起的误差;尽管如此数字钟还是可以改进和提高,比如选用更精密的元器件。

但与机械式时钟相比已经具有更高的准确性和直观性,且无机械装置,具有更长的使用寿命,因此得到了广泛的使用。

1.2 课题研究的目的和意义20世纪末,电子技术获得了飞速的发展,在其推动下,现代电子产品几乎渗透了社会的各个领域,有力地推动了社会生产力的发展和社会信息化程度的提高,同时也使现代电子产品性能进一步提高,产品更新换代的节奏也越来越快。

时间对人们来说总是那么宝贵,工作的忙碌性和繁杂性容易使人忘记当前的时间。

忘记了要做的事情,当事情不是很重要的时候,这种遗忘无伤大雅。

但是,一旦重要事情,一时的耽误可能酿成大祸。

例如,许多火灾都是由于人们一时忘记了关闭煤气或是忘记充电时间等造成的。

而钟表的数字化给人们生产生活带来了极大的方便。

数字钟是通过数字电路实现时,分,秒数字显示的计时装置,广泛用于个人家庭、车站、码头办公室等公共场所,成为人们日常生活中不可少的必需品。

由于数字集成电路的发展和石英晶体振荡器的广泛应用,使得数字钟的精度,远远超过老式钟表,钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表原先的报时功能,诸如定时自动报警、按时自动打铃、时间程序自动控制、定时广播、自动起闭路灯、定时开关烤箱、通断动力设备、甚至各种定时电气的自动启用等。

所有这些,都是以钟表数字化为基础的。

因此,研究数字钟及扩大其应用,有着非常现实的意义。

1.3应解决的主要问题及达到的技术要求本设计应解决的主要问题有两大方面,即硬件电路设计和软件设计两大方面。

其中硬件电路部分又可分为四个模块:键盘模块、显示模块、计时模块和发声模块。

硬件电路部分致力于低成本、低功耗和易实现性。

软件部分则应做到代码的精简、准确、易读懂。

最后通过硬软件的结合实现数字钟的精确计时、校时、三组闹钟设置和定时报警功能。

第2章方案的选择和论证2.1 单片机型号的选择通过对多种单片机性能的分析,最终认为AT89C51是最理想的电子时钟开发芯片。

AT89C51是一种带4K字节闪烁可编程可擦除只读存储器的低电压,高性能CMOS8位微处理器,器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。

由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL 的AT89C51是一种高效微控制器,而且它与MCS-51兼容,且具有4K字节可编程序存储器和1000次擦写循环,数据保留时间为10年,是最好的选择。

2.2 按键的选择方案一:4×4矩阵式键盘。

如果选择此方案,那么在修改时钟或设置闹铃时间时就可以直接从键盘输入,方便、快捷,但程序较为复杂。

方案二:独立式按键。

如果设置过多按键,将会占用较多I/O口,而且会给布线带来不便,因此,此方案适用于按键较少的情况。

如果选择此方案,由于按键较少,在修改时间或设置闹铃时间时就不能直接输入,只能通过加或减完成,稍为麻烦一些,但其程序简单。

由于并不需要经常修改时间和设置闹铃时间,而且方案二的程序简单,按键少、成本低,因此,选择方案二。

2.3 显示器的选择方案一:液晶显示器。

如果选择此方案,将会降低系统的功耗,这样就可以用电池供电,便于携带。

但液晶显示器的驱动电路复杂,使用起来有一定的难度。

方案二:用数码管作为显示器。

数码管的驱动电路简单,使用方便,如果选择了此方案,那么在夜间看时间的时候就不需要有光源,非常方便。

其缺点是功耗较大。

由于数码管使用起来较为方便,在夜间看时间也很方便,因此我选择了方案二。

2.4 计时部分的选择如果使用时钟芯片,系统就不怕掉电且时间精确。

但这种芯片比较贵,况且,设计本系统主要是为了学习单片机程序的编写和调试以及设计硬件电路的一些方法,因此采用软件的方法来计时而没有采用价格较高的时钟芯片。

2.5 发音部分的设计通过三极管放大后驱动蜂鸣器工作,再通过软件这时产生等时时间方波驱动蜂鸣器发出间断嘀声,这样就可以省去硬件振荡电路,降低成本。

2.6 显示器驱动电路由于通过数码管公共及的电流较大且避免过多地使用分立元件,采用了一片74LS245来驱动段码,用P3口作位码驱动。

2.7 电源的选择如果是用电池供电,就比较方便携带,但是本系统,采用了数码管作为显示器,功耗较大,需要经常更换电池。

况且,本系统的体积较大,即使使用电池供电也不能随身携带,因此,用电池供电不大合适,所以用5V外部稳压电源来供电。

第3章 数字电子钟的设计原理和方法3.1 设计原理系统原理图如下;图3-1 系统原理图 3.2 硬件电路的设计3.2.1 AT89C51单片机简介AT89C51是一款单片封装的微控制器,适合于许多要求高集成度、低成本的场合。

可以满足多方面的性能要求。

AT89C51采用了高性能的处理器结构,指令执行时间只需2到4个时钟周期。

6倍于标准51单片机器件。

AT89C51集成了许多系统级的功能,这样可大大减少元件的数目和电路板面积并降低系统的成本。

AT89C51单片机内部主要有以下部件:8031CPU 、振荡电路、总线控制部件、中断控制部件、片内Flash 存储器、并行I/O 接口、定时器和串行I/O 接口。

图3-2 AT89C51单片机晶振 按键 AT89C51 段码驱动 位码驱动 控制器 蜂鸣器 数码管键盘采用4个独立按键配以4个上拉电阻实现对时钟和闹钟的设定及修改。

图3-3 独立按键图3-4 键盘输入电路3.2.3 段码驱动电路由于通过数码管公共及的电流较大且避免过多地使用分立元件,采用了一片74LS245来驱动段码,用P3口作位码驱动。

相关文档
最新文档