数字钟单片机显示时间按

合集下载

单片机课程设计数字钟实验报告

单片机课程设计数字钟实验报告

单片机课程设计:电子钟一、实现功能1、能够实现准确计时,以数字形式显示时、分、秒的时间。

2、小时以24小时计时形式,分秒计时为60进位,能够调节时钟时间。

3、闹钟功能,一旦走时到该时间,能以声或光的形式告警提示。

4、能够实现按键启动与停止功能。

5、能够实现整点报时功能。

6、能够实现秒表功能。

二、设计思路1、芯片介绍VCC:电源。

GND:接地。

P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL 门电流。

当P1口的管脚第一次写1时,被定义为高阻输入。

P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。

在FIASH编程时,P0 口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。

P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。

P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。

在FLASH编程和校验时,P1口作为第八位地址接收。

P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。

并因此作为输入时,P2口的管脚被外部拉低,将输出电流。

这是由于内部上拉的缘故。

P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。

在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。

P2口在FLASH编程和校验时接收高八位地址信号和控制信号。

P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。

当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。

作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。

P3口也可作为AT89C51的一些特殊功能口,如下表所示:口管脚备选功能P3.0 RXD(串行输入口)P3.1 TXD(串行输出口)P3.2 /INT0(外部中断0)P3.3 /INT1(外部中断1)P3.4 T0(记时器0外部输入)P3.5 T1(记时器1外部输入)P3.6 /WR(外部数据存储器写选通)P3.7 /RD(外部数据存储器读选通)P3口同时为闪烁编程和编程校验接收一些控制信号。

(完整word版)单片机按键数字时钟制作

(完整word版)单片机按键数字时钟制作

