基于AT89C51的电子定时闹钟设计

合集下载

基于AT89C51的电铃系统

基于AT89C51的电铃系统

基于AT89C51的电铃系统1电子闹铃的任务和设计要求1.1电子闹铃的设计任务设计一电子闹铃,该闹铃可设定起始走时时间和闹铃时间。

1.2电子闹铃的设计要求就电子闹铃而言,一般应具有以下基本功能要求:(1)能随意设定走时起始时间。

对电子闹铃而言,最基本的功能是具有对时功能,即能随意设定走时起始时间。

(2)能设定闹铃时间。

电子时钟一般都具有闹铃功能,预设一个时间,一旦走时到该时间,电子闹铃能以声或光的形式打铃提示。

(3)能指示秒节奏,即秒指示。

(4)12小时|24小时两种形式可选择,以适应不同的需要。

(5)采用交流供电电源。

电子闹铃一般采用数码管等显示介质,所以必须采用以交流供电为主,以直流电源为后备辅助电源,并能自动切换。

(6)具有走时误差修正能力。

1.3电子闹铃设计的研究基础利用单片机的智能型,可方便地实现具有智能的电铃设计。

由于微处理器均具有时钟振荡系统,利用系统时钟借助微处理器的定时器|计数器可实现电铃的功能。

虽然系统时钟的误差较大,电子钟的累积误差也可能较大,但可以通过误差修正软件加以修正。

2电子闹铃系统设计方案的确定2.1电子闹铃系统方案的提出电子闹铃既可以通过纯硬件设计实现,也可以通过软硬件结合的形式实现,根据电子闹铃的核心部件—秒信号的产生原理,通常有三种形式。

2.2电子闹铃系统方案的比较(1)采用石英钟专用芯片的实现形式采用石英钟专用计时芯片实现的闹铃具有实现简单、计时精度高的特点。

石英计时芯片比较多,常见的型号有STP5512F、SM5546A和D60400等。

(2)采用NE555石基电路的实现形式采用NE555石基电路或其他振荡电路产生秒脉冲信号,作为秒加法器电路的时钟信号或微处理器的外部中断输入信号,可构成电子闹铃。

由555构成的秒脉冲发生器电路如图1所示。

输出的脉冲信号V的频率f=1.443|(R1+2R2)C ,可通过调节这3个参数,使输出V的频率为精确的1Hz图1 基于555的秒脉冲发生、(3)采用基于单片机的实现形式利用单片机的智能性,方便地实现具有智能的电子闹铃的设计。

单片机课程设计——基于AT89C51的数字钟的设计

单片机课程设计——基于AT89C51的数字钟的设计

课程设计报告课程:单片机原理与接口技术姓名:班级:10通信1班河北联合大学信息工程学院一、设计名称基于AT89C51的数字钟的设计二、设计目的及要求1,了解AT89C51芯片的功能,性能,及使用方法。

2,了解时钟日历芯片DS12887的性能及使用方法。

3,利用所学汇编语言编(中断、计数等)写代码实现钟表计时定时等功能。

三、设计原理说明利用AT89C51芯片、时钟日历芯片DS12887,三极管等器件连接硬件电路,在用kell软件编写时钟程序,调试程序,最后烧入到硬件设备中进行结果检验及更改。

3.1、基于AT89C51数字钟设计的原理数字钟的基本功能是显示时间,可以通过计数器的级联实现。

以4位数码管的数字钟为例,设定前两位为小时,后两位为分钟,数码管的小数点闪烁可以表示秒。

首先产生一个1Hz的方波信号,在它的触发下驱动小数点闪烁。

在这个1Hz 的基础上,可以产生1/60Hz的信号(对1Hz信号计数,每计数30次就将输出反相,得到1/60Hz信号),它就是分钟信号需要的时钟。

在这个时钟的触发下分钟位数码管依次加1,直到60时变为0,再重新开始计数。

清零的时候要产生一个进位,加到小时上面。

其他时间小时位保持不变。

3.2、数字钟主要元件介绍3.2.1、AT89C51单片机AT89C51是一种低功耗,高性能的片内含有4KB快闪可编程/擦除只读存储器(FPEROM—Flash Programmable and Erasable Read Only Memory)的8位COMS微控制器,使用高密度,非易失存储技术制造,并且与80C51引脚和指令系统完全兼容。

芯片上的FPEROM允许在线编程或采用通用的非易失存储编程器对存储器重复编程。

单片机的主要特性如下:1.与MCS-51 兼容2.4K字节可编程闪烁存储器3.全静态工作:0Hz-24MHz4.三级程序存储器锁定5.4KB的片内程序存储器ROM6.128B内部数据存储器RAM和128B特殊功能寄存器SFR7.4个8位可编程并行I/O接口8.两个16位定时/计数器9.5个中断源的控制控制系统10.一个全双工串行接口11.低功耗的闲置和掉电模式12.片内振荡器和时钟电路。

基于89C51系列单片机的电子钟设计

基于89C51系列单片机的电子钟设计
(4)断电走时 (5)亮度调节
电子钟原理框图
主要器件:
• STC89C51
• 电源
稳压芯片:7805、LM1117-2.85
• USB转串口芯片:PL2303HX • 通讯芯片:MAX232 • 储存芯片:IIC协议控制芯片AT24C02 (EEPROM) • 时钟芯片:SPI协议控制芯片DS1302 • 温度传感器:1-WIRE协议控制芯片DS18B20 • 液晶显示芯片:1602
储存芯片:EEPROM (AT24C02)
AT24C02是一个2K位串行CMOS E2PROM, 内部含有256个8位字节, CATALYST公司的先进CMOS技术实质上减少了器件的功耗。AT24C02有 一个16字节页写缓冲器。该器件通过IIC总线接口进行操作,有一个专门 的写保护功能。
PL2302(USB转RS232控制器)
//显示温度、秒、时、分数据: write_temp(12,flag);//显示温度,从第二行第12个字符后开始显示 write_sfm(8,miao); write_sfm(5,fen); write_sfm(2,shi);
//显示日、月、年数据: write_nyr(9,ri);//日期,从第二行第9个字符后开始显示 write_nyr(6,yue); write_nyr(3,nian); write_week(week);}
液晶显示1602
LCD1602初始化流程图
液晶写入指令、数据函数
液晶写入有关函数会在DS1302的函数中调用,所以液晶程序要放在前面 • • • • • • • • • • write_1602com(uchar com)//****液晶写入指令函数**** { rs=0;//数据/指令选择置为指令 rw=0; //读写选择置为写 P0=com;//送入数据 delay(1); en=1;//拉高使能端,为制造有效的下降沿做准备 delay(1); en=0;//en由高变低,产生下降沿,液晶执行命令 }

基于AT89C51单片机的电子时钟课程设计

基于AT89C51单片机的电子时钟课程设计

基于AT89C51单片机的电子时钟课程设计一.设计任务与要求1. 该课程设计是利用MCS-51单片机的定时/计数器T0、中断系统、以及外围的按键和LED显示器等部件,设计一个单片机电子时钟。

设计的电子时钟通过两片4位数码管显示,并能通过按键实现时,分的设置,秒的清零和暂停、启动的控制。

2. 让同学掌握PRETUSS软件,进行程序设计并调试,并在程序烧录的cpu 后,在面包板中实现实物连接,实现电子钟的功能。

二、元器件清单及简介1.四位共阳LED数码管当数码管正面向上时,其引脚按逆时针方向从1—>12,对应的引脚为6->3->2->12为公共位选端2.元器件清单三、设计原理分析1.总体设计流程图2.子程序显示本程序运用定时器/计数器T0中断实现时间,并用两个4位数码管,从右到左依次显示秒个位、秒十位、横线、分个位、分十位、横线、时个位和时十位。

数码管显示的信息用8个内存单元存放,这8个内存单元称为显示缓冲区,其中秒个位和秒十位、分个位和分十位、时个位和时十位分别由秒数据、分数据和小时数据分拆得到,数码管显示采用软件译码动态显示。

在内存中首先建立一张显示信息的字段码表,显示时,先从显示缓冲区中取出显示的信息,然后通过查表程序在字段码表中查出所显示的信息的字段码,从P0口输出,同时在P2口将对应的位选码输出选中显示的数码管,就能在相应的数码管上显示显示缓冲区的内容。

3.按键功能实现按键处理设置为:如没有按键,则时钟正常走时。

当按下k0按键时,时钟停止,进入时间调整状态;按K1可K2按键可对小时进行加1或减1操作;继续按K0键后可对分进行加1或减1操作;按K3键可将秒位进行清零;第三次按K0后,时钟在当前状态下重新开始计时运行。

按键功能的实现,是通过对P1.0, P1.1, P1.2, P1.7脚的电位判断进行程序跳转。

其接法如下图所示:按键接法图4. 数码管接线图如上图所示为数码管的接法,为了保护LED数码管,在P0口接数据端提供低电压,接上拉电阻;P2口提供位选信号为高电压,增加驱动电阻,以提高灌流大小,使LED达到额定电流工作状态。

AT89C51单片机电子时钟的设计

AT89C51单片机电子时钟的设计

AT89C51单片机电子时钟的设计1.硬件设计首先,我们需要选择合适的外设硬件进行设计。

以下是一些常见的硬件组件:-AT89C51单片机-蜂鸣器-DS1302时钟模块-按键开关和对应的电阻液晶模块的连接方式如下:-VSS->GND-VDD->VCC-V0->电位器-RS->P0.7-R/W->P0.6-E->P0.5-DB0-DB7->P2.0-P2.7蜂鸣器的连接方式如下:-正极->P3.0-负极->GNDDS1302时钟模块的连接方式如下:-VCC->VCC-GND->GND-CE->P1.7-IO->P1.6-SCLK->P1.5按键开关的连接方式如下:-第一个按键->P3.1-第二个按键->P3.2-第三个按键->P3.32.软件设计在软件设计方面,我们将使用C语言编程来编写程序。

首先,我们需要定义和初始化必要的变量,例如小时、分钟和秒钟等计时变量。

然后,我们需要编写一个初始化函数来配置单片机的各种外设和寄存器。

在这个函数中,我们需要设置计时器/计数器、I/O口和中断等。

接下来,我们需要编写一个定时器中断函数,来更新计时变量并实现计时功能。

我们可以使用定时器中断来定期更新秒钟,并在需要时更新小时和分钟。

在主循环中,我们需要编写代码来控制液晶模块、蜂鸣器和按键开关等外设。

通过液晶模块,我们可以实现显示时间的功能。

通过蜂鸣器,我们可以实现头每秒发出一次滴答声的功能。

通过按键开关,我们可以实现设置时间的功能。

3.程序实现以下是AT89C51单片机电子时钟的程序框架:```c#include <reg51.h>#include <intrins.h>//定义和初始化计时变量unsigned char second = 0;unsigned char minute = 0;unsigned char hour = 0;//初始化函数void ini//配置计时器/计数器,设置定时器中断//配置I/O口和中断等//...//定时器中断函数//更新计时变量//...//主函数void mai//初始化init(;//主循环while (1)//控制液晶模块//控制蜂鸣器//控制按键开关//...}```在具体的代码实现中,我们需要根据液晶模块、蜂鸣器和按键开关等外设的具体规格和功能来编写相应的代码。

