以AT89C51单片机为核心,制作一个LCD显示的智能电子钟

合集下载

以AT89C51单片机为核心,制作一个LCD显示的智能电子钟

以AT89C51单片机为核心,制作一个LCD显示的智能电子钟

第6章智能电子钟的设计6.1 功能要求1. 设计要求以AT89C51单片机为核心,制作一个LCD显示的智能电子钟:(1) 计时:秒、分、时、天、周、月、年。

(2) 闰年自动判别。

(3) 五路定时输出,可任意关断(最大可到16路)。

(4) 时间、月、日交替显示。

(5) 自定任意时刻自动开/关屏。

(6) 计时精度:误差≤1秒/月(具有微调设置)。

(7) 键盘采用动态扫描方式查询。

所有的查询、设置功能均由功能键K1、K2完成。

2. 工作原理本设计采用市场上流行的时钟芯片DS1302进行制作。

DS1302是DALLAS公司推出的涓流充电时钟芯片,内含一个实时时钟/日历和31字节静态RAM,可以通过串行接口与计算机进行通信,使得管脚数量减少。

实时时钟/日历电路能够计算2100年之前的秒、分、时、日、星期、月、年的,具有闰年调整的能力。

DS1302时钟芯片的主要功能特性:(1) 能计算2100年之前的年、月、日、星期、时、分、秒的信息;每月的天数和闰年的天数可自动调整;时钟可设置为24或12小时格式。

(2) 31B的8位暂存数据存储RAM。

(3) 串行I/O口方式使得引脚数量最少。

(4) DS1302与单片机之间能简单地采用同步串行的方式进行通信,仅需3根线。

(5) 宽范围工作电压2.0-5.5V。

(6) 工作电流为2.0A时,小于300nA。

(7) 功耗很低,保持数据和时钟信息时功率小于1mW。