#include〈regx52.h>#define key1 P1_0 //秒、分、时间的切换键#define key2 P1_1 //加1#define key3 P1_2 //减1#define speaker P3_1unsigned char code table1[ ]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //笔段码unsigned char code table2[ ]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //位选码unsigned char count1=0 ;/****************************************************/unsigned char hour = 12, min = 0,sec = 0; //时钟赋初值/******************T0__50mS中断程序*******************/void T0_1s(void) interrupt 1 // 50mS中断程序{static unsigned char count = 0;TR0 = 0;TH0 = (65536 - 50000 ) / 256; //设置T0初始值为:15536TL0 = (65536 - 50000 ) % 256; //记数为50000次//50000*1us=50ms*20=1sTR0 = 1;count++;if(count == 20)//中断服务程序{ //定时1s时间到(需要中断20次)count = 0;sec++;if(sec==60) //1分钟时间到{sec=0;min++;if(min==60)//1小时时间到{min=0;hour++;if(hour==24) //24小时时间到{sec =0;min =0;hour=0;}}}}}/**************************************************************/void delay_5ms() //动态扫描显示——软件延时{unsigned char i,j;for(i=0;i〈20;i++)for(j=0;j〈50;j++) //50;}/*****************************************************************/ void disp_led(){/****************显示时钟******************************/ P0=table1[hour/10];//显示小时十位数P2=table2[0];delay_5ms();P0=0xff;P0=table1[hour%10];//显示小时个位数P2=table2[1];delay_5ms();P0=0xff;P0=0xbf;//显示分隔符‘-’P2=table2[2];delay_5ms();P0=0xff;P0=table1[min/10]; //显示分钟十位数P2=table2[3];delay_5ms();P0=0xff;P0=table1[min%10];//显示分钟个位数P2=table2[4];delay_5ms();P0=0xff;P0=0xbf;//显示分隔符‘—’P2=table2[5];delay_5ms();P0=0xff;P0=table1[sec/10]; //显示秒十位数P2=table2[6];delay_5ms();P0=0xff;P0=table1[sec%10]; //显示秒个位数P2=table2[7];delay_5ms();P0=0xff;}/*******************闹钟程序****************************/void clock(){unsigned int i;if(hour==12 && min==0 && sec==30){speaker=0;for(i=0;i<500;i++) //15秒蜂鸣器{disp_led();}speaker=1;}}/*********************蜂鸣器按键声*****************************/ void speak(){ unsigned char m;speaker=0;for(m=0;m<3;m++){disp_led();}speaker=1;}/********************按键扫描程序***************************/void delay_10ms() //键盘去抖动—-软件延时{unsigned char i,j;for(i=0;i<20;i++)for(j=0;j<40;j++);}/*******************调时钟按键扫描*******************************/void key_scan() //键盘扫描子程序{if(key1==0)//检测是否有键按下{delay_10ms(); //去抖动延时if(key1==0) //再次确认否有键按下{{speak();count1++;//切换次数TR0=0;//关计时ET0=0;}if(count1==4){count1=0; //到4次后重新记TR0=1; //开计时ET0=1;}}while(key1==0) disp_led(); //等待按键释放,并且调用显示程序}if(count1==1){if(key2==0)//调整秒钟加//检测是否有键按下{delay_10ms(); //去抖动延时if(key2==0) //再次确认否有键按下{ speak(); //按键声sec++;if(sec==60)sec=0;}while(key2==0) disp_led(); //等待按键释放,并且调用显示程序 }if(key3==0) //调整秒钟减//检测是否有键按下{delay_10ms(); //去抖动延时if(key3==0) //再次确认否有键按下{ speak();sec-—;if(sec==—1) sec=59;}while(key3==0) disp_led(); //等待按键释放,并且调用显示程序}}if(count1==2){if(key2==0)//调整分钟加//检测是否有键按下{delay_10ms(); //去抖动延时if(key2==0) //再次确认否有键按下{speak();min++;if(min==60) min=0;}(完整word版)单片机按键数字时钟制作while(key2==0) disp_led(); //等待按键释放,并且调用显示程序}if(key3==0) //调整分钟减//检测是否有键按下{delay_10ms(); //去抖动延时if(key3==0) //再次确认否有键按下{ speak();min——;if(min==-1) min=59;}while(key3==0) disp_led(); //等待按键释放,并且调用显示程序 }}if(count1==3){ if(key2==0)//调整小时加//检测是否有键按下{delay_10ms(); //去抖动延时if(key2==0) //再次确认否有键按下{speak();hour++;if(hour==24){hour=0;min=0;sec=0;}}while(key2==0) disp_led(); //等待按键释放,并且调用显示程序}if(key3==0) //调整小时减//检测是否有键按下{delay_10ms(); //去抖动延时if(key3==0) //再次确认否有键按下{speak();hour-—;if(hour==-1)hour=23;}while(key3==0) disp_led(); //等待按键释放,并且调用显示程序}}}/*********************主函数***********************/void main(){TMOD = 0x01;TH0 = (65536 - 50000 ) / 256; //设置T0初始值(完整word版)单片机按键数字时钟制作TL0 = (65536 — 50000 )% 256;ET0 = 1; //开中断EA = 1; //开CPUTR0 = 1; //开定时while(1){disp_led(); //时钟显示key_scan(); //时钟扫描clock(); //闹钟}}/***********************************************************/。

单片机数字钟.

单片机数字钟.

单片机电子钟设计文档1 设计的设计任务及基本要求 (2)1.1 功能需求 (2)1.2 设计方框图 (2)1.3 主程序流程图 (3)2 模块电路设计 (4)2.1 单片机主控制模块的设计 (4)2.2 显示模块电路设计 (5)2.3 键盘电路设计 (5)2.4 整体电路图设计 (6)3 模块软件设计 (6)3.1 中断服务流程图 (6)3.2 键盘模块流程图 (8)3.3 数据处理模块流程图 (9)1设计的设计任务及基本要求1.1功能需求1.设计一个利用C-51单片机编程的数字时钟;2.要求开机运行显示“00 00 00”;3.显示部分用6位8八段共阳极数码管;4.具有显示“时时.分分.秒秒”;5.具有3个调整按键;6.按键功能:秒调整,分调整,时调整;1.2设计方框图1.3主程序流程图电路设计采用AT89C51定时器中断方式进行秒定时的设计且采用定时器方式1设计,定时50ms然后循环20次即定时为1秒,编程使秒循环60次,然后现将秒清0,分加1;分加到60后现将分清0,小时加1;小时加到24后将小时清0,这样进行循环达到计时的功能。