基于89C51的数字电子钟设计课程设计

基于89C51的数字电子钟设计课程设计

单片机原理与接口技术课程设计设计课题:基于89C51的数字电子钟设计单片机原理与接口技术课程设计课程设计名称:基于89C51的数字电子钟设计专业班级:自动F1106学生姓名:学号:指导教师:课程设计地点:课程设计时间:2013-12-16~2013-12-27单片机系统课程设计任务书目录1 概述 (5)1.1 研究背景 (5)1.2 设计思想及基本功能 (6)2 总体方案设计 (6)2.1 方案选取 (6)2.1.1显示模块选择方案和论证 (6)2.1.2时钟芯片的选择方案和论证 (7)2.2总体方案设计 (7)2.3 系统整体设计框图 (8)3 硬件电路设计 (8)3.1 电源电路设计 (8)3.2 晶振电路 (8)3.3 复位电路 (9)3.4 时钟电路 (10)3.4.1 DS1302芯片介绍 (10)3.4.2 DS1302在本设计中的应用 (14)3.5 键盘电路 (14)3.6 显示电路 (15)3.7 整点报时电路 (18)4 系统软件设计 (18)4.1 主程序软件设计 (19)4.2 键盘子程序设计 (20)4.3 日历时钟子程序设计 (21)4.4 显示子程序设计 (22)4.5 整点报时子程序的设计 (23)5 系统调试 (24)5.1软件调试 (24)5.2 硬件调试 (25)6 总结 (26)参考资料:......................................... 错误!未定义书签。

附录一:系统原理图................................. 错误!未定义书签。

附录二:元件清单................................... 错误!未定义书签。

附录二:源程序代码. (30)1 概述1.1 研究背景在日新月异的21世纪里,家用电子产品得到了迅速发展。

许多家电设备都趋于人性化、智能化,这些电器设备大部分都含有CPU控制器或者是单片机。

电子时钟基于AT89c51单片机设计电路图及程序

电子时钟基于AT89c51单片机设计电路图及程序

电子时钟基于AT89c51单片机的设计电子时钟原理图开机显示仿真图: 当按下仿真键时电子时钟开机页面显示第一行显示JD12102Class--16,第二行显示动态TINE:12:00:04。

电子时钟调时间仿真图:当按下K1为1次时,光标直接跳到电子时钟的秒,可以按下K2进行调节。

当按下K1为2次时,光标直接跳到电子时钟的分,可以按下K2进行调节。

当按下K1为3次时,光标直接跳到电子时钟的时,可以按下K2进行调节。

当按下K1为4次时,光标直接跳完,电子时钟可以进行正常计时。

电子时钟闹钟调节仿真:当按下K3为1次时,直接跳到闹钟显示界面00:00:00,按下K2可以对闹钟的秒进行调节。

当按下K3为2次时,可以调到分,按下K2可以对闹钟的分进行调节。

当按下K3为3次时,可以调到时,按下K2可以对闹钟的时进行调节。

当按下K3为4次时,直接跳到计时界面,对闹钟进行到计时,时间到可以发出滴滴声。

#include<reg51.h>#define uchar unsigned char //预定义一下#define uint unsigned intuchar table[]="JD12102Class--21"; //显示内容sbit lcden=P3^4; //寄存器EN片选引脚sbit lcdrs=P3^5; //寄存器RS选择引脚sbit beep=P3^6; //接蜂鸣器extern void key1();extern void key2();extern void key3();uchar num,hour=12,minite,second,ahour,aminite,asecond,a,F_k1,F_k2,F_k3; //定义变量void delay(uint z) //延时{uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void write_com(uchar com){lcdrs=0;P0=com; //送出指令,写指令时序delay(5);lcden=1;delay(5);lcden=0;}void write_data(uchar date){lcdrs=1;P0=date; //送出数据,写指令程序delay(5);lcden=1;delay(5);lcden=0;}void write_add(uchar add,uchar date){uchar aa,bb;aa=date/10;bb=date%10;write_com(0x80+add);write_data(0x30+aa);write_data(0x30+bb);}void init() //初始化{lcden=0;write_com(0x38); //设置16*2显示,5*7点阵write_com(0x0c); //开显示,不显示光标write_com(0x06); //地址加1,写入数据是光标右移1位write_com(0x01); //清屏write_com(0x80); //起点为第一行第一个字符开始}void display(uchar h,uchar m,uchar s) //显示设计程序{{write_com(0x80+0x16);}{write_com(0xC0+0x00);write_data('T');write_data('I');write_data('M');write_data('E');write_data(':');write_data(0x30+(h/10));write_data(0x30+(h%10));write_data(':');write_data(0x30+(m/10));write_data(0x30+(m%10));write_data(':');write_data(0x30+(s/10));write_data(0x30+(s%10));write_data(' ');write_data(' ');write_data(' ');} }void main(){init();TMOD=0X01; //设置T0定时方式1 TH0=(65535-50000)/256; //设置初值TL0=(65535-50000)%256;EA=1; //开总中断TR0=1; //启动T0ET0=1;for(num=0;num<16;num++) //依次读出数据{write_data(table[num]);}while(1){key1();key2();key3();if(ahour==hour&&aminite==minite&&second<10) //时间到闹钟响{beep=~beep;}if(F_k1==0&F_k3==0) //K1和K3按下次数为零就直接显示时分秒display(hour,minite,second);}}void timer0() interrupt 1 //T0中断函数{TH0=(65535-50000)/256; //装载计数器初值TL0=(65535-50000)%256;a++;if(a==20){ //进位设置60秒进1分,60分进1时,24时进0时a=0;second++;if(second==60){second=0;minite++;if(minite==60){minite=0;hour++;if(hour==24){hour=0;}}}}}#include <reg51.h> //调时间程序#define uchar unsigned char#define uint unsigned intsbit k1=P1^0; //定义3个变量sbit k2=P1^1;sbit k3=P1^2;extern uchar F_k1,F_k3,second,minite,hour,ahour,aminite,asecond; //预定义变量extern void write_com(uchar com);extern void write_add(uchar add,uchar date);extern void display(uchar h,uchar m,uchar s);void delay_key(int i){while(i--);}void key1(){if(k1==0) //按下K1零次时,直接计时与开机显示{delay_key(100);if(k1==0){TR0=0;while(!k1);F_k1++;if(F_k1==4){F_k1=0;write_com(0x0c);TR0=1;}}}if(F_k1==1|F_k3==1){write_com(0xC0+0x0c);write_com(0x0f);}if(F_k1==2|F_k3==2)write_com(0xC0+0x09);if(F_k1==3|F_k3==3)write_com(0xC0+0x06);}void key2(){if(k2==0){delay_key(100);while(!k2);if(F_k1==1) //按下K1一次时设置闹钟的秒{second++;if(second==60)second=0;write_add(0x4b,second);}if(F_k1==2) //按下K3两次时设置闹钟的分{minite++;if(minite==60)minite=0;write_add(0x48,minite);}if(F_k1==3) // 按下K1三次时设置闹钟的时{hour++;if(hour==24)hour=0;write_add(0x45,hour);}if(F_k3==1) //按下K3一次时设置闹钟的秒{asecond++;if(asecond==60)asecond=0;write_add(0x4b,asecond);}if(F_k3==2) //按下K3两次时设置闹钟的分{aminite++;if(aminite==60)aminite=0;write_add(0x48,aminite);}if(F_k3==3) //按下K3三次时设置闹钟的时{ahour++;if(ahour==24)ahour=0;write_add(0x45,ahour);}}}void key3(){if(k3==0){delay_key(100);if(k3==0){while(!k3);F_k3++;if(F_k3==4) //K3等于四次时直接跳入闹钟显示{F_k3=0;write_com(0x0c);}if(F_k3==1)display(ahour,aminite,asecond);}}}。

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

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

基于AT89C51单片机电子时钟的设计摘要单片机是集CPU、RAM、ROM、定时、计数和多种接口于一体的微控制器。

近年来随着计算机在社会领域的渗透和大规模集成电路的发展,单片机的应用正在不断地走向深入而51 单片机是各单片机中最为典型和最有代表性的一种。

由于它具有功能强,体积小,功耗低,价格便宜,工作可靠,使用方便等特点,因此特别适合于与控制有关的系统,越来越广泛地应用于自动控制,智能化仪器,仪表,数据采集,军工产品以及家用电器等各个领域,本文介绍单片机AT89C51结合74LS373设计时钟定时控制器实现的方案。

74LS373为三态输出的八组缓冲器。

本系统将单片机AT89C51内部时钟读出并通过七段数码管(LED)显示出来,通过按键设定的时间来改变系统的闹钟时间,单片机依据设定的时间来响铃,从而实现了系统的智能化。

关键词: AT89C51 电子时钟 74LS373AbstractMCU is a CP U、RAM、ROM、timing、co unting and mu ltip le interfaces in o ne microco ntro ller. In recent years, w ith the field o f co mp uter penetratio n in the co mmun ity and the develop ment o f large-scale integrated circuits, single-chip app licatio ns is stead ily mo ving toward dep th and 51 single-chip is the most typ ical and most representative o ne. Because o f its stro n g functio ns, small size, lo w po wer co nsump tio n, cheap, reliab le and easy to use and so o n, it is particularly suited to co ntro l systems and, mo re widely used in auto matic contro l, intelligent instruments, meters, data acq uisitio n, military p rod ucts, as well as ho useho ld app liances and o ther fields, This article describ es the design o f single-chip micro co mp uter AT89C51 co mb inatio n 74LS373 clock timing o f the p ro gram co ntro ller. 74LS373 tri-state o utp ut fo r the eight sets o f buffers . AT89C51 single-chip microco mp uter o f the system will read o ut the internal clock and thro ugh the LED d isp lay,thro ugh the b utto n to set thealarm clo ck to change the system time, single-chip b ased o n the time to set alarm clock p rocessing, thus realizing the intelligent system.Key words: AT89C51 MC U; Electro nic clock; 74LS373目录摘要 0Abstract 0目录 (1)第一章单片机概述 (2)1.1单片机的定义 (2)1.2单片机的特点 (2)1.3单片机的应用领域 (3)第二章MCS-51单片机简介 (5)2.1 MCS-51单片机结构及引脚说明 (5)2.2中央处理器(CPU)的结构 (7)2.3 AT89C51单片机的存储器 (9)第三章LED数码管及74LS373简介 (13)3.1 数码管的分类 (13)3.2 数码管的驱动方式 (13)3.3 数码管应用 (14)3.4 数码管使用的电流与电压 (14)3.5 74LS373简介 (14)第四章电子钟功能介绍 (15)4.1 系统功能介绍 (15)4.2 软件设计流程 (15)4.3 电子钟程序清单 (17)第五章电子钟软件实现仿真 (18)5.1 单片机模拟调试软件Keil (18)5.2 Proteus软件简介 (21)5.3 电子时钟仿真 (22)5.4 整机仿真及调试 (24)附录 (25)第一章单片机概述1.1单片机的定义单片机是指一个集成在一块芯片上的完整计算机系统。