6.2 方案论证6.3 系统硬件电路的设计……6.4 系统程序的设计#include<reg51.h>#include<lcd.h>#include<ds1302.h>#define uchar unsigned char #define uint unsigned intsbit key1=P3^0;//设置键sbit key2=P3^3;//调节键加sbit key3=P3^6;//设置键减uchar second,minute,hour;uchar day,week,month,year;uchar pos_flag=0;uchar keyflag=0;//按键标志位//函数声明uchar read1302(uchar add); //读地址、数据void write1302(uchar add,uchar date); //写入地址、数据void write_com_date(uchar add,uchar date);void init_lcd();void init_ds1302();void delay(uchar time);void Disp_1602(uchar x,uchar y,uchar *p);void keyscan();void settime();void settime(){write1302(0x8e,0x00); //关闭写保护write1302(0x80,second/10*16+second%10); //秒write1302(0x82,minute/10*16+minute%10); //分write1302(0x84,hour/10*16+hour%10); //时write1302(0x86,day/10*16+day%10); //日write1302(0x88,month/10*16+month%10); //月write1302(0x8a,week/10*16+week%10); //星期write1302(0x8c,year/10*16+year%10); //年write1302(0x8e,0x80);}void display(){second=read1302(0x81);write_com_date(0xca,0x30+second%10); write_com_date(0xc9,0x30+second/10);minute=read1302(0x83);write_com_date(0xc7,0x30+minute%10); write_com_date(0xc6,0x30+minute/10);hour=read1302(0x85);write_com_date(0xc4,0x30+hour%10);write_com_date(0xc3,0x30+hour/10);day=read1302(0x87);write_com_date(0x8a,0x30+day%10);write_com_date(0x89,0x30+day/10);week=read1302(0x8b);write_com_date(0xcd,0x30+week%10);month=read1302(0x89);write_com_date(0x87,0x30+month%10);write_com_date(0x86,0x30+month/10);year=read1302(0x8d);write_com_date(0x84,0x30+year%10);write_com_date(0x83,0x30+year/10);}void keyscan() //修改调整时间日期{if(key1==0){delay(10);if(key1==0){pos_flag++;while(!key1);keyflag=1;switch(pos_flag){case 1:write_com(0x80+4); //年write_com(0x0f); //光标闪烁break;case 2:write_com(0x80+7); //月break;case 3:write_com(0x80+10); //日break;case 4:write_com(0x80+0x40+0x0d); //星期break;case 5:write_com(0x80+0x40+4); //时钟break;case 6:write_com(0x80+0x40+7); //分钟break;case 7:write_com(0x80+0x40+10); //秒钟break;default:break;}if(pos_flag==8) //pos_flag=8则退出调整{pos_flag=0;keyflag=0; //按键标识清零delay(5);settime();write_com(0x0c); // 关光标}}}if(key2==0) //调节加键,按下(低电平)就加 {delay(15);if(key2==0){while(!key2);switch(pos_flag){case 1:year++;if(year==99)year=0;write_com_date(0x84,0x30+year%10);write_com_date(0x83,0x30+year/10);break;case 2:month++;if(month==13)month=1;write_com_date(0x87,0x30+month%10);write_com_date(0x86,0x30+month/10);break;case 3:day++;if((year%4==0)&&(month==2)) //闰年二月 29天{if(day==30)day=1;}if((year%4!=0)&&(month==2)) //平年二月 28天{if(day==29)day=1;}if(month==1||month==3||month==5||month==7||month==8||month==10||month==12) //大月31天{if(day==32)day=1;}if(month==4||month==6||month==9||month==11) //小月30天{if(day==31)day=1;}write_com_date(0x8a,0x30+day%10);write_com_date(0x89,0x30+day/10);break;case 4:week++;if(week==8)week=1;write_com_date(0xcd,0x30+week);break;case 5:hour++;if(hour==24)write_com_date(0xc4,0x30+hour%10);write_com_date(0xc3,0x30+hour/10);break;case 6:minute++;if(minute==60)minute=0;write_com_date(0xc7,0x30+minute%10);write_com_date(0xc6,0x30+minute/10);break;case 7:second++;if(second==60)second=0;write_com_date(0xca,0x30+second%10);write_com_date(0xc9,0x30+second/10);break;default:break;}}}if(key3==0){delay(15);if(key3==0){while(!key3);switch(pos_flag){case 1:year--;if(year==0)write_com_date(0x84,0x30+year%10);write_com_date(0x83,0x30+year/10);break;case 2:month--;if(month==0)month=12;write_com_date(0x87,0x30+month%10);write_com_date(0x86,0x30+month/10);break;case 3:day--;if((year%4==0)&&(month==2)) //闰年二月 29天{if(day==0)day=29;}if((year%4!=0)&&(month==2)) //平年二月 28天{if(day==0)day=28;}if(month==1||month==3||month==5||month==7||month==8||month==10||month==12) //大月31天{if(day==0)day=31;}if(month==4||month==6||month==9||month==11) //小月30天{if(day==0)day=30;}write_com_date(0x8a,0x30+day%10);write_com_date(0x89,0x30+day/10);break;case 4:week--;if(week==0)week=7;write_com_date(0xcd,0x30+week);break;case 5:hour--;if(hour==0)hour=24;write_com_date(0xc4,0x30+hour%10);write_com_date(0xc3,0x30+hour/10);break;case 6:minute--;if(minute==0)minute=59;write_com_date(0xc7,0x30+minute%10);write_com_date(0xc6,0x30+minute/10);break;case 7:second--;if(second==0)second=59;write_com_date(0xca,0x30+second%10);write_com_date(0xc9,0x30+second/10);break;default:break;}}}}void main(){init_lcd();delay(2);init_ds1302();delay(2);Disp_1602(1,0,"20 - - week") ; Disp_1602(5,1,": :") ;while(1){if(keyflag==0){display();}keyscan();}}#ifndef _lcd_h_#define _lcd_h_#include <reg51.h>#define uchar unsigned char#define uint unsigned intsbit lcdrs=P2^0;sbit lcdrw=P2^1;sbit lcden=P2^2;void delay(uchar ms){uchar i;for(;ms>0;ms--)for(i=110;i>0;i--);}void write_com(uchar com) //写指令{lcden=0;lcdrs=0;lcdrw=0;P0=com;delay(1);lcden=1;delay(1);lcden=0;}void write_data(uchar date) //写数据{lcden=0;lcdrs=1;lcdrw=0;P0=date;delay(1);lcden=1;delay(1);lcden=0;}void write_com_date(uchar add,uchar date) {write_com(add);delay(1);write_data(date);}void Disp_1602(uchar x,uchar y,uchar *p) {while(*p){if(y==0) x|=0x80;else x|=0xc0;write_com(x);delay(5);write_data(*p);x++;p++;}}void init_lcd(){delay(15);write_com(0x38);delay(15);write_com(0x38);delay(5);write_com(0x38);write_com(0x0c);write_com(0x06);write_com(0x01);}#endif#ifndef _ds1302_h_#define _ds1302_h_#include <reg51.h>#define uchar unsigned char#define uint unsigned intsbit sclk=P1^1;sbit io=P1^0;sbit rst=P1^2;sbit ACC_7=ACC^7;void write1302(uchar add,uchar date) //写入地址、数据{uchar i;rst=0;sclk=0;rst=1;for(i=0;i<8;i++){sclk=0;io=add&0x01;add>>=1;sclk=1;}for(i=0;i<8;i++){sclk=0;io=date&0x01;date>>=1;sclk=1;}rst=0;}uchar read1302(uchar add) //读地址、数据{uchar i,dat1,dat2;rst=0;sclk=0;rst=1;for(i=0;i<8;i++){sclk=0;io=add&0x01;add>>=1;sclk=1;}for(i=0;i<8;i++){ACC_7=io;sclk=1;ACC>>=1;sclk=0;}rst=0;sclk=1;dat1=ACC;dat2=dat1/16;dat1=dat1%16;dat1=dat2*10+dat1;return dat1;}void init_ds1302(){if(((read1302(0x81))&0x0f)==1){write1302(0x8e,0x00); //关闭写保护}}#endif……6.5调试及性能分析6.5.1 调试与测试……6.5.2 性能分析。