显示部分采用共阳极数码管的的动态扫描方式显示电子钟的时、分、秒。

其中AT89C51的P0口作为8位LED显示的段选口控制数码的显示,P2口则作为位选口控制某一时刻数码管被选中。

2模块电路设计2.1单片机主控制模块的设计单片机采用12MHz的晶振,则51单片机的机器周期为晶振频率的12分频,即f机器=12M/12=1MHz,则机器周期为1微秒采用定时器方式1,这个定时器为一个16位的定时器,最长的定时时间为(0xFF)65535微秒,定时溢出中断周期可设为50ms,中断进入后,时钟计时累计20次(即1s)时,对秒计数单元进行加1操作。

定时器初值=最长定时时间-需要定时的时间定时器初值(十进制)=65535-5000=60535换算成16进制=0xEC77即TH0=0xEC,TL0=0x77引脚定义及功能:2.2显示模块电路设计本电路设计采用共阳极数码管的的动态扫描方式显示电子钟的时、分、秒。

单片机数码管显示时钟程序

单片机数码管显示时钟程序

单片机数码管显示时钟程序Company number【1089WT-1898YT-1W8CB-9UUT-92108】#include<reg52.h>//#include#include<intrins.h>#define uchar unsigned char#define uint unsigned intsbit dula=P2^6;sbit wela=P2^7;sbit key1=P3^4;sbit key2=P3^5;sbit key3=P3^6;sbit beep=P2^3;unsigned code table[]={0x3f , 0x06 , 0x5b , 0x4f ,0x66 , 0x6d , 0x7d , 0x07 ,0x7f , 0x6f , 0x77 , 0x7c,0x39 , 0x5e , 0x79 , 0x71};uchar num1,num2,s,s1,m,m1,f,f1,num,numf,nums,dingshi; uchar ns,ns1,nf,nf1,numns,numnf;void delay(uint z);void keyscan ();void keyscan1 ();void alram();void display(uchar m,uchar m1,uchar f,ucharf1,uchars,uchars1); void display0(uchar nf,uchar nf1,uchar ns,uchar ns1);void main(){TMOD=0x01;//设定定时器0工作方式1TH0=(65536-46080)/256 ;TL0=(65536-46080)%256 ;EA=1;//开总中断ET0=1;//开定时器0中断TR0=1;//启动定时器0中断numns=12;numnf=0;while(1){if(dingshi==0){keyscan ();display(m,m1,f,f1,s,s1);alram();}else{keyscan1 ();display0(nf,nf1,ns,ns1);}}}void keyscan (){if(key1==0){delay(10);if(key1==0)nums++;if (nums==24)nums=0;while(!key1);display(m,m1,f,f1,s,s1);}if(key2==0){delay(10);if(key2==0)numf++;if (numf==60)numf=0;while(!key2);display(m,m1,f,f1,s,s1); }if(key3==0){delay(10);if(key3==0){dingshi=~dingshi;while(!key3)display(m,m1,f,f1,s,s1);}}/* if(key4==0){delay(10);if(key4==0){flag=1;while(!key4);display(m,m1,f,f1,s,s1);}} */}void keyscan1(){if(key1==0){delay(10);if(key1==0)numns++;if (numns==24)numns=0;while(!key1);// display(nf,nf1,ns,ns1); }if(key2==0){delay(10);if(key2==0)numnf++;if (numnf==60)numnf=0;while(!key2);// display(nf,nf1,ns,ns1);}if(key3==0){delay(10);if(key3==0){dingshi=0;while(!key3);// display(m,m1,f,f1,s,s1);}}}void alram(){if((numnf==numf)&&(numns==nums))beep=0;if(((numnf+1==numf)&&(numns==nums))&&(dingshi==0))//一分钟报时提示beep=1;}void display0(uchar nf,uchar nf1,uchar ns,uchar ns1)//闹钟显示函数{nf=numnf%10;nf1=numnf/10;ns=numns%10;ns1=numns/10;/* wela=1;P0=0xc0;//送位选数据wela=0;P0=0xff;*/dula=1;P0=table[ns1];dula=0;P0=0xff;wela=1;P0=0xfe;wela=0;delay(1);dula=1;P0=table[ns]|0x80;dula=0;P0=0xff;wela=1;P0=0xfd;wela=0;delay(1);dula=1;P0=table[nf1]; dula=0;P0=0xff;wela=1;P0=0xfb;wela=0;delay(1);dula=1;P0=table[nf]; dula=0;P0=0xff;wela=1;P0=0xf7;wela=0;delay(1);}void display(uchar m,uchar m1,uchar f,ucharf1,uchars,uchars1) //时间显示{dula=1;P0=table[m1]; //秒位第1位dula=0;P0=0xff;wela=1;P0=0xef;wela=0;delay(1);dula=1;P0=table[m]; // 秒位第2位dula=0;P0=0xff;wela=1;P0=0xdf;wela=0;delay(1);dula=1;P0=table[s1]; //时位第一位P0=0xff;wela=1;P0=0xfe;wela=0;delay(1);dula=1;P0=table[s]|0x80;dula=0;P0=0xff;wela=1;P0=0xfd;wela=0;delay(1);dula=1;P0=table[f1]; //分位第一位 dula=0;P0=0xff;wela=1;P0=0xfb;wela=0;delay(1);P0=table[f]|0x80;dula=0;P0=0xff;wela=1;P0=0xf7;wela=0;delay(1);}void T0_timer() interrupt 1 {TH0=(65536-46080)/256 ;TL0=(65536-46080)%256 ;num2++;if(num2==20){num++;num2=0;m=num%10;m1=num/10;f=numf%10;f1=numf/10;s=nums%10;s1=nums/10;if(num==59){num=0;numf++;if(numf==59){numf=0;nums++;}if (nums==24)nums=0;}}}void delay(uint z){uint x,y;for(x=110;x>0;x--)for(y=z;y>0;y--);}。