基于AT89C51单片机的电子钟设计

基于AT89C51单片机的电子钟设计

重庆三峡学院《单片机原理及应用》课程设计报告书题目:基于AT89C51单片机的电子钟设计:学院(系)年级专业:号:学学生姓名:指导教师:教师职称:绩:成日2月12 年2012 制作日期基于AT89C51作息时间控制器的设计摘要:以单片机设计了一个基于AT89C51的作息时间控制器系统。

我们采用的是六位数码管静态显示方案来实现的。

该电子主要由A T89C51、74L164、六位数码管等构成的。

采用晶振电路作为驱动电路,有延时程序和循环程序作为一秒定时,达到时分秒的计时。

用keil进行代码编译,用proteus的ISIS软件进行仿真。

,单片机体积小设计成本低,且抗干扰能力很强,可以实现分式各分部控制的优点,让单片机很大的发展前景。

本次设计采用的就是现在性能最好的A T89C51单片机设计而成的最小系统。

它在我们生活中有很广泛的应用。

关键词:单片机电子钟静态显示目录第一章:引言1.1设计要求 (2)1.2设计目的 (2)1.3设计思路 (2)1.4主控制系统 (2)第二章:硬件系统2.1硬件原理图 (3)2.2晶振电路 (3)2.3复位电路 (4)2.4驱动电路 (4)2.5显示电路 (5)2.6硬件原理及说明 (6)2.7主要性能及参数 (6)第三章:软件系统设计 (7)3.1主程序 (7)3.2显示子程序 (8)3.3定时中断子程序 (10)3.4软件仿真 (12)第四章:系统调试 (14)4.1硬件调试 (14)第五章:实验心得 (14)参考文献 (14)附录……………………………………………………………………………………第15页- 1 -第一章引言1.1设计要求:系统上电和复位后能自动显示时间,能根据预先设定的时间进行打铃,响铃时间为15秒。

设计一个六位数码管的额显示电路,能够显示“时、分、秒”1.2设计目的:1.2.1通过课程设计能让我们更加深入的了解单片机的基本原理,各电路的设计及其仿真调试。

基于AT89C51单片机的电子钟设计

基于AT89C51单片机的电子钟设计

目录一、内容提要 (2)二、设计的基本步骤及方案 (2)三、硬件电路设计及描述 (4)四、软件设计程序框图 (6)五、硬件的调试过程 (13)六、课程设计体会 (14)七、参考资料 (15)附汇编语言一、内容提要1、设计任务利用AT89C51单片机制作,基于这种单片机自主创作一个LED显示的智能电子钟。

分析,综合考虑系统的主要功能,我们经过查阅资料、接口的设计、程序的设计、安装调试等环节。

完成一个基于MCS51系列的单片机,设计多种资源的掌握和应用,并具有综合能力的小应用系列的设计,同时学习并使用相关的仪器设备、软件进行编写和调试程序。

2、设计要求1)用六个七段LED数码管作为显示设备,设计时钟功能。

2)显示的格式应该为:日期、时间同时都能看到,并且表示的格式为:日期:YY MM DD, 时间:HH MM SS。

3)还要分别设计年、月、日、时、分、秒,在复位后的日期应该为:12 01 01,时间为:00 00 00 。

4) 秒钟复位功能,秒复位键按下后,秒回到00。

5)键盘按键个数应该万为己确定。

6)@时间、月、日自行交替显示,或按键切换显示。

7)12小时和24小时切换功能。

8)* 实现闹钟功能。

二、设计的基本方案及步骤1、主控制器1)单片机的选择与外围电路:AT89C51作为温度测试系统的核心器件。

该器件是INTEL公司生产的MCS-51系列单片机的基础产品,采用了可靠的CMOS工艺制造技术,具有高性能的8位单片机,属于标准的MCS-51的CMOS产品。

不仅结合了HMOS的高速和高密度技术及HMOS的低功耗特征,而且继承和扩展了MCS-48单片机的体系结构和指令系统。

单片机小系统的电路图如图所示。

AT89C51:AT89C51单片机的主要特征:1)与MCS-51兼容,4K字节可编程闪烁存储器;2)灵活的在线系统编程,掉电标识和快速编程特性;3)寿命为1000次写/擦周期,数据保留时间可10年以上;4)全静态工作模式:0HZ~33HZ;5)三级程序存储器锁定;128×8位内部RAM,32位可编I/O线;6)16位定时器/计数器,5个中断源,4个8位并行的I/O接口,1个全双工I/O 接口。

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

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

基于at89c51单片机的定时闹钟的设计本文介绍了基于AT89C51单片机的定时闹钟的设计。

文章将探讨设计目的和背景,并着重阐述定时闹钟的实现原理和功能。

本文档将介绍基于at89c51单片机的定时闹钟的硬件设计要点,包括电源、显示器、按键等组件选择和连接方式。

电源选择与连接在设计定时闹钟的硬件方案时,选择合适的电源是非常重要的。

以下是一些电源选择和连接的要点:使用稳定可靠的电源模块,例如直流电源模块,以确保单片机工作的稳定性。

将电源模块的正负极连接到at89c51单片机的VCC和GND引脚上。

注意电源的电压和电流要符合at89c51单片机的工作要求。

显示器选择与连接显示器是定时闹钟中显示时间和其他信息的重要组件。

以下是一些显示器选择和连接的要点:考虑使用液晶显示器 (LCD) 或数码管作为显示器,这些显示器可以清晰地显示数字和字符。

根据设计需求,选择合适的显示器尺寸和类型。

将显示器的控制引脚与at89c51单片机的相应引脚连接,以实现时间和信息的显示。

按键选择与连接按键是控制定时闹钟设置和功能的重要组件。

以下是一些按键选择和连接的要点:选择合适的按键类型,例如触摸按键或机械按键。

根据设计需求,确定所需的按键数量和布局。

将按键的引脚连接到at89c51单片机的GPIO引脚,以接收按键输入并实现相应的功能。

上述是基于at89c51单片机的定时闹钟的硬件设计要点,通过合理选择和连接电源、显示器和按键等组件,可以确保定时闹钟的稳定运行和正常功能。

本文将阐述基于at89c51单片机的定时闹钟的软件设计要点,包括如下内容:定时器的设置:使用at89c51单片机的定时器来实现定时功能,可以通过对定时器寄存器的设置来调整定时的时间间隔。

中断处理:在定时器到达设定的时间间隔时,通过中断处理来触发相应的操作。

可以通过设定中断优先级来确保定时器中断的可靠性。

闹钟功能的实现:通过软件算法和控制电路,将定时器和中断处理结合起来实现闹钟功能。

基于at89c51的电子时钟设计

基于at89c51的电子时钟设计

课程设计2:设计一个数字时钟。

要求如下:1.利用51开发板上LED数码管,LED灯,按键等设备,设计一个电子时钟。

2.电子钟使用4位数码管显示小时(24小时制)和分钟,秒可以使用LED灯或其他形式表现。

3.具有设置时钟功能,设置时间时,时间停止计时。

需要设置的位置数码管处于闪烁状态,如你想设置小时的数值时,显示小时的数码管需要处于闪烁状态,而显示分钟的数码管不可以处于闪烁状态,应处于正常显示状态。

4.按键可以选择独立键盘或矩阵键盘。

5.其他扩展功能(选做,能力强的可以做):如闹钟,时制切换等。

一.key.c#include "reg52.h"#include "key.h"extern unsigned char min_flag ;//标志位,控制分数码管闪烁extern unsigned char hour_flag ;//标志位,控制时数码管闪烁extern unsigned char shi ;extern unsigned char fen ;unsigned char key_flag = 0;//标志位,有按键被按下unsigned char key_con = 0;//控制位,控制按键(K1)被按下/*独立按键P12连接到51单片机P1端口k1对应的端口为P1.3k2对应的端口为P1.2k3对应的端口为P1.1k4对应的端口为P1.0*/code unsigned char arr[]={0xf7,0xfb,0xfd,0xfe};unsigned char read_key(unsigned char key){unsigned char i;for(i=0;i<8;i++){if(!(key & 1)){return i+1;}key>>=1; //key = key >> 1 ;}return 0;}void key_scan2(void){unsigned char temp;//键盘扫描temp = key4_scan();if(temp){if(!key_flag){if(temp==4)//K1被按下{key_con++;if(key_con==1) //第一次按下调整小时的数值{hour_flag=1;min_flag =0;}else if(key_con==2) //第二次按下调整分的数值{hour_flag=0;min_flag =1;}else //第三次按下取消调整{hour_flag=0;min_flag =0;key_con = 0;}}if(temp == 3) //增加数值{if(hour_flag){shi++;if(shi>23){shi = 0;}}else if(min_flag){fen++;if(fen>59){fen = 0;}}}if(temp == 2) //减少数值{if(hour_flag){shi--;if(shi>250){shi = 23;}}else if(min_flag){fen--;if(fen>250) //非负数,减的时候不会小于0{fen=59;}}}}key_flag = 1;}else{key_flag = 0;}}/*扫描独立键盘,输入参数:无返回值:有键按下时:返回对应的数字没有按键:返回0*/unsigned char key4_scan(void){unsigned char temp;P1 = 0xf;if(P1 != 0xf)//有按键被按下{temp = P1 & 0xf;//1110return read_key(temp);}return 0;}unsigned char sub_key_scan(unsigned char key) {unsigned char temp;P1 = key; //判断第一行temp = P1 >> 4;if(temp != 0xf){return read_key(temp);}return 0;}/*矩阵键盘硬件连接:P13连接到51单片机P1端口P1.0对应P13的1脚P1.1对应P13的2脚P1.2对应P13的3脚……P1.7对应P13的8脚输入参数:无返回值:有键按下时:返回对应的数字没有按键:返回0*/unsigned char key16_scan(void){unsigned char temp;unsigned char i=0;P1 = 0xf0;if(P1 != 0xf0)//有按键被按下{for(i=0;i<4;i++)//用函数扫描4行{temp = sub_key_scan(arr[i]);if(temp){return temp+(i*4);}}}return 0;}二.Key.h#ifndef KEY_H#define KEY_Hunsigned char key4_scan(void); unsigned char key16_scan(void);void key_scan2(void);#endif三.Led_reg.c#include "reg52.h"/*P2连接位码,P2.0连接Q4B,P2.1连接Q3B,P2.2连接Q2B,P2.3连接Q1B P0端口连接段码,P0.0连接A,。

基于单片机AT89C51的实时时钟设计

基于单片机AT89C51的实时时钟设计

一.系统分析本电路是由AT89C51单片机为控制核心,具有在线编程功能,低功耗,能在4.5V超低压工作;显示部分用LCD1602实现,能够同时显示16x02即32个字符;闹钟部分由蜂鸣器构成,蜂鸣器是一种一体化结构的电子讯响器;时钟电路由DS1302提供,它是一种高性能、低功耗、带RAM的实时时钟电路,可以对年、月、日、星期、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V~5.5V.采用三线接口与单片机进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。

DS1302内部有一个31×8的用于临时性存放数据的RAM 寄存器。