基于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)//控制液晶模块//控制蜂鸣器//控制按键开关//...}```在具体的代码实现中,我们需要根据液晶模块、蜂鸣器和按键开关等外设的具体规格和功能来编写相应的代码。

LCD显示的定时闹钟设计方案

LCD显示的定时闹钟设计方案

LCD显示的定时闹钟设计方案1.设计要求使用AT89C51单片机结合字符型LCD显示器设计一个简易的定时闹钟LCD 时钟,若LCD选择有背光显示的模块,在夜晚或黑暗的场合中也可使用。

定时闹钟的基本功能如下:显示格式为“时时:分分”。

由LED闪动来做秒计数表示。

一旦时间到则发出声响,同时继电器启动,可以扩充控制家电开启和关闭。

程序执行后工作指示灯LED闪动,表示程序开始执行,LCD显示“ 00:00”,按下操作键K1〜K4动作如下:(1)K1 —设置现在的时间。

(2)K2 —显示闹钟设置的时间。

(3)K3 —设置闹铃的时间。

⑷K4 —闹铃ON/OFF勺状态设置,设置为ON时连续三次发出“哗”的一声,设置为OFF发出“哗”的一声。

设置当前时间或闹铃时间如下。

(1)K1 —时调整。

(2)K2 —分调整。

(3)K3 —设置完成。

(4)K4 —闹铃时间到时,发出一阵声响,按下本键可以停止声响。

本项目的难点在于4 个按键每个都具有两个功能,以最终实现菜单化的输入功能。

采用通过逐层嵌套的循环扫描,实现嵌套式的键盘输入。

2.设计方案2.1 原理本LCD定时闹钟,是以单片机及外围接口电路为核心硬件,辅以其他外围硬件电路,用汇编语言设计的程序来实现的。

根据C51单片机的外围接口特点扩展相应的硬件电路,然后根据单片机的指令设计出数字钟相应的软件,再利用软件执行一定的程序来实现数字钟的功能。

由于采用集成芯片性的单片机来制作电子钟,这样设计制作简单而且功能多、精确度高,也可方便扩充其他功能,实现也十分简单。