用单片机实现电子时钟

用单片机实现电子时钟

用单片机实现电子时钟电子时钟是一种能够显示时间的电子设备,通常通过单片机来实现。

单片机是一种超高集成度的微处理器芯片,具有计算能力、控制能力和存储能力,适用于工控领域和嵌入式系统中。

实现电子时钟主要涉及以下几个方面的内容:时钟模块、显示模块、按钮模块和功能模块。

首先,时钟模块是电子时钟的基础,它需要利用单片机内部的定时器来精确计算时间,并进行时间的更新。

可以使用定时器中断来实现,根据定时器的计时,将时、分、秒的值递增,并进行适当的进位处理。

同时,可以添加日历功能,通过特定的算法实现年、月、日的更新。

为了精确计时,可以添加外部晶振来提高时钟的精度。

其次,显示模块是电子时钟的核心,可以使用数码管、液晶显示屏或者LED点阵来显示时间。

数码管是一种常见的数字显示器件,可以通过设置对应的IO口控制其显示。

如果使用液晶显示屏,则需要借助LCD驱动IC来进行控制。

使用LED点阵则可以显示更加复杂的内容,但需要更多的IO口来进行控制。

根据设计需求,可以选择合适的显示模块。

接下来,按钮模块用于设置时间和功能切换。

可以通过为每个按钮设置一个IO口作为输入,并使用软件中断的方式来实现按钮的检测。

当用户按下按钮时,单片机会根据按钮的对应功能进行相应的操作。

例如,按下设置按钮,可以进入设置模式,并通过上下按钮来修改时间;按下功能按钮,可以切换不同的功能,如闹钟、日期等。

最后,功能模块可以根据实际需求进行扩展。

例如,可以实现闹钟功能,当设定的闹钟时间与当前时间相符时,触发闹钟功能;可以实现温度和湿度检测,并在显示屏上显示当前的温度和湿度值。