可产生年、月、日、周日、时、分、秒,具有使用寿命长,精度高和低功耗等特点,同时具有掉电自动保存功能,本设计中为DS1302增加了备用电池,当主电源掉电时,备用电池自动为其供电;温度的采集由DS18B20构成;当闹铃时间到时,通过蜂鸣器播放闹铃铃声。

二.系统功能框图的设计电阻RES 排阻RESPACK-8按键BUTTON四.系统软件设计(流程图和软件设计)主程序流程图C程序:#include <reg52.h>#include "intrins.h"#include "24c02.h"#define uchar unsigned char#define uint unsigned int//闹钟显示缓冲区code uchar alarm_one[]=" Hello,L.W Hou";code uchar alarm_two[]="GOOD MORNING HLW";code uchar w1[]={0x01,0x03,0x1D,0x11,0x1D,0x03,0x01,0x00};code uint cyc[]={1800,1600,1440,1351,1200,1079,960};//音阶1-7的半周期数code uchar tone[]={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 uchar time[]={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;uchar code tabe1[]="20 - - "; //液晶一直显示的字符uchar code tabe2[]=" : : ";uchar code tabe3[]="Alarm set:";ucharmiao,fen,shi,nian,yue,ri,week,wendu_shi,wendu_ge,wendu_shu,variate,alarm_shi,alar m_fen,alarm_miao;ucharflag=1,count=0,flag_up=0,flag_down=0,flag_alarm=0,alarm_on,alarm_count=0,done =0;uint wendu;//定义IOsbit DQ = P1^0; //ds18b20温度传送数据IO口sbit ds1302_rst = P1^1; //1302复位sbit ds1302_io = P1^2; //数据输入输出sbit ds1302_sclk= P1^3; //串行时钟sbit alarm_out = P3^6;sbit lcd1602_rs = P2^0; // 1602命令、数据选择sbit lcd1602_rw = P2^1; // 1602写sbit lcd1602_e = P2^2; // 1602使能sbit set = P2^4; //选择按键sbit up = P2^5; //加sbit down= P2^6; //减sbit nao = P2^7;sbit ACC0=ACC^0;sbit ACC7=ACC^7;sbit MODE=P3^2;//延时void delay(uchar x){uchar y,z;for(z=x;z>0;z--)for(y=110;y>0;y--);}void delay1(){_nop_();_nop_();}void delay2(uint ms){uint i,j;for (j=0;j<ms;j++)for (i=0;i<120;i++);}ds18b20_delay(uchar xus) //延时xus{while(xus--);return 0;}/**********************ds18b20***********************/ void ds18b20_init() //DS18B20初始化{uchar x=0;DQ=1;ds18b20_delay(8);DQ=0;ds18b20_delay(80);DQ=1;ds18b20_delay(14);x=DQ;ds18b20_delay(20);}void write_onechar(uchar dat) //写一字节{uchar i;for(i=8;i>0;i--){DQ=0;if(dat&0x01==0x01)DQ=1;elseDQ=0;ds18b20_delay(5);DQ=1;ds18b20_delay(1);dat>>=1;}}uchar read_onechar() //读一字节{uchar value=0,i;for(i=8;i>0;i--){value>>=1;DQ=0;ds18b20_delay(1);DQ=1;if(DQ==1)value|=0x80;elsevalue&=0x7f;ds18b20_delay(4);}return value;}uint read_wendu() //DS18B20读温度{uchar a=0,b=0;uint wen=0x0000;ds18b20_init(); //初始化write_onechar(0xcc); // 跳过读序号列号的操作write_onechar(0x44); // 启动温度转换ds18b20_delay(150);ds18b20_init(); //初始化write_onechar(0xcc); //跳过读序号列号的操作write_onechar(0xbe); //读取温度寄存器等(共可读9个寄存器)前两个就是温度ds18b20_delay(150);b=read_onechar(); //读取温度值低位a=read_onechar(); //读取温度值高位wen=a;wen=(wen<<8)|b;return wen;}/**********************ds1302***************************/void write_byte(uchar dat) //写一字节{uchar k;ACC=dat;for(k=8;k>0;k--){ds1302_io=ACC0;ds1302_sclk=0; //拉低sclkds1302_sclk=1; //拉高sclkACC>>=1;}}uchar read_byte(){uchar k;for(k=8;k>0;k--){ACC7=ds1302_io;ds1302_sclk=1; //拉高sclkds1302_sclk=0; //拉低sclkACC>>=1;}return ACC;}void ds1302_write(uchar add,uchar date){ds1302_rst=0;ds1302_sclk=0; //在rst没拉高之前先把sclk置0ds1302_rst=1;write_byte(add);write_byte(date);ds1302_sclk=1;ds1302_rst=0;}uchar ds1302_read(uchar add){uchar temp;ds1302_rst=0;ds1302_sclk=0; //在rst没拉高之前先把sclk置0ds1302_rst=1;write_byte(add);temp=read_byte();ds1302_sclk=1;ds1302_rst=0;return temp;}void ds1302_init() //ds1302初始化{ds1302_rst=0;ds1302_sclk=1;ds1302_write(0x8e,0x00); //写允许ds1302_write(0x80,0x58);ds1302_write(0x82,0x56);ds1302_write(0x84,0x09);ds1302_write(0x86,0x12);ds1302_write(0x88,0x05);ds1302_write(0x8a,0x05);ds1302_write(0x8c,0x12);ds1302_write(0x8e,0x80); //写保护}/***************************lcd1602***************************/ void lcd_write_com(uchar com) //命令字写入lcd单元中{lcd1602_rw=0;delay1();lcd1602_rs=0; // RW=1,RS=0,写LCD命令字delay1();P0=com; //将com中的命令字写入LCD数据口delay1();lcd1602_e=1; //E端时序delay1();lcd1602_e=0;delay1();lcd1602_rw=1;delay(5);}void lcd_write_date(uchar date) //数据写入lcd单元中{lcd1602_rw=0;delay1();lcd1602_rs=1; // RW=0,RS=1,写LCD命令字delay1();lcd1602_e=1; // E端时序delay1();P0=date; // 将dat中的显示数据写入LCD数据口delay1();lcd1602_e=0;delay1();lcd1602_rw=1;delay(5);}void lcd1602_init() //LCD初始化函数{uchar lcdnum;P3=0xdf;lcd_write_com(0x38);lcd_write_com(0x0c);lcd_write_com(0x06);lcd_write_com(0x01);lcd_write_com(0x80);for(lcdnum=0;lcdnum<8;lcdnum++) //写第一行数据{lcd_write_date(tabe1[lcdnum]);delay(2);}lcd_write_com(0x80+0x40); //写入第二行数据for(lcdnum=0;lcdnum<13;lcdnum++){lcd_write_date(tabe2[lcdnum]);delay(2);}}/****************************显示部分*****************************/void write_time1(uchar add,uchar date) //日期送显示{uchar shi,ge;shi=date/10;ge=date%10;lcd_write_com(0x80+add);lcd_write_date(0x30+shi);lcd_write_date(0x30+ge);}void write_time2(uchar add,uchar date) //时间送显示{uchar shi,ge;shi=date/10;ge=date%10;lcd_write_com(0x80+0x40+add);lcd_write_date(0x30+shi);lcd_write_date(0x30+ge);}uchar bcd_decimal(uchar bcd) //bcd转换十进制{uchar decimal;decimal=bcd>>4;decimal=decimal*10+(bcd&=0x0f);return decimal;}void wendu_decimal(uint dat) //温度转换后送显示{float temp;temp=dat*0.625; //dat*0.0625*10wendu_shi=temp/100; //取十位temp除不用定义类型wendu_ge =((uint)temp)%100/10; //取个位temp求模要定义类型,为//16位,故定义uintwendu_shu=((uint)temp)%100%10; //取小数lcd_write_com(0x80+0x40+10); //送显示lcd_write_date(0x30+wendu_shi);lcd_write_date(0x30+wendu_ge);lcd_write_date(0x2e);lcd_write_date(0x30+wendu_shu);lcd_write_date(0xdf); //温度符号lcd_write_date(0x43);}void write_week(uchar we) //星期送显示{lcd_write_com(0x80+0x0d);switch(we){case 1: lcd_write_date('M');lcd_write_date('O');lcd_write_date('N');break;case 2: lcd_write_date('T');lcd_write_date('U');lcd_write_date('E');break;case 3: lcd_write_date('W');lcd_write_date('E');lcd_write_date('D');break;case 4: lcd_write_date('T');lcd_write_date('H');lcd_write_date('U');break;case 5: lcd_write_date('F');lcd_write_date('R');lcd_write_date('I');break;case 6: lcd_write_date('S');lcd_write_date('A');lcd_write_date('T');break;case 7: lcd_write_date('S');lcd_write_date('U');lcd_write_date('N');break;}}void lcd_write_com1(uchar com,bit rs) //命令字写入lcd单元中{lcd1602_rs=rs;lcd1602_rw=0; // RW=1,RS=0,写LCD命令字P0=com;delay1();delay1(); //将com中的命令字写入LCD数据口lcd1602_e=0;delay1();delay1();lcd1602_e=1; //E端时序delay1();delay1();lcd1602_e=0;delay1();delay1();}/***************LCD1602闹钟显示函数******************/void display_1602_alarm(){uchar i,j,k;P3=0xdf;lcd_write_com(0x38);lcd_write_com(0x0c);lcd_write_com(0x06);lcd_write_com(0x01);lcd_write_com(0x80); //液晶显示位置delay2(5);for (i=0;i<sizeof(alarm_one)-1;i++){lcd_write_date(alarm_one[i]);delay2(5);}lcd_write_com1(0x40,0);lcd_write_com1(0x40,0);for(j=0;j<8;j++)lcd_write_com1(w1[j],1);lcd_write_com1(0x80+0x0f,0);lcd_write_com1(0x00,1);lcd_write_com(0x80+0x40); //液晶显示位置delay2(5);for (k=0;k<sizeof(alarm_two)-1;k++){lcd_write_date(alarm_two[k]);delay2(5);}}/***********************按键处理***************************/ uchar key_bcd(uchar key_decimal) //转成ds1302所需的BCD码{uchar temp;temp=(((key_decimal/10)&0x0f)<<4)|(key_decimal%10);return temp;}void key_up_down() //加减键处理{if(up==0){delay(2);flag_up=1; //加更新标志while(!up);switch(count){case 1:miao++;if(miao>59) miao=0; break; case 2:fen++;if(fen>59) fen=0; break; case 3:shi++;if(shi>23) shi=0; break; case 4: week++;if(week>7) week=1; break; case 5:ri++;if(ri>31)ri=1; break; case 6:yue++;if(yue>12) yue=1; break; case 7: nian++;if(nian>99) nian=0; break;}}if(down==0) //减键处理{delay(2);flag_down=1; //减更新标志while(!down);switch(count){case 1:miao--;if(miao==255)miao=59;break;case 2:fen--;if(fen==255)fen=59;break;case 3:shi--;if(shi==255)shi=23;break;case 4:week--;if(week<1)week=7;break;case 5:ri--;if(ri<1)ri=31;break;case 6:yue--;if(yue<1)yue=12;break;case 7:nian--;if(nian==255)nian=99;break;}}}void c02_init(){c_init();alarm_shi=c02_read_add(1); //读取闹钟时delay(200);alarm_fen=c02_read_add(2); //分delay(200);alarm_miao=c02_read_add(3); //秒delay(200);alarm_on =c02_read_add(4); //读取闹钟开关值,为0关,为1开delay(200);}void alarm_huan() //按下闹钟键后,切换界面{uchar num;lcd_write_com(0x01);lcd_write_com(0x80);for(num=0;num<10;num++) //写第一行数据{lcd_write_date(tabe3[num]);delay(2);}lcd_write_com(0x0f);write_time2(4,alarm_shi);lcd_write_date(0x3a);write_time2(7,alarm_fen);lcd_write_date(0x3a);write_time2(10,alarm_miao);if(alarm_on==0){lcd_write_com(0x80+0x40+13);lcd_write_date('O');lcd_write_date('F');lcd_write_date('F');}if(alarm_on==1){lcd_write_com(0x80+0x40+13);lcd_write_date(' ');lcd_write_date('O');lcd_write_date('N');}}void key_set_alarm(){if(set==0 && alarm_count==0 && flag_alarm==0){delay(2);if(set==0){while(!set); //等待set释放count++; //按set一下,count加1if(flag==1){done=1;flag=0;ds1302_write(0x8e,0x00); //写允许ds1302_write(0x80,key_bcd(miao)|0x80); //BIT7为1,晶振停止工作ds1302_write(0x8e,0x80); //写保护}}}if(nao==0 && count==0 && flag_alarm==0){delay(2);if(nao==0){while(!nao);alarm_count++;if(flag==1){done=1;flag=0;alarm_huan(); //切换界面}}}}void keyjpress() //按键处理{key_set_alarm();if(count!=0) //count不为0,进入时间调整扫描{switch(count){case 1:do{lcd_write_com(0x0F); //显示光标,不闪烁lcd_write_com(0x80+0x40+7);key_up_down();if(flag_up || flag_down){flag_up=0;flag_down=0;ds1302_write(0x8e,0x00);ds1302_write(0x80,key_bcd(miao) | 0x80);ds1302_write(0x8e,0x80);write_time2(6,miao);lcd_write_com(0x80+0x40+7); //液晶写字符后光标自动向右移动//一位,把光标左移一位}}while(count==2);break;case 2:do{lcd_write_com(0x80+0x40+4);key_up_down();if(flag_up || flag_down){flag_up=0;flag_down=0;ds1302_write(0x8e,0x00);ds1302_write(0x82,key_bcd(fen));ds1302_write(0x8e,0x80);write_time2(3,fen);lcd_write_com(0x80+0x40+4);}}while(count==3);break;case 3:do{lcd_write_com(0x80+0x40+1);key_up_down();if(flag_up || flag_down){flag_up=0;flag_down=0;ds1302_write(0x8e,0x00);ds1302_write(0x84,key_bcd(shi));ds1302_write(0x8e,0x80);write_time2(0,shi);lcd_write_com(0x80+0x40+1);}}while(count==4);break;case 4: do{lcd_write_com(0x80+0x0e);key_up_down();if(flag_up || flag_down){flag_up=0;flag_down=0;ds1302_write(0x8e,0x00);ds1302_write(0x8a,key_bcd(week));ds1302_write(0x8e,0x80);write_week(week);lcd_write_com(0x80+0x0e);}}while(count==5);break;case 5:do{lcd_write_com(0x80+9);key_up_down();if(flag_up || flag_down){flag_up=0;flag_down=0;ds1302_write(0x8e,0x00);ds1302_write(0x86,key_bcd(ri));ds1302_write(0x8e,0x80);write_time1(8,ri);lcd_write_com(0x80+9);}}while(count==6);break;case 6:do{lcd_write_com(0x80+6);key_up_down();if(flag_up || flag_down){flag_up=0;flag_down=0;ds1302_write(0x8e,0x00);ds1302_write(0x88,key_bcd(yue));ds1302_write(0x8e,0x80);write_time1(5,yue);lcd_write_com(0x80+6);}}while(count==7);break;case 7:lcd_write_com(0x80+3);key_up_down();if(flag_up || flag_down){flag_up=0;flag_down=0;ds1302_write(0x8e,0x00);ds1302_write(0x8c,key_bcd(nian));ds1302_write(0x8e,0x80);write_time1(2,nian);lcd_write_com(0x80+3);}break;case 8:lcd_write_com(0x0c); //调整结束,关闭显示光标flag=1;done=0;count=0;ds1302_write(0x8e,0x00);ds1302_write(0x80,key_bcd(miao)&0x7f); //BIT7为0,晶振开始工作ds1302_write(0x8e,0x80);break;default:break;}}if(alarm_count!=0) //闹钟按键扫描{switch(alarm_count){case 1:lcd_write_com(0x80+0x40+15);if(up==0){delay(2);if(up==0){while(!up);alarm_on=1;lcd_write_com(0x80+0x40+13);lcd_write_date(' ');lcd_write_date('O');lcd_write_date('N');c02_write_add(4,alarm_on);delay(200);lcd_write_com(0x80+0x40+15);}}if(down==0){if(down==0);{while(!down);alarm_on=0;lcd_write_com(0x80+0x40+13);lcd_write_date('O');lcd_write_date('F');lcd_write_date('F');c02_write_add(4,alarm_on);delay(200);lcd_write_com(0x80+0x40+15);}}break;case 2:lcd_write_com(0x80+0x40+11);if(up==0 || down==0){delay(2);if(up==0){while(!up);alarm_miao++;if(alarm_miao>59)alarm_miao=0;}if(down==0){while(!down);alarm_miao--;if(alarm_miao==255)alarm_miao=59;}write_time2(10,alarm_miao);lcd_write_com(0x80+0x40+11);c02_write_add(3,alarm_miao);delay(200);}break;case 3:lcd_write_com(0x80+0x40+8);if(up==0 || down==0){delay(2);if(up==0){while(!up);alarm_fen++;if(alarm_fen>59)alarm_fen=0;}if(down==0){while(!down);alarm_fen--;if(alarm_fen==255)alarm_fen=59;}write_time2(7,alarm_fen);lcd_write_com(0x80+0x40+8);c02_write_add(2,alarm_fen);delay(200);}break;case 4:lcd_write_com(0x80+0x40+5);if(up==0 || down==0){delay(2);if(up==0){while(!up);alarm_shi++;if(alarm_shi>23)alarm_shi=0;}if(down==0){while(!down);alarm_shi--;if(alarm_shi==255)alarm_shi=23;}write_time2(4,alarm_shi);lcd_write_com(0x80+0x40+5);c02_write_add(1,alarm_shi);delay(200);}break;case 5:alarm_count=0;lcd1602_init();flag=1;done=0;break;}}}void xianshi(){//读秒分时,日月年,星期miao=bcd_decimal(ds1302_read(0x81));fen =bcd_decimal(ds1302_read(0x83));shi =bcd_decimal(ds1302_read(0x85));ri =bcd_decimal(ds1302_read(0x87));yue =bcd_decimal(ds1302_read(0x89));nian=bcd_decimal(ds1302_read(0x8d));week=bcd_decimal(ds1302_read(0x8b));//送液晶显示write_time2(6,miao);write_time2(3,fen);write_time2(0,shi);write_time1(8,ri);write_time1(5,yue);write_time1(2,nian);write_week(week);//读温度wendu=read_wendu();//温度显示wendu_decimal(wendu);}/**********定时器0中断用于产生音阶方波***********/void cntint0(void) interrupt 1{TH0=H0;TL0=L0;alarm_out=~alarm_out; // alarm_out是音乐信号输出脚,alarm_out反相,产生//方波}/**********定时器1中断用于产生节拍延时***********/void cntint1(void) interrupt 3{cnt++; // 计数初值为0,所以不用赋值}/**************************24c02********************************/void alarm_ring(){uchar i,j,a,t;uint b;if(alarm_on==1) //alarm_on=1 为闹钟有效{if(shi==alarm_shi && fen==alarm_fen && miao==alarm_miao) flag_alarm=1;} //闹钟时间到,闹钟标志位置1 if(flag_alarm==1){alarm_out=~alarm_out;{TMOD=0x11;EA=1; //开总中断ET0=1;ET1=1;cnt=0;TR1=1;i = 0;display_1602_alarm();while(1){//扫描按键如有按键按下退出闹钟if(up==0||down==0){delay2(1);if(up==0||down==0){break;}while(!up);while(!down);}t=tone[i]; //读音调if(t==0xff) break; //0xff是结束符if(t!=0) //0是休止符{b=cyc[t%10-1]; //根据基本音阶,求出半周期数if(t<10) b=b*2; //若是低八度音阶,半周期数加倍if(t>20) b=b/2; //若是高八度音阶,半周期数减半H0=(65536-b)/256; //根据半周期数,计算T0初值的高字节和低字节L0=(65536-b)%256;TR0=1; //启动定时器0发音}cnt=0;a=time[i]; //读节拍while(a>cnt){//扫描按键如有按键按下退出闹钟if(up==0||down==0){delay2(1);if(up==0||down==0){break;}while(!up);while(!down);}}TR0=0;i++;for(b=0;b<1000;b++); //稍加延时,增强节奏感}EA=0;}flag_alarm=0;alarm_out=1; //关闭喇叭lcd1602_init();if(flag_alarm==0||alarm_out!=0){key_set_alarm();}}void Delayms(int ms) //延时函数{while(ms){unsigned char i;for (i=0; i<120; i++);ms--;}}void voice()//发声函数{uchar i,j,t;t=8000;if((fen==59)&&(miao==51))//判断时间符合低音条件{ for(i=0;i<255;i++){alarm_out =~alarm_out;for(j=0;j<200;j++);}Delayms(2000);}if((fen==59)&&(miao==53))//判断时间符合低音条件{for(i=0;i<255;i++){alarm_out =~alarm_out;for(j=0;j<200;j++);}Delayms(2000);if((fen==59)&&(miao==55))//判断时间符合低音条件{for(i=0;i<255;i++){alarm_out =~alarm_out;for(j=0;j<200;j++);}Delayms(2000);}if((fen==59)&&(miao==57))//判断时间符合低音条件{for(i=0;i<255;i++){alarm_out =~alarm_out;for(j=0;j<200;j++);}Delayms(2000);}if((fen==59)&&(miao==59))//判断时间符合高音条件{for(i=0;i<255;i++){alarm_out =~alarm_out;for(j=0;j<t;j++);}Delayms(2000);}}main(){lcd1602_init();ds18b20_init();ds1302_init();c02_init();while(1){if(done==1){keyjpress();}if(done==0){ //取得并显示日历和时间key_set_alarm();xianshi();alarm_ring();voice();}}}/****************************24C02C.h*****************************/ #ifndef _24c02#define _24c02#endif/*******************************************************************/ #define uchar unsigned char#define uint unsigned int/*************************DS18B20管脚配置***********************/ sbit sda = P1^4; //24c02数据输入输出sbit scl = P1^5; //24c02时钟void c02_delay(){ ;; }void start() //开始信号{sda=1;c02_delay();scl=1;c02_delay();sda=0;c02_delay();}void stop() //停止{sda=0;c02_delay();scl=1;c02_delay();sda=1;c02_delay();}void respons() //应答{uchar i;scl=1;c02_delay();while((sda==1)&&(i<250))i++; //如sda=0或i>250,,跳出scl=0;c02_delay();}void c_init(){sda=1;c02_delay();scl=1;c02_delay();}void c02_write_byte(uchar date) //写一字节{uchar i,temp;temp=date;for(i=0;i<8;i++){temp=temp<<1;scl=0;c02_delay();sda=CY;c02_delay();scl=1;c02_delay();}scl=0;c02_delay();sda=1;c02_delay();}uchar c02_read_byte() //读一字节{uchar i,k;scl=0;c02_delay();sda=1;c02_delay();for(i=0;i<8;i++){scl=1;c02_delay();k=(k<<1)|sda;scl=0;c02_delay();}return k;}void c02_write_add(uchar address,uchar date) //写{start();c02_write_byte(0xa0);respons();c02_write_byte(address);respons();c02_write_byte(date);respons();stop();}uchar c02_read_add(uchar address) //读{uchar date;start();c02_write_byte(0xa0);respons();c02_write_byte(address);respons();start();c02_write_byte(0xa1);respons();date=c02_read_byte();stop();return date;}六.调试与仿真系统的刚开始时的运行结果如图所示闹铃设置时的结果:闹铃开始时的结果:七.收获与存在的问题收获:存在的问题:八.期望成绩:我的期望成绩是:A+。