本设计是利用AT89C51单片机为主控芯片,由LCD晶振、电阻、电容、发光二极管、开关、喇叭等元件组成硬件电路,通过编写软件程序来实现和控制的数字定时闹钟2.2系统总框图2.3原理及工作过程说明(1)定时闹钟的基本功能如下:(a)启动仿真软件,使用LCD液晶显示器来显示现在的时间。

(b)程序执行之后显示“ 00:00”并且LED闪烁,表示开始已经计时。

昆明学院单片机实训基于AT89C51单片机,制作一个LED显示的智能电子钟。

昆明学院单片机实训基于AT89C51单片机,制作一个LED显示的智能电子钟。

《单片机原理及应用》课程设计报告课题名称L E D电子时钟学院自动控制与机械工程学院专业电气工程及其自动化班级2013级2班学号姓名时间2015年7月3日目录一、设计目的及要求 (3)1、设计题目: (3)2、设计任务: (3)3、设计要求: (3)二、系统设计 (3)三、硬件设计: (4)1、单片机最小系统——AT89C51 (4)2、 LED数码管显示模块 (4)3、晶振模块: (5)4、按键模块: (5)四、软件设计: (6)1、Protues软件的介绍: (6)2、程序设计流程图 (7)3、软件仿真结果 (8)五、程序设计 (10)六、设计总结 (10)一、设计目的及要求1、设计题目:LED显示的电子钟2、设计任务:基于AT89C51单片机,制作一个LED显示的智能电子钟。

3、设计要求:(1)、用6个7段LED数码管作为显示设备,设计时钟功能。

(2)、显示格式,日期:YY MM DD,时间:HH MM SS.(3)、可以分别设计年、月、日,时、分、秒。

在复位后的日期应该为:12 01 01,时间为:00 00 00。

(4)、秒钟复位功能,当秒位键按下后,秒的那位回到00 。

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

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

二、系统设计设计中采用AT89C51芯片及LED显示器,一些独立式按键构成一个简单的数字电子钟。

设计中是采用单片机的内部定时器进行定时,程序框图如图2.1所示:图2.1系统框图整个电子钟的工作原理是:在正常的供电状态下,首先利用单片机定时,到了相应的时间由单片机将所需要显示的数据送到LED显示器的输入口,当有键按下时则进入相应的按键显示和调整状态,进行按键调整。

三、硬件设计:硬件设计是指应用系统的电路设计,包括单片机芯片、控制电路、存储器、I/O 接口等等。

硬件设计时,应考虑留有充分余量,电路设计力求无误,因为在系统调试中不易修改硬件结构。

电子时钟基于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单片机的电子钟设计