此外,还可以添加定时开关机功能,自动调节亮度等。

总结起来,实现电子时钟需要设计好时钟模块、显示模块、按钮模块和功能模块。

通过使用单片机的计算能力、控制能力和存储能力,可以实现一个功能完善的电子时钟。

当然,具体的实现方法和电路图可能会有所不同,需要根据具体的单片机型号和显示模块来进行细节调整。

用51单片机和1602液晶做的数字钟

用51单片机和1602液晶做的数字钟

用51单片机和1602液晶做的数字钟数字钟是人们日常生活中常见的时间显示设备,它能够精确显示当前的时间,并且兼具简约和实用性。

本文将介绍使用51单片机和1602液晶屏幕制作自己的数字钟的方法。

所需材料在开始制作之前,我们需要准备以下材料: - 51单片机开发板 - 1602液晶屏幕 - 数字时钟芯片RTC(Real-Time Clock) - 面包板和导线 - 电阻和电容 - 编程器和烧录器硬件连接首先,我们需要将51单片机、1602液晶屏幕和RTC芯片连接起来。

根据硬件接口的定义和引脚功能的规定,我们可以进行以下连接: - 将51单片机的VCC 引脚连接到1602液晶屏幕的VCC引脚,用于提供电源。

- 将51单片机的GND引脚连接到1602液晶屏幕的GND引脚,用于地线连接。

- 将51单片机的P0口连接到1602液晶屏幕的数据线D0-D7,用于数据传输。

- 将51单片机的P2口连接到1602液晶屏幕的RS引脚,用于选择数据和命令传输。

- 将51单片机的P3口连接到1602液晶屏幕的EN引脚,用于启用LCD。

此外,还需要将RTC芯片连接到51单片机上,以实现时间的准确显示。

具体的连接方式可以参考RTC芯片的规格说明书。

软件编程完成硬件连接后,我们需要进行软件编程,以便控制51单片机、1602液晶屏幕和RTC芯片的功能。

初始化首先,我们需要对51单片机和1602液晶屏幕进行初始化设置。

这包括设置引脚的功能模式、初始化1602液晶屏幕的显示模式和清空显示区域。

读取时间接下来,我们需要通过RTC芯片来读取当前的时间。

这通常包括读取RTC芯片存储的年、月、日、时、分和秒的数据。

显示时间读取时间后,我们可以将其显示在1602液晶屏幕上。

这可以通过更新特定的LCD显示区域来实现。

我们可以在指定的位置、特定的行和列上显示时间。

更新时间为了实现实时的时间显示,我们需要定期更新显示的时间。

可以使用定时器中断来定期更新时间,并根据需要刷新液晶屏幕上的显示。

51单片机数字钟设计程序

51单片机数字钟设计程序

51单片机数字钟设计程序51单片机是一种常用的单片机芯片,它具有体积小、功耗低、性能稳定等特点,被广泛应用于各种电子设备中。

本文将以51单片机数字钟设计程序为主题,介绍如何使用51单片机设计并实现一个简单的数字钟。

我们需要了解一下数字钟的基本原理。

数字钟主要由时钟芯片、数码管、按键等组成。

时钟芯片负责计时和控制,数码管用于显示时间,按键则用于设置和调整时间。

在设计数字钟的程序时,我们需要考虑以下几个方面:1. 时钟设置:首先,我们需要设置时钟芯片的工作模式。

一般来说,时钟芯片有两种工作模式,分别是24小时制和12小时制。

我们可以通过按键来选择工作模式,并将选择结果保存到相应的寄存器中。

2. 时间显示:接下来,我们需要将时钟芯片中的时间数据通过数码管显示出来。

数码管通常由7段LED组成,每段LED对应一个数字或字符。

我们可以通过控制数码管的引脚状态来实现不同数字的显示。

同时,为了使时间显示更加清晰,我们可以在数码管之间加入冒号等分隔符。

3. 时间调整:为了保证时间的准确性,我们需要提供时间调整的功能。

