以AT89C51单片机为核心,制作一个LCD显示的智能电子钟
电子时钟LCD显示课程设计
题目2 电子时钟(LCD 显示) 1. 设计要求以AT89C51单片机为核心的时钟,在LCD 显示器上显示当前的时刻: 利用字符型LCD 显示器显示当前时刻。
显示格式为“不时:分分:秒秒”。
用4个功能键操作来设置当前时刻。
功能键K1~K4功能如下。
K1—进入设置此刻的时刻。
K2—加1 。
K3—减1。
K4—确认完成设置。
程序执行后工作指示灯LED 闪动,表示程序开始执行,LCD 显示“00:00:00”,然后开始计时。
1.时钟的整体设计思路依照系统的设计功能要求,本时钟系统的设计必需采用单片机软件系统实现,用单片机的自动控制能力配合按键控制,来控制时钟的调整及显示。
图一系统总原理图3.系统硬件设计 单片机控制系统本次设计时钟电路,利用了ATC89C51单片机芯片控制电路,单片机控制电路简单且省去了很多复杂的线路,使得电路简明易懂,利用键盘键上的按键来调整时钟的时、分、秒,同时利用C 语言程序来控制整个时钟显示,使得编程变得更易,如此通过三个模块:键盘、芯片、显示屏即可知足设计要求。
原理如图一所示。
ATC89C51单片机芯片VCC:供电电压。
GND:接地。
P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。
当P0口的管脚第一次写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”时,其管脚被内部上拉电阻拉高,且作为输入。
以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单片机的数字时钟设计
CJNE A,#24H,DISH1 MOV HOUR,#00H DISH1:AJMP DISH ;转至时 显示缓冲区设置 KK2:JNB KEY3,KK3 ;判断 KEY3是否按下 JB KEY3,$ ;等待KEY3键释 放 MOV A,R3 RL A MOV DPTR,#KJMP2 JMP @A+DPTR KJMP2:AJMP DISCLK AJMP SDEC AJMP MDEC AJMP HDEC SDEC:MOV A,#9AH ;秒减1 CLR C SUBB A,#01H ADD A,SECOND DA A
3、程序代码
MOV TH0,#0B1H;定时器T0装入 初值20ms MOV TL0,#0E0H SETB ET0 ;T0中断允许 SETB EA ;总中断允许 MOV R2,#50 ;T0中断为1s SETB TR0 ;启动T0 MOV SECOND,#00H MOV MINUTE,#00H MOV HOUR,#08H ;初始化时间8 点00分00秒 MOV A,HOUR 时间值送显示缓 冲区79H~7EH ANL A,#0F0H SWAP A MOV 79H,A
二、设计背景
十一世纪的今天,最具代表性的计时产品就是电子万年历, 它是近代世界钟表业界的第三次革命。 第一次是摆和摆轮游丝的发明,相对稳定的机械振荡频率 源使钟表的走时差从分级缩小到秒级,代表性的产品就是带 有摆或摆轮游丝的机械钟或表。 第二次革命是石英晶体振荡器的应用,发明了走时精度更 高的石英电子钟表,使钟表的走时月差从分级缩小到秒级。 第三次革命就是单片机数码计时技术的应用(电子万年 历),使计时产品的走时日差从分级缩小到1/600万秒,从原 有传统指针计时的方式发展为人们日常更为熟悉的夜光数字 显示方式,直观明了,并增加了全自动日期、星期、温度以 及其他日常附属信息的显示功能,它更符合消费者的生活需 求!
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)//控制液晶模块//控制蜂鸣器//控制按键开关//...}```在具体的代码实现中,我们需要根据液晶模块、蜂鸣器和按键开关等外设的具体规格和功能来编写相应的代码。
昆明学院单片机实训基于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单片机的设计电子时钟原理图开机显示仿真图: 当按下仿真键时电子时钟开机页面显示第一行显示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单片机的电子钟设计
目录一、内容提要 (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的电子时钟设计
课程设计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,。
基于单片机的lcd电子时钟设计
基于单片机的lcd电子时钟设计随着科技的发展,电子产品逐渐成为人们生活中必不可少的部分。
其中,电子时钟是人们生活中经常使用的一种电子产品。
电子时钟通过精准的电子元件来测量时间,比传统时钟计时更为准确、实用。
在这篇文档中,我将介绍一种基于单片机的LCD电子时钟设计。
一、设计原理该电子时钟的核心是单片机AT89C51,其运行频率为12MHz。
另外,该时钟使用4位7段LCD显示器来显示时间。
由于该LCD显示器需要保持常电流状态,因此电子时钟配备了LM324运算放大器,用于调整电流并实现显示。
当单片机初始化时,它会将当前的时间读取到内部存储器中,至此时钟启动。
单片机读取内部存储器将获取到各种时间信息,包括秒、分、时、日、月和年。
接下来,单片机通过CPU时钟中断,每秒钟更新一次时间,同时在LCD显示区域更新时间数据。
二、硬件设计该电子时钟需要一些硬件设备才能正常运行。
我们需要以下电子设备:1. 单片机AT89C512. 4位7段LCD3. 若干电容4. 数量不定的电阻5. LM324运算放大器6. 晶体7. LED灯通过以上硬件部件的搭配,我们可以实现一个完整的电子时钟设备。
三、软件设计在开发电子时钟硬件之后,我们需要写一些软件来控制它的运行。
在本例中,我们使用C语言编写时钟控制程序。
基本的程序控制框架如下:1. 初始化单片机,设置相关校准参数2. 读取系统时间,并将其存储到内部存储器中3. 每秒钟更新时间信息4. 对时钟时间进行格式化,以便在LCD显示屏幕上显示5. 在LCD显示区域显示格式化数据6. 不断循环执行上述步骤以上步骤需要编写正确的代码才能正常工作。
在编写C程序时,需要注意单片机的内部存储器、寄存器、I/O端口等的使用,同时还需要考虑程序执行速度、指令优化以及机器资源分配等各个方面。
四、总结在本文中我们介绍了基于单片机的LCD电子时钟的设计,并分别阐述了其硬件和软件设计的基本原理。
作为一种基于电子、精准、实用的时间计算设备,电子时钟在现代社会中得到了广泛应用。
基于AT89C51单片机的电子时钟设计_毕业设计
基于AT89C51单片机的电子时钟设计摘要:本文介绍了AT89C51单片机控制162液晶显示屏的工作原理以及设计方法,利用ds1302芯片和162液晶屏以51单片机为主控芯片设计一个时钟电路,分为硬件设计与软件设计两个部分。
硬件设计主要是单片机、液晶和ds1302的接口设计;软件设计的主要部分是:单片机的端口初始化以及ds1302初始化,液晶显示屏的初始化,单片机驱动液晶屏的显示。
关键词:AT89C51单片机;162液晶显示屏;ds1302;LCD1 引言液晶显示器以其微功耗、体积小、显示内容丰富、超薄轻巧等许多优点,在袖珍式仪表和低功耗应用系统中得到越来越广泛的应用。
本文中详细介绍了基于AT89C51单片机控制下的162液晶屏显示设计,此设计基于da1302的时钟电路方便实用,电路设计简单。
2 硬件介绍2.1、AT89C51简介AT89C51是一种带4K字节FLASH存储器(FPEROM—Flash Programmable and Erasable Read Only Memory)的低电压、高性能CMOS 8位微处理器,俗称单片机。
AT89C2051是一种带2K字节闪存可编程可擦除只读存储器的单片机。
单片机的可擦除只读存储器可以反复擦除1000次。
该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,AT89C2051是它的一种精简版本。
AT89C单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
AT89C51 提供以下标准功能:4k 字节Flash 闪速存储器,128字节内部RAM,32 个I/O 口线,两个16位定时/计数器,一个5向量两级中断结构,一个全双工串行通信口,片内振荡器及时钟电路。
同时,AT89C51可降至0Hz的静态逻辑操作,并支持两种软件可选的节电工作模式。
基于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的一个很重要的方面就是液晶显示器的初始化,主要是利用控制、数据复用总线来输入指令,进行初始化。
基于AT89C51数码时钟电路的设计
分类号:TM711单位代码:10452本科职业生涯设计数码时钟电路的设计姓名学号年级2010级专业电气工程及其自动化系(院)指导教师2011年 12 月 20 日诚信声明\学生签名:日期:指导老师签名:日期:摘要本文通过对一个基于单片机的能实现定时,秒表,闹钟等功能的多功能电子时钟的设计学习,详细介绍了单片机应用中的数据转换显示,液晶显示原理,键盘扫描原理。
从而达到学习、了解单片机相关指令在各方面的应用。
系统由AT89C51、温度检测芯片、时钟芯片DS1302、液晶显示器LCD1602等部分构成,能实现时钟日历显示的功能,能进行时、分、秒的显示和实时温度显示。
也具有时钟、日历的校准,定时时间的设定和闹铃等功能。
文章后附有电路原理图、PCB板图和程序清单,以供读者参考。
因水平有限,难免有疏落不足之处,敬请老师和同学能给与批评指正。
关键字:AT89C51;DS1302;LCD1602;时钟目录前言 (1)第1章总体方案介绍 (2)1.1系统设计思想 (2)1.2系统框架图 (2)第2章硬件仿真电路设计 (3)2.1 Proteus (3)2.1.1 Proteus简介 (3)2.2 AT89C51的电路设计 (3)2.2.1 AT89C51简介 (3)2.2.2 AT89C51的时钟电路设计 (6)2.2.3 AT89C51的复位电路设计 (6)2.3 AT89C51液晶显示模块的连接 (7)2.3.1液晶显示器LCD1602简介 (7)2.3.2 AT89C51与LCD1602的连接 (12)2.4 AT89C51与时钟芯片的连接 (12)2.4.1时钟芯片DS1302简介 (12)2.4.2 AT89C51与时钟芯片DS1302的连接 (14)2.5 AT89C51与温度芯片的连接 (15)2.5.1温度芯片DS18B20简介 (15)2.5.2AT89C51与温度芯片DS18B20的连接 (16)2.6 AT89C51与键盘的连接 (16)第3章系统软件设计 (18)3.1程序设计 (18)3.1.1主程序模块设计 (18)3.1.2液晶显示器LCD1602模块 (19)3.1.3时钟芯片DS1302操作模块 (20)3.1.4温度芯片DS18B20操作模块 (22)3.1.5键盘操作模块 (23)第4章硬件实现 (25)4.1 Protel的硬件电路设计 (25)4.1.1 原理图设计 (25)4.1.2 报表生成 (25)4.1.3 创建PCB文件 (26)第5章结论 (28)附录 (29)参考文献 (66)谢辞 (67)前言单片机因将其主要组成部分集成在一个芯片上而得名,就是把中央处理器、随机存储器、只读存储器、中断系统、定时器/计数器以及I/O接口电路等部件集成在一个芯片上。
基于AT89C51单片机的数字时钟设计
摘要本文是基于AT89C51单片机数字时钟的设计,阐述了数字时钟的设计思路,详细叙述了系统硬软件设计的具体过程。
数字时钟的设计过程在硬件与软件方面进行同步设计。
硬件部分主要由AT89C51单片机,LCD显示电路,复位电路,时钟电路,晶振电路以及报时电路。
采用AT89C51作为主控器件,用DS1302实现时钟功能,用LCD1602为显示器件。
通过DS1302直接读取时间和星期。
具有整点报时的功能。
关键词:数字时钟,AT89C51,LCD1602,DS1302一系统总体方案采用数字芯片DS1302计算日期,输出信号全数字化。
采用AT89C51单片机控制,软件编程的自由度大,可通过编程实现各种各样的算术算法和逻辑控制,而且体积小,硬件实现简单,安装方便。
用LCD1602液晶显示芯片进行显示再加之键盘及报时等。
总体方案框图如下:图1 系统总体方案框图二系统硬件设计2.1 控制器本部分采用AT89C51作为主控制器。
AT89C51 单片机是一款低功耗,高性能CMOS8位单片机,片内含4KB在线可编程(ISP)的可反复擦写1000次的Flash只读程序存储器,器件采用高密度、非易失性存储技术制造,兼容标准MCS- 51指令系统及80C51引脚结构。
这样,既能做到经济合理又能实现预期的功能。
在程序方面,采用分块设计的方法,这样既减小了编程难度、使程序易于理解,又能便于添加各项功能。
程序可分为闹钟的声音程序、显示程序、闹钟显示程序、调时显示、定时程序。
运用这种方法,关键在于各模块的兼容和配合,若各模块不匹配会出现意想不到的错误。
[1]下面介绍主要引脚功能功能如下:1 I/O接口MCS-51是标准的40引脚双列直插式集成电路芯片,引脚分布请参照----单片机引脚图2。
P0.0~P0.7 P0口8位双向口线;P1.0~P1.7 P1口8位双向口线;P2.0~P2.7 P2口8位双向口线;P3.0~P3.7 P2口8位双向口线。
毕业设计(论文)-基于at89c51单片机的数字闹钟设计(电路图+源程序)[管理资料]
摘要近年来随着计算机在社会领域的渗透和大规模集成电路的发展,单片机的应用正在不断地走向深入,由于它具有功能强,体积小,功耗低,价格便宜,工作可靠,使用方便等特点,因此特别适合于与控制有关的系统,越来越广泛地应用于自动控制,智能化仪器,仪表,数据采集,军工产品以及家用电器等各个领域,单片机往往是作为一个核心部件来使用,在根据具体硬件结构,以及针对具体应用对象特点的软件结合,以作完善。
本次做的数字闹钟以89C51单片机作为控制核心,使用串行时钟芯片PCF8563实现时间的显示设置和闹钟功能。
为了方便驱动其它电路,通过总线驱动器74LS245增加单片机的驱动能力。
将数据及地址等信号通过40线的总线引出,便于将来对此单片机系统作进一步的扩展。
作为一款多功能数字闹钟它除具有括时钟显示、闹钟功能外,还有具有秒表、温度测量、电压测量等功能。
本次设计的难点与重点在于各个模块的设计。
关键词:单片机89C51数字闹钟时钟芯片PCF8563AbstractIn recent years, with computers in the infiltration and the development of large-scale integrated circuits. SCM application is steadily deepening, as it has strong function, small size, low power dissipation, low prices, reliable, easy to use features, it is particularly suited to and control of the system, increasingly widely used in automatic control, intelligent instruments, gauges, data acquisition, military products and household appliances, and other areas, is often microcontroller as a core component to use, In light of specific hardware architecture, and application specific software features object combine to make perfect.The figures do bell on SCM (AT89C51) at the core, Combined with the components, and factoring in the corresponding software, Easy to produce digital clock purposes, as part of the hardware components is a difficult choice, layout and welding.Keywords : Single Chip Microcomputer 89C51 bell PCF8563目录摘要 (I)Abstract ...................................................................................................... I I 第一章引言 (1)第二章方案设计与比较 (2) (2)系统工作原理: (2) (2)温度采集方案 (3)键盘显示方案 (3) (3) (4)闹钟功能方案 (4)电压、频率测量方案 (4)第三章主要元器件介绍与说明 (5)AT89C51单片机工作原理与性能 (5)AT89C51单片机管脚说明 (6)振荡器特性 (8)PCF8563时钟芯片及其应用 (8)PCF8563时钟芯片特性 (9)PCF8563时钟芯片管脚配置与描述 (9)功能描述 (10)报警功能模式 (11)定时器 (11)复位 (11)内部寄存器的功能 (11) (14)第四章系统硬件设计 (14) (14) (15)时钟接口电路设计 (15)液晶显示器(LCD)电路设计 (17)键盘接口电路电路设计 (17)声光报警接口电路设计 (18)温度测量电路设计 (19)交流电特性测量设计 (22) (25) (25)主程序流程图 (25)蜂鸣器闹铃中断服务子程序流程图 (27) (28) (28) (30)结束语 (31)致谢 (32)参考文献 (33)附录一:系统总电路图 (33)附录二:多功能数字闹钟主程序 (35)第一章引言现在是一个知识爆炸的新时代。
基于单片机实现的LCD定时电子闹钟课程设计
摘要本设计是采用单片机技术的电子定时闹钟,近年来集成电路技术的出现和应用,是推动了人类文明的突飞猛进。
基于集成电路技术的单片机产品更是方便了人们的生活和工作,目前以单片机技术的应用为核心的产品种类非常丰富。
应用我们所学过的知识和查阅相关资料,我制作了这个单片机技术为基础的LCD 可校时可定时电子闹钟,这是一个简单的实用的单片机电子设计产品。
本“LCD定时电子闹钟’设计采用AT89C51为主控芯片。
在充分理解了设计的要求后,准确的定位了设计的目的,然后构思了总体的方案。
在选择和合适的硬件完成了电路的设计后,又进行了软件的设计和调试。
本系统的硬件组成以及工作原理都有详细的图文说明,所应用的软件技术和各个模块设计的功能及工作过程也有详细的介绍,最后的部分则详细描述了了软件仿真及调试过程。
本电子钟设计是以单片机技术为核心,采用了中小规模集成度的单片机制作的功能较为完善的电子闹钟。
硬件设计应用了成熟的数字钟电路的基本设计方法以,并详细介绍了系统的工作原理。
硬件电路中使用了除AT89C51外,另外还有LCD、晶振、电阻、电容、发光二极管、开关、喇叭等元件。
在硬件电路的基础上,软件设计按照系统设计功能的要求,运用所学的汇编语言,实现的功能包括‘时时-分分-秒秒’显示、设定和修改定时时间的小时和分钟、校正时钟时间的小时、分钟和秒、定时时间到能发出一分钟的报警声。
最后应用‘伟福’及‘Proteus’等软件将硬件电路和软件系统链接在一起对各个部分及整体进行仿真并调试构成了整个完整的电子闹钟的设计。
最后通过反复的实际仿真和测试表明,该系统能够实现所有要求的功能包括:(1)能显示‘时时-分分-秒秒’。
(2)能够设定定时时间、修改定时时间及时钟。
(3)定时时间到蜂鸣器能发出铃声,另外还在此基础上实现了其他的附加功能比如万年历。
当然这个系统仍然是属于比较简单的单片机应用系统,要设计功能更强的更复杂的系统还需要我进一步的学习。
基于AT89C51单片机定时闹钟设计
塔里木大学信息工程学院《单片机原理与外围电路》课程论文题目:单片机定时闹钟设计:海热古丽·依马木学号:5011110115班级:电脑15-1班摘要:本设计是单片机定时闹钟系统,不仅能实现系统要求的功能,而且还有附加功能,即还能设定和修改当前所显示的时间。
本次设计的定时闹钟在硬件方面就采用了AT89C51芯片,用6位LED数码管来进行显示。
LED用P0口进行驱动,采用的是动态扫描显示,能够比较准确显示时时—分分—秒秒。
通过S1、S2、S3、和S4四个功能按键可以实现对时间的修改和定时,定时时间到喇叭可以发出报警声。
在软件方面采用汇编语言编程。
整个定时闹钟系统能完成时间的显示,调时和定时闹钟、复位等功能,并经过系统仿真后得到了正确的结果。
关键词:单片机、AT89C51、定时闹钟、仿真Abstract:T his design is a single-chip timing alarm system, can not only realize the function of system requirements, and there are additional functions, which can set up and modify the display time. Timing alarm clock this design adopts the AT89C51 chip on the hardware side, with 6 LED digital tube to display. LED P0 export driven, by using dynamic scanning display, can accurately display always -sub -seconds seconds. Through the S1, S2, S3, and S4 four function keys can be achieved on the time changes and timing, timing to the horn can send out alarm sound. Using assembly language programming in the software. The timing clock system has functions of time display, timing and timing alarm clock, reset and other functions, and the system simulation to obtain correct results.Keywords: single chip microcomputer, AT89C51, alarm clock, simulatio目录1绪论 (2)课题背景及研究意义 (2)国内外现状 (2)课题的设计目的 (2)课题的主要任务 (2)课题的主要功能 (2)2系统概述 (3)方案论证 (3)系统设计原理 (3)3系统硬件设计 (4)单片机AT89C51简介 (4)数码管显示电路 (6)时钟电路 (7)喇叭:SPEAKER (8)4系统软件设计 (8)系统软件设计说明 (8)4.2 程序调试 (8)4.3 程序流程图 (9)仿真步骤 (10)仿真结果 (10)结论 (12)参考文献 (13)附录A 系统整体电路 (14)附录B 全部程序清单 (14)附录C:PCB图和3D图 (23)1绪论课题背景及研究意义进入信息时代,电脑的影子无处不在,带有像单片机一类嵌入式处理器的小型智能化电子产品,已经成为家用电器的主流,市场需求前景广阔,因此,掌握小型单片机应用系统设计方法,已成为当今电子应用工程师所必备的技能,定时闹钟具备小型单片机应用系统的一切要素,其结构简单、成本低廉、走时精确、设置方便,所以智能化方面有广泛的用途。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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: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:if(hour==24)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:if(year==0)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)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;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);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;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 性能分析。