基于单片机AT89C51控制的电子时钟课程设计报告

基于单片机AT89C51控制的电子时钟课程设计报告

单片机电子时钟设计报告实现功能:显示时、分、秒,刚打开电源时,显示的数据为12:00:00,然后电路会自动开始计时。

电路中有时、分、秒各自单独的调整按钮,时间调整按钮每按一次,相应的显示时间加1。

所需材料:89C51单片机,多位数码管,数码管显示译码器74LS48,3线8线译码器74LS138,3个按钮,100Ω、22KΩ电阻若干,12MHZ晶振一个,30pf无极电容2个,10uf 有极电容一个,敷铜板。

电路设计:用P1端口的P1.0~P1.3来作为数码管显示数据的输出引脚,用P1.4~P1.6引脚作为3线8线译码器的控制输入引脚,用P0端口的P0.0~P0.2来分别作为时、分、秒的时间调整按钮。

当按下按钮时,相应的输入引脚上就会有低电平输入单片机。

3线8线译码器的控制端,Y0、Y1、Y2、Y3、Y4、Y5分别控制了数码管的显示控制线。

电路如下图1-1图1-1流程图:程序设计:ORG 00H 主程序起始地址JMP START 主程序STARTORG 0BH 定时器T0中断起始地址JMP TIM0 定时器T0中断子程序TIM0 START:MOV SP,#70H 设置堆栈指针MOV 28H,#00 设置显示位数扫描指针初值为0 MOV 2AH,#12H 设置时钟显示寄存器初值为12H MOV 2BH,#00 设置分钟显示寄存器初值为00H MOV 2CH,#00 设置秒钟显示寄存器初值为00H MOV TMOD,#01H 设置定时器T0工作在方式1 MOV TH0,#0F0H 定时4ms的初值,即0F060H MOV TL0,#60H 初值的低位MOV IE,#82H 定时器T0中断允许MOV R4,#250 保证后面实现中断250次,即1秒的延时SETB TR0 启动定时器T0LOOP:JB P0.0,N2 若没有按键,就转去下一步检查分CALL DELAY 延时5ms,消除抖动MOV A,2CH 将秒寄存器的值载入累加器AADD A,#01H A的内容加1DA A 十进制调整MOV 2CH,A A的值存入秒寄存器CJNE A,#60H,N1 看是否已经是60秒,若不是就继续检查MOV 2CH,#00 已经是60秒,就清空秒寄存器的值N1:JNB P0.0,$ 秒按键还没有放开就循环等待CALL DELAY 延时5ms,消除抖动N2:JB P0.1,N4 若分没有按键,就转去下一步检查分CALL DELAY 延时5ms,消除抖动MOV A,2BH 将分寄存器的值载入累加器AADD A,#01H A的内容加1DA A 十进制调整MOV 2BH,A A的值存入寄存器CJNE A,#60H,N3 看是否已经是60分,若不是就继续检查MOV 2BH,#00H 已经是60分,就清空寄存器的值N3:JNB P0.1,$ 分按键还没有放开就循环等待CALL DELAY 延时5ms,消除抖动N4:JB P0.2,LOOP 若时没有按键,就转回去继续检查看是否有按键CALL DELAY 延时5ms,消除抖动MOV A,2AH 将时寄存器的值载入累加器AADD A,#01H A的内容加1DA A 十进制调整MOV 2AH,A A的值存入时寄存器CJNE A,#24H,N5 看是否已经是24时,若不是就继续检查MOV 2AH,#00H 已经是24时,就清空是寄存器的值N5:JNB P0.2,$ 时钟按键还没有放开就循环等待CALL DELAY 延时5ms,消除抖动JMP LOOP 返回重新检查看是否有按键******定时器T0中断子程序*******TIM0:MOV TH0,#0F0H 定时初值重设MOV TL0,#60HPUSH ACC 将累加器A的值暂存于堆栈PUSH PSW 将PSW的值暂存于堆栈DJNZ R4,X2 计时中断不满1s就退出继续中断MOV R4,#250 计时1sCALL CLOCK 调用计时器子程序CLOCKCALL DISP 调用显示子程序DISPX2:CALL SCAN 调用扫描子程序SCANPOP PSW 到堆栈取回PSW的值POP ACC 到堆栈取回累加器ACC的值RETI 返回主程序******扫描子程序*******SCAN:MOV R0,#28HINC @R0 显示位数扫描值加1CJNE @R0,#6,X3 扫描位数不为6就准备控制输出MOV @R0,#0 扫描位数为6,就令其置为0X3:MOV A,@R0 扫描位数载入AADD A,#20H A加上20H(显示寄存器地址)=各时间显示区地址MOV R1,A 各时间显示区地址存入AMOV A,@R0 扫描位数存入ASWAP A 将A的高低4位交换(其高4位为扫描的位数,低4位为显示数值)ORL A,@R1 将扫描值与显示数据组合MOV P1,A 显示输出RET******计时子程序*******CLOCK:MOV A,2CH 秒寄存器值载入AADD A,#1 加1sDA A 十进制调整MOV 2CH,A A的值存入秒寄存器CJNE A,#60H,X4 A不等于60秒,就跳出程序去显示MOV 2CH,#00H 已经是60秒,就清0MOV A,2BH 分寄存器值载入AADD A,#1 加1分DA A 十进制调整MOV 2BH,A A的值存入分寄存器CJNE A,#60H,X4 A不等于60分,就跳出程序去显示MOV 2BH,#00H 已经是60分,就清0MOV A,2AH 时寄存器值载入AADD A,#1 加1小时DA A 十进制调整MOV 2AH,A A的值存入时寄存器CJNE A,#24H,X4 A不等于24时,就跳出程序去显示MOV 2AH,#00H 已经是24时,就清0X4:RET******显示子程序*******DISP:MOV R1,#20H 20H为显示寄存器单元MOV A,2CH 将秒寄存器的内容存入AMOV B,#10H 设B累加器的值为10HDIV AB A/B,商存入A(十位数),余数存入(个位数)MOV @R1,B 将显示的个位数存入20H显示寄存器单元INC R1MOV @R1,A 将显示的十位数存入21H显示寄存器单元INC R1MOV A,2BH 将分寄存器的内容存入AMOV B,#10H 设B累加器的值为10HDIV AB A/B,商存入A(十位数),余数存入(个位数)MOV @R1,B 将显示的个位数存入22H显示寄存器单元INC R1MOV @R1,A 将显示的十位数存入23H显示寄存器单元INC R1MOV A,2AH 将时寄存器的内容存入AMOV B,#10H 设B累加器的值为10HDIV AB A/B,商存入A(十位数),余数存入(个位数)MOV @R1,B 将显示的个位数存入24H显示寄存器单元INC R1MOV @R1,A 将显示的十位数存入25H显示寄存器单元RET******延时5ms消除抖动*******DELAY:MOV R6,#60D1:MOV R7,#248DJNZ R7,$DJNZ R6,D1RETEND原理图:PCB图:。

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

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