可以通过按键来实现时间的增加和减少,从而调整时钟芯片中的时间数据。

当按键按下时,我们可以检测到相应的信号,并将其转换为时间调整的命令。

4. 闹钟功能:除了显示时间,数字钟还可以具备闹钟功能。

我们可以设置一个闹钟时间,并在达到闹钟时间时触发相应的报警信号。

一般来说,闹钟功能可以通过按键设置,并将设置结果保存在相应的寄存器中。

当时钟芯片中的时间与闹钟时间一致时,我们可以通过控制蜂鸣器等外设来发出报警信号。

通过以上的设计,我们可以实现一个简单的数字钟。

当然,如果我们希望数字钟具备更多的功能,比如温湿度显示、定时器等,我们还可以在程序中添加相应的代码来实现。

总结一下,本文以51单片机数字钟设计程序为主题,介绍了数字钟的基本原理以及设计过程。

通过对时钟芯片、数码管、按键等的控制,我们可以实现时间的显示、调整和闹钟功能。

基于STC51单片机数字时钟-带闹铃功能-省电模式-整点报时功能proteus仿真

基于STC51单片机数字时钟-带闹铃功能-省电模式-整点报时功能proteus仿真

多功能数字时钟设计要求
利用51单片机或者STC单片机设计多功能数字时钟,要求:
1.用单片机控制6位数码管显示时、分、秒,以24小时计时方式运
行;
2.利用单片机片内定时器(如T0)产生1s计时,时钟最大计数值为
23时59分59秒;
3. 时钟有整点提醒功能,短蜂鸣,次数代表整点时间;
4. 时钟可以通过按键进行时间的设置;
5. 可通过按键使系统进入省电状态(数码管不亮,时钟不停)。

6.闹钟功能。

能通过按键实现闹钟/时钟功能之间的转换;可通过按键
设定闹钟时间,在定时闹钟时精确到分,可通过显示器显示闹钟设定时间;可通过按键实现闹钟有效、无效;在闹铃时,可通过按键开关使闹铃停止。

多功能数字时钟操作说明
1.上电初始化程序,时钟时显01时01分00秒
2.按键功能说明:
K1 设置键功能第一次按下时钟设置功能
第二次按下闹铃设置功能
第三次按下回到时钟显示功能
K2 加功能在时钟或闹铃设置状态下进行加操作
K3 减功能/闹铃关闭第一种功能,在时钟或闹铃设置状态下进行加操作
第二种功能,当闹铃响起来,可关闭闹铃K4 时位和分位设置切换切换时位和分位进行加减操作
K5 省电模式切换第一次按下数码管全灭,计时不停止
第二次按下数码管亮起,正常显示时间
K6启动/关闭闹铃功能默认情况下闹铃功能是开启的,按一下K6关闭闹功能,再按一下开启闹铃功能。

程序流程图。

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