目录一、内容提要 (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 接口。

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

第6章智能电子钟的设计6.1 功能要求1. 设计要求以AT89C51单片机为核心,制作一个LCD显示的智能电子钟:(1) 计时:秒、分、时、天、周、月、年。

(2) 闰年自动判别。

(3) 五路定时输出,可任意关断(最大可到16路)。

(4) 时间、月、日交替显示。

(5) 自定任意时刻自动开/关屏。

(6) 计时精度:误差≤1秒/月(具有微调设置)。

(7) 键盘采用动态扫描方式查询。

所有的查询、设置功能均由功能键K1、K2完成。

2. 工作原理本设计采用市场上流行的时钟芯片DS1302进行制作。

DS1302是DALLAS公司推出的涓流充电时钟芯片,内含一个实时时钟/日历和31字节静态RAM,可以通过串行接口与计算机进行通信,使得管脚数量减少。

实时时钟/日历电路能够计算2100年之前的秒、分、时、日、星期、月、年的,具有闰年调整的能力。

DS1302时钟芯片的主要功能特性:(1) 能计算2100年之前的年、月、日、星期、时、分、秒的信息;每月的天数和闰年的天数可自动调整;时钟可设置为24或12小时格式。

(2) 31B的8位暂存数据存储RAM。

(3) 串行I/O口方式使得引脚数量最少。

(4) DS1302与单片机之间能简单地采用同步串行的方式进行通信,仅需3根线。

(5) 宽范围工作电压2.0-5.5V。

(6) 工作电流为2.0A时,小于300nA。

(7) 功耗很低,保持数据和时钟信息时功率小于1mW。

6.2 方案论证6.3 系统硬件电路的设计……6.4 系统程序的设计#include<reg51.h>#include<lcd.h>#include<ds1302.h>#define uchar unsigned char #define uint unsigned intsbit key1=P3^0;//设置键sbit key2=P3^3;//调节键加sbit key3=P3^6;//设置键减uchar second,minute,hour;uchar day,week,month,year;uchar pos_flag=0;uchar keyflag=0;//按键标志位//函数声明uchar read1302(uchar add); //读地址、数据void write1302(uchar add,uchar date); //写入地址、数据void write_com_date(uchar add,uchar date);void init_lcd();void init_ds1302();void delay(uchar time);void Disp_1602(uchar x,uchar y,uchar *p);void keyscan();void settime();void settime(){write1302(0x8e,0x00); //关闭写保护 write1302(0x80,second/10*16+second%10); //秒write1302(0x82,minute/10*16+minute%10); //分write1302(0x84,hour/10*16+hour%10); //时write1302(0x86,day/10*16+day%10); //日write1302(0x88,month/10*16+month%10); //月write1302(0x8a,week/10*16+week%10); //星期write1302(0x8c,year/10*16+year%10); //年write1302(0x8e,0x80);}void display(){second=read1302(0x81);write_com_date(0xca,0x30+second%10);write_com_date(0xc9,0x30+second/10);minute=read1302(0x83);write_com_date(0xc7,0x30+minute%10); write_com_date(0xc6,0x30+minute/10);hour=read1302(0x85);write_com_date(0xc4,0x30+hour%10);write_com_date(0xc3,0x30+hour/10);day=read1302(0x87);write_com_date(0x8a,0x30+day%10);write_com_date(0x89,0x30+day/10);week=read1302(0x8b);write_com_date(0xcd,0x30+week%10);month=read1302(0x89);write_com_date(0x87,0x30+month%10);write_com_date(0x86,0x30+month/10);year=read1302(0x8d);write_com_date(0x84,0x30+year%10);write_com_date(0x83,0x30+year/10);}void keyscan() //修改调整时间日期{if(key1==0){delay(10);if(key1==0){pos_flag++;while(!key1);keyflag=1;switch(pos_flag){case 1:write_com(0x80+4); //年write_com(0x0f); //光标闪烁break;case 2:write_com(0x80+7); //月break;case 3:write_com(0x80+10); //日break;case 4:write_com(0x80+0x40+0x0d); //星期break;case 5:write_com(0x80+0x40+4); //时钟break;case 6:write_com(0x80+0x40+7); //分钟break;case 7:write_com(0x80+0x40+10); //秒钟break;default:break;}if(pos_flag==8) //pos_flag=8则退出调整{pos_flag=0;keyflag=0; //按键标识清零delay(5);settime();write_com(0x0c); // 关光标}}}if(key2==0) //调节加键,按下(低电平)就加{delay(15);if(key2==0){while(!key2);switch(pos_flag){case 1:year++;if(year==99)year=0;write_com_date(0x84,0x30+year%10);write_com_date(0x83,0x30+year/10);break;case 2:month++;if(month==13)month=1;write_com_date(0x87,0x30+month%10);write_com_date(0x86,0x30+month/10);break;case 3:day++;if((year%4==0)&&(month==2)) //闰年二月29天{if(day==30)day=1;}if((year%4!=0)&&(month==2)) //平年二月28天{if(day==29)day=1;}if(month==1||month==3||month==5||month==7||month==8||month==10||month==12) //大月31天{if(day==32)day=1;}if(month==4||month==6||month==9||month==11) //小月30天{if(day==31)day=1;}write_com_date(0x8a,0x30+day%10);write_com_date(0x89,0x30+day/10);break;case 4:week++;if(week==8)week=1;write_com_date(0xcd,0x30+week);break;case 5:hour++;hour=0;write_com_date(0xc4,0x30+hour%10);write_com_date(0xc3,0x30+hour/10);break;case 6:minute++;if(minute==60)minute=0;write_com_date(0xc7,0x30+minute%10);write_com_date(0xc6,0x30+minute/10);break;case 7:second++;if(second==60)second=0;write_com_date(0xca,0x30+second%10);write_com_date(0xc9,0x30+second/10);break;default:break;}}}if(key3==0){delay(15);if(key3==0){while(!key3);switch(pos_flag){case 1:year--;year=99;write_com_date(0x84,0x30+year%10);write_com_date(0x83,0x30+year/10);break;case 2:month--;if(month==0)month=12;write_com_date(0x87,0x30+month%10);write_com_date(0x86,0x30+month/10);break;case 3:day--;if((year%4==0)&&(month==2)) //闰年二月29天{if(day==0)day=29;}if((year%4!=0)&&(month==2)) //平年二月28天{if(day==0)day=28;}if(month==1||month==3||month==5||month==7||month==8||month==10||month==12) //大月31天{if(day==0)day=31;}if(month==4||month==6||month==9||month==11) //小月30天{if(day==0)}write_com_date(0x8a,0x30+day%10);write_com_date(0x89,0x30+day/10);break;case 4:week--;if(week==0)week=7;write_com_date(0xcd,0x30+week);break;case 5:hour--;if(hour==0)hour=24;write_com_date(0xc4,0x30+hour%10);write_com_date(0xc3,0x30+hour/10);break;case 6:minute--;if(minute==0)minute=59;write_com_date(0xc7,0x30+minute%10);write_com_date(0xc6,0x30+minute/10);break;case 7:second--;if(second==0)second=59;write_com_date(0xca,0x30+second%10);write_com_date(0xc9,0x30+second/10);break;default:break;.}}}}void main(){init_lcd();delay(2);init_ds1302();delay(2);Disp_1602(1,0,"20 - - week") ;Disp_1602(5,1,": :") ;while(1){if(keyflag==0){display();}keyscan();}}#ifndef _lcd_h_#define _lcd_h_#include <reg51.h>#define uchar unsigned char#define uint unsigned intsbit lcdrs=P2^0;sbit lcdrw=P2^1;sbit lcden=P2^2;void delay(uchar ms){uchar i;for(;ms>0;ms--)for(i=110;i>0;i--);}void write_com(uchar com) //写指令{lcden=0;lcdrs=0;lcdrw=0;P0=com;delay(1);lcden=1;delay(1);lcden=0;}void write_data(uchar date) //写数据{lcden=0;lcdrs=1;lcdrw=0;delay(1);lcden=1;delay(1);lcden=0;}void write_com_date(uchar add,uchar date) {write_com(add);delay(1);write_data(date);}void Disp_1602(uchar x,uchar y,uchar *p) {while(*p){if(y==0) x|=0x80;else x|=0xc0;write_com(x);delay(5);write_data(*p);x++;p++;}}void init_lcd(){delay(15);write_com(0x38);delay(15);write_com(0x38);write_com(0x38);write_com(0x0c);write_com(0x06);write_com(0x01);}#endif#ifndef _ds1302_h_#define _ds1302_h_#include <reg51.h>#define uchar unsigned char#define uint unsigned intsbit sclk=P1^1;sbit io=P1^0;sbit rst=P1^2;sbit ACC_7=ACC^7;void write1302(uchar add,uchar date) //写入地址、数据{uchar i;rst=0;sclk=0;rst=1;for(i=0;i<8;i++){sclk=0;io=add&0x01;add>>=1;sclk=1;}for(i=0;i<8;i++){sclk=0;io=date&0x01;date>>=1;sclk=1;}rst=0;}uchar read1302(uchar add) //读地址、数据{uchar i,dat1,dat2;rst=0;sclk=0;rst=1;for(i=0;i<8;i++){sclk=0;io=add&0x01;add>>=1;sclk=1;}for(i=0;i<8;i++){ACC_7=io;sclk=1;ACC>>=1;sclk=0;}rst=0;sclk=1;dat1=ACC;dat2=dat1/16;dat1=dat1%16;dat1=dat2*10+dat1;return dat1;}void init_ds1302(){if(((read1302(0x81))&0x0f)==1){write1302(0x8e,0x00); //关闭写保护 }}#endif……6.5调试及性能分析6.5.1 调试与测试……6.5.2 性能分析。

相关文档
最新文档