学号: 班级: 姓名:基于89C51单片机的电子闹钟设计一、设计要求(1)设计并实现一个具有计时功能的电子时钟系统,电子表的时间精确到秒,并可以显示年、月、日、时、分、秒。

(2)利用液晶显示器显示定时器的日期和时间。

(3)使用键盘进行设置时间和设置闹钟。

(4)定时时间到通过蜂鸣器报警和发光二极管闪烁通知,并持续60s 。

二、硬件设计(1)系统设计框图(2)选择硬件设备单片机:选择AT89C51;液晶显示器:具有16字符显示功能的1601 键盘:选择4行*4列的矩阵键盘 LED :选择红色的发光二极管 E 2PROM :X2545基本元件:蜂鸣器,电容,晶体振荡器 ,电阻,开关 电源:使用+5v 直流稳压源 基本模块的构成①时钟信号发生单元如右图2 利用晶振和电容以及单片机内部 电路,构成晶体并联振荡器,产 生12MHz 的时钟频率 ②复位电路如右图3利用一个简单的电容和按键实现*SI SO SCK CSR/S R/W E 单片机 89C51液晶显示蜂鸣器LED E 2PROM X2545 512*8bit键盘P2口P1口图1定时器系统框图数码管显示统P0口P3.0P3.6、P3.7基本模块图2时钟信号发生单元实现对系统的复位功能由此基本模块可以实现最小的单片机系统(3)电子时钟硬件原理图图4硬件电路原理电路(4)主要器件的原理①液晶显示原理液晶显示器种类繁多,按输出样式分为,图案式,数码式,点阵式。

本设计方案利用的是点阵式液晶显示器,而液晶驱动方式又和数码管驱动截然不同,虽然比数码管需要更小的工作电压,但是其结构所需要的扫描方式较数码管来说,是比较复杂的,而且输入输出数据速度慢,市场上是常用点阵式液晶驱动器的,常用的有1601、1602……,“16”代表显示字符共有几列,“01”、“02”代表输出字符共有几行。

下面是驱动1601的驱动方法。

驱动1601的一个很重要的方面就是液晶显示器的初始化,主要是利用控制、数据复用总线来输入指令,进行初始化。

基于89C51系列单片机的电子钟设计

基于89C51系列单片机的电子钟设计