文档从网络中收集,已重新整理排版.word版本可编辑.欢迎下载支持. 1word版本可编辑.欢迎下载支持. 小小电子闹钟 生活学习良伴 ——— 一款电路极简的单片机电子钟设计详解 电路特点 这里介绍的电子钟,电路可称得上极简,它仅使用单片的20引脚单片机完成电子钟的全部功能,而笔者见到的其它设计方案均采用二片以上的多片IC实现。 电路见图1。 一片20引脚的单片机AT89C2051为电子钟主体,其显示数据从P1口分时输出,P3.0~3.3则输出对应的位选通信号。由于LED数码管点亮时耗电较大,故使用了四只PNP型晶体管VT1~VT4进行放大。本来笔者还有一种更简的设计方案(见图2),可省去VT1~VT4及R1~R4八个元件,但这种设计由于单片机输出口的灌入电流有限(约20mA),数码管亮度较暗而不向读者介绍,除非你采用了高亮度的发光数码管。 P3.4、P3.5、3.7外接了三个轻触式按键,这里我们分别命名为:模式设定键set(P3.4)、时调整键hour(P3.5)、分调整键min(P3.7)。C1、R13组成上电复位电路。VT5及蜂鸣器Bz为闹时讯响电路。三端稳压器7805输出的5V电压供整个系统工作。此电子钟可与任何9~20V/100mA的交直流电源适配器配合工作,适应性强。 电子钟功能 1.走时:通过模式设定键set选择为走时,U1、U2显示小时,U3、U4显示分。U2的小数点为秒点,每秒闪烁一次。 2.走时调整:通过模式设定键set选择为走时调整,按下hour键对U1、U2的走时“时”显示进行调整(每0.2秒递加1)。按下min键对U3、U4的走时“分”显示进行调整(每0.2秒递加1)。 3.闹时调整:通过模式设定键set选择为闹时调整,按下hour键对U1、U2的闹时“时”显示进行调整(每0.2秒递加1)。按下min键对U3、U4的闹时“分”显示进行调整(每0.2秒递加1)。 4.闹时启/停设定:通过模式设定键set选择为闹时启/停设定,按下min键U3的小数点点亮,闹时功能启动;按下hour键U3的小数点熄灭,闹时功能关停。 由于电路设计得极其简单,因此丰富的功能只能由软件完成,这里软件设计成为了关键。下面介绍软件设计要点。 图3为主程序状态流程。 图3 运行时建立的主要状态标志如下: flag—掉电标志。掉电后,flag内为一随机数;重新设定时间后flag内写入标志数55H。 set—工作模式设定标志。 hour—走时“时”单元。 min—走时“分”单元。 sec—走时“秒”单元。 deda—走时5mS计数单元 t_hour—闹时“时”单元。 t_min—闹时“分”单元。 d_05s—0.5秒位标志。每秒钟的前0.5秒置1,后0.5秒置0,以使秒点闪烁。 o_f—闹时启/停位标志。闹时启动置1,闹时关停置0。 另外将定时器T0设定为5mS的定时中断。这里晶振频率为12MHz,因此5mS的初值为-5000,但实际上程序还要作其它运算,使得时间偏长,经调整为-4800后试验刚好。计时单元deda每次中断均加1。走时函数判断deda>=200时即令秒单元sec加1。同理秒单元sec文档从网络中收集,已重新整理排版.word版本可编辑.欢迎下载支持. 2word版本可编辑.欢迎下载支持. 满60后令分单元min加1。分单元min满60后令时单元hour加1。时单元hour满24后清0。 上电后,首先进行初始化,对各状态标志、输入输出口及定时器T0进行初始化工作,以适应后面程序的要求。 随后程序判断有无set键按下,如按下,则set键值从0起加1。set键值只能从0加到3,然后又回到0。 接下来,根据键值进行散转。若set=0,运行走时程序;若set=1,进入调整闹时时间程序;若set=2,进入调整走时时间程序;若set=3,显示已调好的闹时时间,同时进入启/停闹时程序。 散转完后,进行判断掉电标志flag是否等于55H。若不等,说明刚开机上电或运行过程中掉过电,这时四个数码管以1Hz的频率闪烁四个8字,提示时间不准;若相等,说明未掉电,RAM区内容未变化,时间准确。 再下来程序又转回到初始化之后进行循环运行。 由于使用了四只数码管密集排列,因此只能采用双面印刷板设计,图4、5分别为正面(元件面)、反面的印板图。尺寸3000milx4000mil(7.62cmx10.16cm)。图6为计算机输出的三维仿真印制板。 图4 图5 图6 元件选用 为了走时准确,晶振X最好选用温漂小的。四个数码管U1~U4可选用发绿光的,这样光泽较柔和。蜂鸣器Bz要购买绕线型的电动式蜂鸣器(市场上有一种加电压即工作的蜂鸣器这里不适用),因驱动信号为脉冲信号。其它元件一般无特殊要求。 使用方法 上电后,四个LED数码管闪烁四个8字。 按一下set键,闪烁现象消失(此时set=1),U1的小数点亮,说明此刻可以调整闹时时间。按下hour键,U1、U2作加法;按下min键,U3、U4作加法。这些调整好的数据被同时送入RAM区的闹时记忆“时”单元t_hour和闹时记忆“分”单元t_min。 再按一下set键,set=2,U2的小数点亮,此刻可以调整走时时间。按下hour键,U1、U2作加法;按下min键,U3、U4作加法。这些调整好的数据也被同步送入RAM区的“时”记忆单元hour和“分”记忆单元min。 再按一下set键,set=3,显示刚才调整的闹时时间,此刻可以选择启动/关停闹时。按下min键,o_f位标志置1,U3的小数点亮,闹时启动;按下hour键,o_f位标志置0,U3的小数点灭,闹时关闭。 若再按一下set键,set=0,电路进入走时状态,U1、U2显示小时,U3、U4显示分。U2的小数点作秒点闪烁。 在闹时启动的情况下,走时到达设定闹时,则蜂鸣器Bz鸣响一分钟进行提醒。 附:用C51编写的源程序清单(已由实验板运行通过) #include /*包含器件配置文件*/ #define uchar unsigned char #define uint unsigned int char DATA_7SEG[10]={0xC0,0xF9,0xA4,0xB0,0x99, 0x92,0x82,0xF8,0x80,0x90,};/*0~9的数码管段码*/ 文档从网络中收集,已重新整理排版.word版本可编辑.欢迎下载支持. 3word版本可编辑.欢迎下载支持. uchar hour=0,min=0,sec=0; /*时、分、秒单元清零*/ uchar deda=0; /*5mS计数单元清零*/ uchar t_hour=0,t_min=0; /*闹时时、分单元清零*/ bit d_05s=0; /*0.5秒标志*/ bit o_f=0; /*闹时启/停标志*/ uchar set=0; /*模式设定标志*/ uchar m=0; uchar flag=0; /*RAM掉电标志*/ void delay(uint k); /*延时子函数*/ void conv(); /*走时单元转换*/ void p_out(); /*判别闹时到否子函数*/ void dirve(); /*走时时间输出驱动子函数*/ void t_dirve(); /*闹时时间输出驱动子函数*/ /*闹时启/停子函数*/ void time1_of() {uchar m; if(P3_7==0)delay(1); if(P3_7==0)o_f=1; for(m=0;m<30;m++) { t_dirve(); P1=DATA_7SEG[t_min/10];P3=0xfd;delay(1); if(P3_1==0){if(o_f==1)P1_7=0;}else P1_7=1; delay(1); } if(P3_5==0)delay(1); if(P3_5==0) o_f=0; for(m=0;m<30;m++) { t_dirve(); P1=DATA_7SEG[t_min/10];P3=0xfd;delay(1); if(P3_1==0){if(o_f==1)P1_7=0;else P1_7=1;} delay(1); } } /*走时函数*/ void time() { conv(); /*走时单元转换*/ dirve(); /*走时时间输出驱动子函数*/ p_out(); /*判别闹时到否子函数*/ } 文档从网络中收集,已重新整理排版.word版本可编辑.欢迎下载支持. 4word版本可编辑.欢迎下载支持. /*定时器T0 5mS初始化*/ void init_timer() { TMOD=0x01; TH0=-(4800/256); TL0=-(4800%256); IE=0x82; TR0=1; } /*扫描按键子函数*/ void scan_key() { delay(1); if(P3_4==0)set++; if(set>=4)set=0; if(set==1)flag=0x55; F0:if(P3_4==0)goto F0; /*按键未释放,在此等候*/ } /*延时子函数*/ void delay(uint k) { uint i,j; for(i=0;i for(j=0;j<121;j++) {;}} } /*5mS定时中断服务子函数*/ void zd(void) interrupt 1 { TH0=-(4800/256); TL0=-(4800%256); deda++; } /*调整走时时间*/ void time_adj() {uchar m; if(P3_5==0)delay(1); if(P3_5==0)hour++; if(hour==24)hour=0; for(m=0;m<30;m++) { dirve();

相关文档
最新文档