目录1设计要求 (2)2设计方案和论证 (2)2.1总设计原理框图 (2)2.2设计方案的选择 (2)2.2.1计时方案 (2)2.2.2显示系统的方案 (3)3硬件部分 (3)3.1主要器件 (3)3.2 IO口分配说明 (3)3.3详细器件介绍 (4)3.3.1 STC89C51单片机介绍 (4)3.3.2电源 (6)3.3.3复位电路 (7)3.3.4 ULN2003(大电流驱动阵列) (7)3.3.5储存芯片:EEPROM (AT24C02) (8)3.3.6 PL2302(USB转RS232控制器) (8)3.3.7液晶显示1602 (10)3.3.8时钟芯片DS1302 (11)4 软件部分 (13)4.1主程序流程图 (13)4.2液晶初始化流程图 (14)4.3时间与日期显示流程图 (15)4.4温度显示流程图 (16)4.5键扫描流程图 (17)5调试和结果分析 (19)5.1调试 (19)5.2问题和结果分析 (20)6心得体会 (20)1.设计要求设计产品实现一个依据时段可变显示亮度电子钟,具体如下:(1)能够实现基本时钟的走时,显示范围是00:00:00——23:59:59。

能够实现时钟的调整, 通过按键可以对“时”位和“分”位进行加1调节,并能当加至最大值时能重新归零。

(2)能够实现当前室温的测量功能,并在数码管上予以显示(3)能够实现年月日的显示与切换。

(4)能够实现温度的显示与切换。

(5)能够实现根据时段自动改变显示亮度。

2.设计方案和论证本次设计时钟电路,使用了STC89C51单片机芯片控制电路,单片机控制电路简单且省去了很多复杂的线路,使得电路简明易懂,使用键盘键上的按键来调整时钟的时、分、秒、年、月、日、星期。

使用C 语言程序来控制整个时钟显示,主要这样通过四个模块:键盘、时钟芯片、温度传感器、1602lcd 显示即可满足设计要求。

2.1总设计原理框图 如下图所示:2.2 设计方案的选择2.2.1 计时方案方案一:采用实时时钟芯片现在市场上有很多实时时钟集成电路,如DS1287、DS12887、DS1302等。

基于AT89C51单片机的数字电子时钟设计

基于AT89C51单片机的数字电子时钟设计

/安徽工程大学机电学院单片机课程设计题目:数字电子时钟设计指导老师:***制作人员:范超学号:************班级:自动化2132日期:7月13日-7月24日总评成绩:课程任务设计书设计题目:数字电子时钟的设计设计任务:1.设计一款时,分,秒可调数字电子时钟可整点报时;2.设计三个按键K1,K2和K3,用于调节时钟的时间;3.用8个、七段LED数码管作为显示设备,开机显示00-00-00;本设计采用AT89C51单片机为核心器件。

具有电子钟显示,时间调整,整点报时等功能。

此数字钟是一个将“时”、“分”、“秒”显示于人的视觉器官的计时装置。

根据60秒为一分、60分为1小时的计数周期,构成秒、分、时的计数,实现计时的功能。

而且能显示清晰、直观的数字符号。

针对数字钟会产生误差的现象,就设计有校准时间的功能。

AT89C51单片机控制的数字钟的硬件结构与软件设计,给出了汇编语言源程序。

此数字钟是一个将“时”、“分”、“秒”显示于人的视觉器官的计时装置。

它的计时周期为24小时,显示满刻度为24时00分00秒,另外应有校时功能。

电路由时钟脉冲发生器、时钟计数器、译码驱动电路和数字显示电路以及时间调整电路组成。

用晶体振荡器产生时间标准信号,这里采用石英晶体振荡器。

根据60秒为1分、60分为1小时、24小时为1天的计数周期,分别组成两个60进制(秒、分)、一个24进制(时)的计数器。

显示器件选用LED八段数码管。

在译码显示电路输出的驱动下,显示出清晰、直观的数字符号。

针对数字钟会产生走时误差的现象,在电路中就设计有有校准时间功能的电路。

关键字:Proteus,Keil uVision,AT89C51,电子钟,整点报时摘要 (3)第1章概述 (5)1.1 设计背景 (5)1.2系统方案论证与设计 (5)第2章系统硬件设计 (7)2.1 系统总电路的设计 (7)2.1.1系统的总框图 ................................................................................................2.1.2芯片的选择 (7)2.2最小系统设计 (9)2.2.1时钟电路的选择与设计 (10)2.2.2复位电路的选择与设计 .............................................. 错误!未定义书签。

基于AT89C51控制的定时闹钟设计课程设计论文

基于AT89C51控制的定时闹钟设计课程设计论文

目录1 概述 (1)1.1 课程设计的目的和意义 (1)1.2 设计要求 (1)2 系统总体方案及硬件设计 (2)2.1 系统设计原理 (2)2.2 硬件设计 (2)2.2.1 单片机AT89C51 (2)2.2.2 显示器的选择 (4)2.2.3 控制按键的选择 (5)2.2.4 时钟电路 (6)2.2.5 喇叭:SPEAKER (6)3 系统软件设计 (8)3.1 系统软件设计说明 (8)3.2 程序流程图 (9)3.2.1 程序主流程图 (9)3.2.2 时间设定设计 (9)3.3 程序调试 (10)3.4 仿真步骤 (11)3.5 仿真结果 (11)4 课程设计体会 (15)参考文献 (16)附1源程序代码 (17)附2系统原理图 (30)1.概述1.1课程设计的目的和意义课程设计是在学完《单片机原理及接口技术》课程之后综合利用所学单片机知识完成一个单片机应用系统设计并在实验室实现,从而加深对单片机,软硬知识的理解,获得初步的应用经验,使对已学过的基础知识能有更深入的理解,学会独立思考、独立思考、独立工作,以及提高对所学应用基本理论分析和解决实际问题的能力。

为走出校门从事单片机应用的相关工作打下基础.1.2 设计要求1)能显示:时时—分分—秒秒。

2)能够设定定时时间、修改定时时间。

3)定时时间到能发出报警声。

设计的部分分为软件及硬件,软件部分写出闹钟的工作方式以及它是如何工作的,而硬件部分是软件的载体,画出正确的电路图然后在软件的控制下能使设计的定时闹钟正常工作。

2.系统总体方案及硬件设计2.1系统设计原理本设计使用的是单片机作为核心的控制元件,使得电路的可靠性比较高,功能也比较强大,而且可以随时的更新系统,进行不同状态的组合。

本系统采用单片机AT89C51作为本设计的核心元件,利用6位共阴数码管作为显示器件。

接入共阴LED显示器,可显示时,分钟,秒,单片机外围接有定时报警系统,时间的定时用时钟电路,修改时间和定时用手动按键控制,报警声通过喇叭发出。

AT89C51单片机电子时钟设计

AT89C51单片机电子时钟设计

AT89C51单片机电子时钟设计目录1 电子时钟 (4)1.1 电子时钟简介 (4)1.2 电子时钟的基本特点 (4)1.3 电子时钟的原理 (4)2 单片机识的相关知识 (4)2.1单片机简介 (4)2.2 单片机的特点 (5)2.3 AT89C51单片机介绍 (5)3 设计方案的选择 (7)3.1计时方案 (7)3.2 显示方案 (7)3.3 数码管显示工作原理 (8)3.4 键盘电路设计 (9)3.5 主控模块AT89C51 (9)4 系统软件设计 (9)附录 (12)摘要:单片机自20世纪70年代问世以来,以其极高的性能价格比,受到人们的重视和关注。

单片机体积小、重量轻、抗干扰能力强、环境要求不高、价格低廉、可靠性高、灵活性好、开发较为容易。

由于具有上述优点,单片机已广泛地应用在工业自动化控制、自动检测、智能仪器仪表、家用电器、电力电子、机电一体化设备等各个方面,而51单片机是各单片机中最为典型和最有代表性的一种。

这次设计通过对它的学习、应用,以AT89C51芯片为核心,辅以必要的电路,设计了一个简易的电子时钟,它由4.5V直流电源供电,通过数码管能够准确显示时间,调整时间,从而到达学习、设计、开发软、硬件的能力。

关键词:单片机;电子时钟;AT89C511 电子时钟1.1 电子时钟简介本设计采用AT89C51单片机,以汇编语言为程序设计的基础,设计一个用六位数码管显示时、分、秒的时钟。

现代的电子时钟是基于单片机的一种计时工具,采用延时程序产生一定的时间中断,用于一秒的定义,通过计数方式进行满六十秒分钟进一,满六十分小时进一,满二十四小时小时清零,从而达到计时的功能,是人民日常生活不可缺少的工具。

1.2 电子时钟的基本特点现在高精度的计时工具大多数都使用了石英晶体振荡器,由于电子钟、石英钟、石英表都采用了石英技术,因此走时精度高,稳定性好,使用方便,不需要经常调试,数字式电子钟用集成电路计时时,译码代替机械式传动,用LED显示器代替指针显示进而显示时间,减小了计时误差,这种表具有时、分、秒显示时间的功能,还可以进行时和分的校对,片选的灵活性好。

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

单片机课程设计题目名称:基于AT89C51的电子定时闹钟设计专业班级:测控1404学生姓名:高博学号:201423030418指导教师:郭广灵单片机系统课程设计任务书1 系统概述 (5)1.1单片机技术和数字钟简介 (5)1.2设计本电子定时闹钟的目的 (6)1.3本电子定时闹钟的功能和特点介绍 (6)2方案论证 (6)2.1总体方案 (6)2.2 AT89C51的优越性 (7)3硬件设计 (7)3.1系统的原理方框图 (7)3.2 主电路 (8)3.3 I/O分配 (8)3.4 I/O接线图 (9)4 软件设计 (10)4.1主流程 (10)4.2闹钟的实现 (11)5 系统调试 (11)6 设计心得 (12)7 参考文献 (13)8 源程序 (13)1 系统概述1.1单片机技术和数字钟简介单片机是单片微型计算机的简称,它是一种特殊的计算机。

它特别适合于控制领域,故又称为微控制器MCU(micro control unit). 采用了嵌入系统,通常由单块集成电路芯片组成,内部包含有计算机的基本功能部件:中央处理器CPU,存储器和I/O接口电路等。

单片机集成度高、功能强、通用性好,而且体积小、重量轻、能耗、低价格便宜,只要和适当的软件及硬件设备相结合,便可成为一个独立的单片机控制的功能系统,单片机也成为目前测量控制应用系统的优选机种和新电子产品的关键部件。

目前,单片机正朝着高性能和多品种方向发展趋势将是进一步向着CMOS化、低功耗、小体积、大容量、高性能、低价格和外围电路内装化等几个方面发展。

单片机应用的重要意义还在于,它从根本上改变了传统的控制系统设计思想和设计方法。

从前必须由模拟电路或数字电路实现的大部分功能,现在已能用单片机通过软件方法来实现了。

这种软件代替硬件的控制技术也称为微控制技术,和传统控制技术相比有革命性的进步。

时钟是将小时、分种、秒种显示于人的肉眼的计时装置。

而单片机模块中最常见的正是数字钟,数字钟是一种用数字电路技术实现时、分、秒计时的装置,与机械式时钟相比具有更高的准确性和直观性,且无机械装置,具有更更长的使用寿命,因此得到了广泛的使用。

而LCD电子定时闹钟是以单片机为基础的数字电路实现对小时、分钟、秒的数字显示的数字计时装置,它的计时周期为24小时,另外应有校时功能和一些显示日期、闹钟等附加功能。

一个基本的数字钟电路主要由译码显示器、“时”,“分”,“秒”,“星期”计数器、校时电路、报时电路和振荡器组成。

目前电子种广泛用于各种私人和公众场合,成为我们生活工作学习中不可缺少的好帮手。

由于时钟的实用性和在人们生活中的重要性,所以尝试设计以单片机为核心的数字时钟是很有意义的。

钟表原先的报时功能已经原不能满足人们日益增长的要求,现代的电子时钟多带有类似自动报警、按时自动打铃、时间程序自动控制、定时广播、自动起闭路灯、通断动力设备、甚至各种定时电气的自动启用等功能,本设计中LCD电子时钟采用LCD显示时间和日期年月,直观实用,而且可以方便的校调,附带的万年历和定时功能也是很方便和实用的.1.2设计本电子定时闹钟的目的①复习和巩固所学过的知识,利用此课程设计正好可以对所学习过的知识进行系统的回顾和总结②拓展知识面,课堂的知识是远远满足不了设计的要求的,这就需要我们去主动找寻更多的资料,了解更多的知识.③培养了设计能力和解决实际实际问题的能力,同时增强了自学能力,通过设计完整的单片机系统也初步掌握了组成系统、编程、调试等能力。

④通过本LCD电子种的设计初步了解了单片机应用系统开发研制过程,软件和硬件设计的方法。

1.3本电子定时闹钟的功能和特点介绍本电子定时闹钟是一种种基于单片机技术的多功能、多用途的电子产品,有电子时钟、日期显示、定时闹铃等多种功能。

本设计产品性能卓越,功能丰富,采用LCD显示更加直观,是一个比较实用的电子产品。

(1)可以显示24小时制“时时-分分-秒秒”,LCD显示。

(2)可以显示日期具有万年历功能(3)可以方便的设定定时时间、修改定时时间,闹铃功能,预设定时时间到将发出闹铃声.(4)能够修改时钟时间的时、分、秒,能够修改日期的年月日.2方案论证2.1总体方案使用是单片机作为核心的控制元件,使得电路的可靠性比较高,功能也比较强大,而且可以随时的更新系统,进行不同状态的组合。

本系统采用单片机AT89C51作为本设计的核心元件,利用7段共阴LED作为显示器件。

接入共阴LED显示器,可显示时,分钟,秒,单片机外围接有定时报警系统,定时时间到,扬声器发出报警声,提示预先设定时间电器的起停时间到,从而控制电器的起停。

电路由下列部分组成:时钟电路、复位电路、控制电路、LED显示,报警电路,芯片选用AT89C51 单片机。

2.2 AT89C51的优越性AT89C51是一个低电压,高性能CMOS型8位单片机,片内含4KB的可反复擦写的Flash只读程序存储器(ROM)和128 B的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器和Flash存储单元,内置功能强大的微型计算机的AT89C51提供了高性价比的解决方案。

AT89C51是一个低功耗高性能单片机,40个引脚,32个外部双向输入/输出(I/O)端口,同时内含2个外中断口,2个16位可编程定时计数器,2个全双工串行通信口,AT89C51可以按照常规方法进行编程,也可以在线编程。

其将通用的微处理器和Flash存储器结合在一起,特别是可反复擦写的Flash存储器可有效地降低开发成本。

3硬件设计3.1系统的原理方框图图1:硬件电路概念图图2:硬件电路概念示意图3.2 主电路图3 电路设计图3.3 I/O分配89C51单片机有4个8位的并行I/O口:P0口,P1口,P2口和P3口。

各个接口均由接口锁存器,输出驱动器,和输入缓冲器组成。

P1口是唯一的单功能口,仅能用作通用的数据输入/输出口。

P3口是双功能口除了具有数据输入/输出功能外,每条接口还具有不同的第二功能,如P3.0是串行输入口线,P3.1口是串行输出口线。

在需要外部程序存储器和数据存储器扩展时,P0可作为分时复用的低8位地址/数据总线,P2口可作为高8位的地址总线。

P3口也可作为AT89C51的一些特殊功能口,同时为闪烁编程和编程校验接收一些控制信号。

VDD:电源正极,4.5-5.5V,通常使用5V电压;VL:LCD对比度调节端,电压调节范围为0-5V。

接正电源时对比度最弱,接地电源时对比度最高,但对比度过高时会产生“鬼影”,因此通常使用一个10K 的电位器来调整对比度,或者直接串接一个电阻到地;RS:MCU写入数据或者指令选择端。

MCU要写入指令时,使RS为低电平;MCU 要写入数据时,使RS为高电平;R/W:读写控制端。

R/W为高电平时,读取数据;R/W为低电平时,写入数据;E:LCD模块使能信号控制端。

写数据时,需要下降沿触发模块。

D0-D7:8位数据总线,三态双向。

如果MCU的I/O口资源紧张的话,该模块也可以只使用4位数据线D4-D7接口传送数据。

本充电器就是采用4位数据传送方式;BLA:LED背光正极。

需要背光时,BLA串接一个限流电阻接VDD,BLK接地,实测该模块的背光电流为50mA左右;BLK:LED背光地端。

3.4 I/O接线图4 软件设计4.14.2闹钟的实现闹钟功能的实现涉及到两个方面:闹铃时间设定和是否闹铃判别与相应处理。

闹铃时间设定模块的设计可参照时间设定模块,这里着重阐述闹铃判别与处理模块的设计问题。

闹铃判别与闹铃处理的关键在于判别何时要进行闹铃。

当时十位、时个位、分十位、分个位中任一位发生改变(进位)时,就必须进行闹铃判别。

程序设计思想如图。

图8:程序设计思路图5 系统调试打开ISIS 7professional软件,点击上面的调试,把源程序运行后得到的hex文件写入单片机c51中,然后开始调试。

经过反复的防真和调试,此闹钟可以实现所有的功能,既可以显示日期时间,也可以方便的调整日期和时间,定闹钟的功能也正常。

6 设计心得单片机是计算机技术发展的产物,是经济实用开发简便的高科技产品,在当今工业控制、家电等领域占据广泛的市场。

通过此次单片机课程设计来设计个简单的数字闹钟,我巩固了自己学习的单片机知识,来初步了解了小型单片机系统的设计和运用,并提高自己实际动手能力。

,课程设计过程也使我了解了自己能力的不足,不过通过资料收集和文献查询等方法,找出了设计过程中的一些问题以及解决问题的方法,从而比较顺利的完成了这个设计任务。

这次自己所做的设计取得了一些宝贵的经验,提高了自己的动手能力,为将来的学习和工作很有好处。

通过这次课程设计我学到了很多全新的在课堂上没法学到的知识,同时也加深了以前所学知识的理解,也增强了理论联系实际的操作能力。

但是,在实际的编程以及调试程序过程中,我发现自己应该学的还有太多太多。

光靠书本上是远远行不通的!总之,理论必须和实际结合才有威力,知识必须通过应用才能实现其价值!所学的东西最终是要面向社会,是在以后的工作能够更好的应用,此时的知识积累是为以后的工作做好坚实的基础。

7 参考文献[1]余发山.单片机原理及应用技术.中国矿业大学出版社。

[2]孙涵芳.MCS-51系列单片机原理及应用[M] .北京:北京航空航天大学出版社.1996-4。

[3]王义军.单片机原理及应用习题与实验指导书[M].北京:中国电力出版社,2006。

[4]陈明荧.8051单片机课程设计实训教材[M].北京,清华大学出版社,2004[5]唐前辉、丁明亮. 重庆电专PROTEUS中文入门教程。

8 源程序/****************************************************************************** ** 实验名 : 定时器实验* 使用的IO :* 实验效果 :1602显示时钟,按K3进入时钟设置,按K1选择设置的时分秒,按K2选择*选择设置加1。

* 注意:******************************************************************************* /#include<reg51.h>#include"lcd.h"sbit K1=P3^0;sbit K2=P3^1;sbit K3=P3^2;sbit K4=P3^3;unsigned char Time;//用来计时间的值void Delay1ms(unsigned int c);void TimerConfiguration();void Int0Configuration();unsigned char SetPlace;/****************************************************************************** ** 函数名 : main* 函数功能 : 主函数* 输入 : 无* 输出 : 无******************************************************************************* /void main(void){unsigned char hour,minit,second;unsigned int i;TimerConfiguration();Int0Configuration();LcdInit();hour=12;LcdWriteData('0'+hour/10);LcdWriteData('0'+hour%10);LcdWriteData('-');LcdWriteData('0'+minit/10);LcdWriteData('0'+minit%10);LcdWriteData('-');LcdWriteData('0'+second/10);LcdWriteData('0'+second%10);while(1){if(TR0==0){if(K1==0) //检测按键K2是否按下{Delay1ms(10); //消除抖动if(K1==0){SetPlace++;if(SetPlace>=3)SetPlace=0;}while((i<50)&&(K1==0)) //检测按键是否松开{Delay1ms(1);i++;}i=0;}if(K2==0) //检测按键K3是否按下{Delay1ms(10); //消除抖动if(K2==0){if(SetPlace==0){second++;if(second>=60)second=0;}else if(SetPlace==1){minit++;if(minit>=60)minit=0;}else{hour++;if(hour>=24)hour=0;}}while((i<50)&&(K2==0)) //检测按键是否松开{Delay1ms(1);i++;}i=0;}}if(Time>=20) //一秒钟来到改变数值{Time=0;second++;if(second==60){second=0;minit++;if(minit==60){minit=0;hour++;if(hour==24){hour=0;}}}}//--显示时钟--//LcdWriteCom(0x80);LcdWriteData('0'+hour/10);LcdWriteData('0'+hour%10);LcdWriteCom(0x83);LcdWriteData('0'+minit/10);LcdWriteData('0'+minit%10);LcdWriteCom(0x86);LcdWriteData('0'+second/10);LcdWriteData('0'+second%10);}}/****************************************************************************** ** 函数名 : Delay1ms()* 函数功能 : 延时1ms* 输入 : c* 输出 : 无******************************************************************************* /void Delay1ms(unsigned int c) //误差 0us{unsigned char a,b;for (; c>0; c--){for(b=199;b>0;b--){for(a=1;a>0;a--);}}}/****************************************************************************** ** 函数名 : TimerConfiguration()* 函数功能 : 配置定时器值* 输入 : 无* 输出 : 无******************************************************************************* /void TimerConfiguration(){TMOD = 0x01; //选择工作方式1TH0 = 0x3C; //设置初始值TL0 = 0x0B0;EA = 1; //打开总中断ET0 = 1; //打开定时器0中断TR0 = 1; //启动定时器0}/****************************************************************************** ** 函数名 : Timer0()* 函数功能 : 定时器0中断函数* 输入 : 无* 输出 : 无******************************************************************************* /void Timer0() interrupt 1{TH0 = 0x3C; //设置初始值TL0 = 0x0B0;Time++;}/****************************************************************************** ** 函数名 : Int0Configuration()* 函数功能 : 配置外部中断0* 输入 : 无* 输出 : 无******************************************************************************* /void Int0Configuration(){//设置INT0IT0=1;//跳变沿出发方式(下降沿)EX0=1;//打开INT0的中断允许。

相关文档
最新文档