显示可调闹钟万年历设计

显示可调闹钟万年历设计
显示可调闹钟万年历设计

带温度显示可调闹钟万年历

摘要

本设计由数据显示模块、温度采集模块、时间处理模块和调整设置模块四个模块组成。系统最大的特点是体现了较强的人机交互和独立的模块化程序设计。温度采集选用DS18B20芯片,数据显示采用1602A液晶显示模块,在第一行显示年月日、星期以及当前的状态,第二行显示温度和时间,合理的利用液晶显示区域。51主芯片利用定时中断产生时间,控制着液晶的显示更新、温度的实时变化以及按键的读取处理,而对于闹钟,实际上就是时间里的一个嵌套程序。时间和闹钟的值由按键调整设置,采用通用的二十四小时制。该电路采用51单片机作为核心,功耗小,能在3V的低压工作,电压可选用3~5V电压供电。

综上所述此万年历具有读取方便、显示直观、功能多样、电路简洁、成本低廉等诸多优点,符合电子仪器仪表的发展趋势,具有广阔的市场前景。

关键字:万年历;温度计;闹钟;液晶显示

一、方案设计与论证

根据要求,系统分为四个模块进行方案设计:

1.数据显示模块

方案一:数据采集处理后采用六位数码管动态扫描,循环依次显示年月日(如09.01.01)、当前时间(如12.00.00)和温度星期(如+23.5_1),数码管用74LS164芯片驱动,硬件电路复杂且显示略显混乱,在软件方面,扫描部分由于要显示的数据太多而显的不清晰。

方案二:考虑到要显示的内容颇多,故运用1602A显示实时数据,第一行显示状态以及年月日星期(如S 2009—01—01 THU),第二行显示温度和实时时间(22.0C12:00:00),在处理按键设置时,第二行暂时屏蔽温度的显示而显示设置的内容。这样虽然在程序方面多了1602A的一些初始化和读写子函数的定义,但程序的模块化却更加的清楚。而且采用1602A LCM的液晶显示模块后不仅满足了大量数据的显示,,系统的硬件电路变的十分简单清晰明朗。本设计采用了这种方案。

2 温度采集模块

采用常用的温度采集芯片DS18B20单线数字温度传感器进行温度的采集。DS18B20的微型化、低功耗、抗干扰能力强以及仅需一根数据线的简洁电路设计很适合本设计。但对其的电路连接却有不同的想法。

方案一:在寄生电源供电方式下,DS18B20从单线信号线上汲取能量,在信号线DQ处于高电平期间把能量储存在内部电容里,在信号线处于低电平期间消耗电容上的电能工作,直到高电平到来再给寄

生电源(电容)充电。独特的寄生电源方式虽不再需要本地电源,但要想使DS18B20进行精确的温度转换,I/O线必须保证在温度转换期间提供足够的能量,工作电源VCC必须保证在5V,当电源电压下降时,寄生电源能够汲取的能量也降低,会使温度误差变大。

方案二:DS18B20的外部电源供电方式在外部电源供电方式下,DS18B20工作电源由VDD引脚接入,此时I/O线不需要强上拉,不存在电源电流不足的问题,可以保证转换精度,外部电源供电方式是DS18B20最佳的工作方式,工作稳定可靠,抗干扰能力强,而且电路也比较简单。在外接电源方式下,可以充分发挥DS18B20宽电源电压范围的优点,即使电源电压VCC降到3V时,依然能够保证温度量精度。外接电源解决了电压方面的苛刻要求,虽多接了一根线,但对于本设计的近距离测试来说还是很适合的。本设计采用此接法。

3 时间处理模块

这是本设计再方案采取时争议最大的部分,两个方案在闹钟的处理方面都是一样先比较再调用中断给蜂鸣器高电平,使其发声,蜂鸣器的电路采用常规的电路接法,用一个PNP三极管放大。但问题的焦点在于是采用时钟芯片DS1302还利用51自身的定时器生成万年历。

方案一:DS1302慢速充电时钟芯片包括实时时钟/日历和31字节的静态RAM,它经过一个简单的串行接口与微处理器通信,实时时钟/日历提供秒、分、时、日、周、月和年等信息。采用DS1302生成时间,大大简化了程序,且电路不是很复杂,在断电的情况下可由备份电源供电,消耗小于一微瓦的功率便能保存数据和时钟信息,时间得以延续。但是硬件多加了一个芯片和一个晶振,多用三个I/O口,增加了成本,而且软件部分完全可以利用51的内部资源解决,没有充分利用已有资源。

方案二:仅利用51内部的定时器和中生成秒,再利用程序累加清零等基本时间,尔后再调用C中一些经典的算法生成年月日以及星期等信息。但是该方案必须保证系统一直处于供电的情况,不能断电,否则时间由初始化了,所以该方案中又添加了三个设置按钮,也就是增加了一个设置调整模块,在再次供电后可以调整时间以同步,完美的解决了时间的连续性问题。这虽使得电路和方案一复杂度相当,但是系统的设计对资源的利用更充分,方案也更经济。本设计采用了方案二。

4调整设置模块

这个模块完全是第三个模块的一个衍生品,它就是为了调整时间以便断电后正常使用。该模块包括四个按键(两个中断,两个设置),一个中断就是简单要停止闹钟;另一个中断时是停止时钟,进入设置状态,包括调整时间以同步和设置闹钟的值,而另外两个设置建一个就是为了此时增加或减少时间值,另一个的作用是在调整完了当前量后进入下一个量的调整或退出调整。

二、系统的硬件设施与实现

1 路概述及总体框架图

本系统是以AT89C51单片机为控制核心单元,系统突出特点是环

境适应能力较强,功耗较低,成本低廉,经济实惠。温度采集部分由DS18B20构成,他是一种新型数字温度传感器,具有体积小、精度高、适用电压宽而且采用独特的一线总线的传输方式,简化了电路连接。数据显示部分由LCM1602A模块构成,一体化的LCM部分提供了两行共三十二个字符的显示空间,使得本系统大量的数据能够实时更新。按键部分是常规的接法。系统硬件总体框架图如下图所示。

2. 主要模块的电路设计

(1) 单片机主控制模块的设计

AT89S52单片机为40引脚双列直插芯片,有四个I/O口P0,P1,P2,P3, MCS-51单片机共有4个8位的I/O口(P0、P1、P2、P3),每一条I/O线都能独立地作输出或输入。

单片机的最小系统如下图所示,18引脚和19引脚接时钟电路,XTAL1接外部晶振和微调电容的一端,在片内它是振荡器倒相放大器的输入,XTAL2接外部晶振和微调电容的另一端,在片内它是振荡器倒相放大器的输出.第9引脚为复位输入端,接上电容,电阻及开关后够上电复位电路,20引脚为接地端,40引脚为电源端. 如图-1 所示

图-1 主控制系统

(2) 温度采集模块

采用数字式温度传感器DS18B20仅需要一条数据线进行数据传输,使用P3.5与DS18B20的I/O口连接加一个4.7K的上拉电阻,其中Vcc接电源,Vss接地。

(3) 显示模块的设计

1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形。这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码。但1602液晶显示模块是一个慢显示器件,所以在执行每条指令之前一定要确认模块的忙标志为低电平,表示不忙,否则此指令失效。要显示字符时要先输入显示字符地址,也就是告诉模块在哪里显示字符,下表是RT-1602A的内部显示地址

三、系统软件设计

本系统软件主程序采用结构化程序设计方法,各个功能模块相互独立,主程序的流程图如下图所示。主程序可分为初始化,中断按键处理量大部分。

主程序流程图:

四、指标测试

1. 测试仪器

2. 硬件测试

电子万年历的电路系统比较简单,但对于焊接方面却不可轻视,尤其要严防静电:RT-1602A模块中的控制、驱动电路是低压、微功耗的CMOS电路,极易被静电击穿,静电击穿是一种不可修复的损坏,而人体有时会产生高达几十伏或上百伏的高压静电,所以,在

焊接以及使用中都应极其小心,严防静电等。

在本电子万年历的设计调试中遇到了很多的问题。回想这些问题只要认真多思考都是可以避免的,以下为主要的问题:

(1)烧入程序后,液晶显示空屏,而且亮度不均匀。

解决:首先对调用的仔细检查程序,可以解决显示闪动问题。其次,检查接线是否正确。由于其亮度由10K的电位器来调节,适当调节防止过暗或过亮的情况发生。

(2)LED数码管的断码错乱,原因出于没有认真看清a、b 、c等引脚信息。

解决:重新排列74LS47的输出端,相应接入LED数码管,即可解决出现在的断码或乱码。

(3)对万年历修改时间或日期时,有时LED数码管被屏蔽掉,造成不亮现象。

解决:根据仪器的测试,发现电路的驱动能力不足,最后在DS1302时钟芯片的/CS、SCLK、RET端接入 5.1K的上拉电阻后,电路的驱动能力才能满足,即可解决不亮现象。

3.软件测试

电子万年历是多功能的数字型,可以看当前日期,时间,还有温度的仪器。电子万年历功能很多,所以对于它的程序也较为复杂,所以在编写程序和调试时出现了相对较多的问题。最后经过多次的模块子程序的修改,一步一步的完成,最终解决了软件。在软件的调试过程中主要遇到的问题如下:

(1)修改时间、日期时没有与按键自动对应上。

解决:把不相关的程序暂时屏蔽,对按键的子程序独立调试,发现在调用按键自动更新时,时间与按键协调不好,所以会造成错乱。最后该延时为中断进行修改,使得时间、日期与按键自动对应上,最后解决了此问题.

(2)加入温度的程序后,进行修改时间、日期时相应的数码管位没有按要求闪动。

解决:由于DS18B20是串行通信数据,只用一个口线传输,在处理采集的模拟信号时需要一定的时间,当把万年历的程序相接入时,会对延时有很大的影响。所以在调用温度子程序时,先关闭定时器1中断允许,在温度子程序反回时再打开定时器1中断允许。最终解决了此问题。

4 测试结果分析与结论

<1> 测试结果分析

(1)在测试中遇到液晶屏不显示时,首先使用试测仪对电路进行测试,观察是否存在漏焊,虚焊,或者元件损坏.

(2)液晶屏显示不正常,还有亮度不够,首先使用试测仪对电路进行测试,观察电路是否存在短路现象。查看烧写的程序是否正确无误,对程序进行认真修改。

<2> 测试结论

经过多次的反复测试与分析,可以对电路的原理及功能更加熟悉,同时提高了设计能力与及对电路的分析能力.同时在软件的编程

方面得到更到的提高,对编程能力得到加强.同时对所学的知识得到很大的提高与巩固.

五、作品总结

在整个设计过程中,发挥团队精神,分工合作,充分发挥人的主观能动性,自主学习,学到了许多没学到的知识。较好的完成了作品。基本达到了预期的目的,在最初的设计中,发挥“三个臭皮匠,顶个诸葛亮”的作用。相互学习、相互讨论、研究。完了最初的设想。在电路焊接时虽然没什么大问题,但从中也知道了焊接在整个作品中的重要性,虽然电路工程量不大,但也要注意。当然也不能急于求成,否则反而达到事倍功半的效果。对电路的设计、布局要先有一个好的构思,才显得电路板美观、大方。程序编写中,由于思路不清晰,开始时遇到了很多的问题,经过静下心来思考,和同组员的讨论,看了相关的程序,理清了思路。在此次设计中,知道了做凡事要有一颗平常的心,不要想着走捷径,一步一脚印。也练就了我们的耐心,做什么事都在有耐心。此次比赛中学到了很多很多东西,这是最重要的。总之,参加电子竞赛我们的能力得到了全方位的提高。

参考文献

[1] 陈正振编电子电路设计与制作广西交通职业技术学院信息工程系 2007

[2] 杨子文编单片机原理及应用西安电子科技大学出版社 2006

[3] 王法能编单片机原理及应用科学出版社 2004

系统电路图

附录B 源程序

#include

#include

#define uint unsigned int

#define uchar unsigned char

sbit DS1302_CLK = P1^2; //实时时钟时钟线引脚

sbit DS1302_IO = P1^1; //实时时钟数据线引脚

sbit DS1302_RST = P1^0; //实时时钟复位线引

sbit AT24C02_WP = P1^4;

sbit AT24C02_SCL = P1^5;

sbit AT24C02_SDA = P1^6;

sbit DS18B20_DQ = P2^3;

sbit ACC0 = ACC^0;

sbit ACC7 = ACC^7;

char hide_sec,hide_min,hide_hour,hide_day,hide_week,hide_month,hide_year; //秒,分,时到日,月,年位闪的计数

sbit Set = P2^4; //模式切换键

sbit Up = P2^5; //加法按钮

sbit Down = P2^6; //减法按钮

sbit out = P2^7; //立刻跳出调整模式按钮

char done,count,temp,flag,up_flag,down_flag;

uchar TempBuffer[5],week_value[2];

void show_time(); //液晶显示程序

/***********1602液晶显示部分子程序****************/

sbit LcdRs = P2^0;

sbit LcdRw = P2^1;

sbit LcdEn = P2^0;

sfr DBPort = 0x80;

//P0=0x80,P1=0x90,P2=0xA0,P3=0xB0. 数据端口

//内部等待函数

unsigned char LCD_Wait(void)

{

LcdRs=0;

LcdRw=1; _nop_();

LcdEn=1; _nop_();

LcdEn=0;

return DBPort;

}

//向LCD写入命令或数据

#define LCD_COMMAND 0 // Command

#define LCD_DATA 1 // Data

#define LCD_CLEAR_SCREEN 0x01 // 清屏

#define LCD_HOMING 0x02 // 光标返回原点

void LCD_Write(bit style, unsigned char input)

{

LcdEn=0;

LcdRs=style;

LcdRw=0; _nop_();

DBPort=input; _nop_();//注意顺序

LcdEn=1; _nop_();//注意顺序

LcdEn=0; _nop_();

LCD_Wait();

}

//设置显示模式************************************************************

#define LCD_SHOW 0x04 //显示开

#define LCD_HIDE 0x00 //显示关

#define LCD_CURSOR 0x02 //显示光标

#define LCD_NO_CURSOR 0x00 //无光标

#define LCD_FLASH 0x01 //光标闪动

#define LCD_NO_FLASH 0x00 //光标不闪动

void LCD_SetDisplay(unsigned char DisplayMode)

{

LCD_Write(LCD_COMMAND, 0x08|DisplayMode);

}

//设置输入模式************************************************************

#define LCD_AC_UP 0x02

#define LCD_AC_DOWN 0x00 // default

#define LCD_MOVE 0x01 // 画面可平移

#define LCD_NO_MOVE 0x00 //default

void LCD_SetInput(unsigned char InputMode)

{

LCD_Write(LCD_COMMAND, 0x04|InputMode);

}

void LCD_Initial()

{

LcdEn=0;

LCD_Write(LCD_COMMAND,0x38); //8位数据端口,2行显示,5*7点阵

LCD_Write(LCD_COMMAND,0x38);

LCD_Write(LCD_COMMAND,0x38);

LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR); //开启显示, 无光标

LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); //清屏

LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE); //AC递增, 画面不动

//液晶字符输入的位置************************

void GotoXY(unsigned char x, unsigned char y)

{

if(y==0)

LCD_Write(LCD_COMMAND,0x80|x);

if(y==1)

LCD_Write(LCD_COMMAND,0x80|(x-0x40));

}

//将字符输出到液晶显示

void Print(unsigned char *str)

{

while(*str!='\0')

{

LCD_Write(LCD_DATA,*str);

str++;

}

}

/***********DS1302时钟部分子程序******************/

typedef struct __SYSTEMTIME__

{

unsigned char Second;

unsigned char Minute;

unsigned char Hour;

unsigned char Week;

unsigned char Day;

unsigned char Month;

unsigned char Year;

unsigned char DateString[11];

unsigned char TimeString[9];

}SYSTEMTIME; ///////////////////////////////////////////////////////////////////////////////定义的时间类型

SYSTEMTIME CurrentTime;

#define AM(X) X

#define PM(X) (X+12) // 转成24小时制

#define DS1302_SECOND 0x80 //时钟芯片的寄存器位置,存放时间#define DS1302_MINUTE 0x82

#define DS1302_HOUR 0x84

#define DS1302_WEEK 0x8A

#define DS1302_DAY 0x86

#define DS1302_MONTH 0x88

#define DS1302_YEAR 0x8C

void DS1302InputByte(unsigned char d) /////////////////////////实时时钟写入一字节(内部函数)

unsigned char i;

ACC = d;

for(i=8; i>0; i--)

{

DS1302_IO = ACC0; //相当于汇编中的RRC

DS1302_CLK = 1;

DS1302_CLK = 0;

ACC = ACC >> 1;

}

}

unsigned char DS1302OutputByte(void) //实时时钟读取一字节(内部函数)

{

unsigned char i;

for(i=8; i>0; i--)

{

ACC = ACC >>1; //相当于汇编中的RRC

ACC7 = DS1302_IO;

DS1302_CLK = 1;

DS1302_CLK = 0;

}

return(ACC);

}

void Write1302(unsigned char ucAddr, unsigned char ucDa) //ucAddr: DS1302地址, ucData: 要写的数据

{

DS1302_RST = 0;

DS1302_CLK = 0;

DS1302_RST = 1;

DS1302InputByte(ucAddr); // 地址,命令

DS1302InputByte(ucDa); // 写1Byte数据

DS1302_CLK = 1;

DS1302_RST = 0;

}

unsigned char Read1302(unsigned char ucAddr) //读取DS1302某地址的数据{

unsigned char ucData;

DS1302_RST = 0;

DS1302_CLK = 0;

DS1302_RST = 1;

DS1302InputByte(ucAddr|0x01); // 地址,命令

ucData = DS1302OutputByte(); // 读1Byte数据

DS1302_CLK = 1;

DS1302_RST = 0;

return(ucData);

}

void DS1302_GetTime(SYSTEMTIME *Time) //获取时钟芯片的时钟数据到自定义的结构型数组

{

unsigned char ReadValue;

ReadValue = Read1302(DS1302_SECOND);

Time->Second = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);

ReadValue = Read1302(DS1302_MINUTE);

Time->Minute = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);

ReadValue = Read1302(DS1302_HOUR);

Time->Hour = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);

ReadValue = Read1302(DS1302_DAY);

Time->Day = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);

ReadValue = Read1302(DS1302_WEEK);

Time->Week = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);

ReadValue = Read1302(DS1302_MONTH);

Time->Month = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);

ReadValue = Read1302(DS1302_YEAR);

Time->Year = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);

}

/*****************计算当前日期离元旦的天数**************/

unsigned int DaytoNewYear(SYSTEMTIME *time)

{

unsigned char Mont,Date;

unsigned int Yea;

int Date1=0,Date2=0;

unsigned char i;

Yea=(time->Year)+2000;

Mont=time->Month;

Date=time->Day;

if(((Yea%4)||(Yea%100)))

Mon[1]=29;

i=Mont;

while(i-1)

{

--i;

Date1=Date1+Mon[i-1];

}

Date1=Date1+Date-1;

return Date1;

}

/*****************查表取得当年春节日期**************/

unsigned char FestYear,FestMonth,FestDay;

unsigned char OldYear,OldMonth,OldDay;

void GetSprFestDate(SYSTEMTIME *time)

{

unsigned char i=0;

i=Table[(time->Year+2000-1901)*3+2];/* 取第三字节*/

FestYear=time->Year;

FestMonth=(i&0x60)>>5;

FestDay=i&0x1f;

}

/*****************计算出春节离元旦的天数**************/

unsigned char Days()

{

unsigned char Date=0;

if(FestMonth==2)

Date=31+FestDay-1;

else

Date=FestDay-1;

return Date;

}

/**********************计算农历***********************/

void OldCal(SYSTEMTIME *time)

{

int i,k;

unsigned char j,m,DoubleMonth;

GetSprFestDate(&CurrentTime);

i=DaytoNewYear(&CurrentTime);

j=Days();

k=i-j+1;

for(m=0;m<=3;m++)/* 计算出当年农历大小月表,大月则为三十天,小月二十九天*/ {

if((Table[(time->Year+2000-1901)*3]<

OldMon[m]=30;

}

for(m=4;m<=12;m++)

{

if((Table[(time->Year+2000-1901)*3+1]<<(m-4))&0x80)

OldMon[m]=30;

}

m=0;

j=0;

if(Table[(time->Year+2000-1901)*3+2]&0x80)

OldMon[12]=30;

if(Table[(time->Year+2000-1901)*3]&0xf0)

DoubleMonth=(Table[(time->Year+2000-1901)*3]&0xf0)>>4;/* 闰月月份*/

do

{

if((DoubleMonth==m)&&(DoubleMonth!=0))

{

j++;

if(j<2) m=m;//如果有闰月则重复一次月份

else m++;

}

else m++;

OldMonth=m;

OldDay=k;

k=k-OldMon[m-1];

}while(k>0);

OldYear=time->Year;

}

void DateToStr(SYSTEMTIME *Time) //将时间年,月,日,星期数据转换成液晶显示字符串,放到数组里DateString[]

{ if(hide_year<2) //这里的if,else语句都是判断位闪烁,<2显示数据,>2就不显示,输出字符串为2007/07/22

{

Time->DateString[0] = '2';

Time->DateString[1] = '0';

Time->DateString[2] = Time->Year/10 + '0';

Time->DateString[3] = Time->Year%10 + '0';

}

else

{

Time->DateString[0] = ' ';

Time->DateString[1] = ' ';

Time->DateString[2] = ' ';

Time->DateString[3] = ' ';

}

Time->DateString[4] = '/';

if(hide_month<2)

{

Time->DateString[5] = Time->Month/10 + '0';

Time->DateString[6] = Time->Month%10 + '0';

}

else

{

Time->DateString[5] = ' ';

Time->DateString[6] = ' ';

}

Time->DateString[7] = '/';

if(hide_day<2)

{

Time->DateString[8] = Time->Day/10 + '0';

Time->DateString[9] = Time->Day%10 + '0';

}

else

{

Time->DateString[8] = ' ';

Time->DateString[9] = ' ';

}

if(hide_week<2)

{

week_value[0] = Time->Week%10 + '0'; //星期的数据另外放到week_value[]数组里,跟年,月,日的分开存放,因为等一下要在最后显示}

else

{

week_value[0] = ' ';

}

week_value[1] = '\0';

Time->DateString[10] = '\0'; //字符串末尾加'\0' ,判断结束字符

}

void TimeToStr(SYSTEMTIME *Time) //将时,分,秒数据转换成液晶显示字符放到数组TimeString[];

{ if(hide_hour<2)

{

Time->TimeString[0] = Time->Hour/10 + '0';

Time->TimeString[1] = Time->Hour%10 + '0';

}

else

{

Time->TimeString[0] = ' ';

Time->TimeString[1] = ' ';

}

Time->TimeString[2] = ':';

if(hide_min<2)

{

Time->TimeString[3] = Time->Minute/10 + '0';

Time->TimeString[4] = Time->Minute%10 + '0';

}

else

{

Time->TimeString[3] = ' ';

Time->TimeString[4] = ' ';

}

Time->TimeString[5] = ':';

if(hide_sec<2)

{

Time->TimeString[6] = Time->Second/10 + '0';

Time->TimeString[7] = Time->Second%10 + '0';

}

else

{

Time->TimeString[6] = ' ';

Time->TimeString[7] = ' ';

}

Time->DateString[8] = '\0';

}

void Initial_DS1302(void) //时钟芯片初始化

{

unsigned char Second=Read1302(DS1302_SECOND);

if(Second&0x80) //判断时钟芯片是否关闭

{

Write1302(0x8e,0x00); //写入允许

Write1302(0x8c,0x07); //以下写入初始化时间日期:07/07/25.星期: 3. 时间: 23:59:55

Write1302(0x88,0x07);

Write1302(0x86,0x25);

Write1302(0x8a,0x07);

Write1302(0x84,0x23);

Write1302(0x82,0x59);

Write1302(0x80,0x55);

Write1302(0x8e,0x80); //禁止写入

}

}

void Delay1ms(unsigned int count)

{

unsigned int i,j;

for(i=0;i

for(j=0;j<120;j++);

}

void mdelay(uint delay)

{ uint i;

for(;delay>0;delay--)

{for(i=0;i<62;i++) //1ms延时.

{;}

}

}

void outkey() //跳出调整模式,返回默认显示

{ uchar Second;

if(out==0)

{ mdelay(8);

count=0;

hide_sec=0,hide_min=0,hide_hour=0,hide_day=0,hide_week=0,hide_month=0,hi de_year=0;

Second=Read1302(DS1302_SECOND);

Write1302(0x8e,0x00); //写入允许

Write1302(0x80,Second&0x7f);

Write1302(0x8E,0x80); //禁止写入

done=0;

while(out==0);

}

}

void Upkey()//升序按键

{

Up=1;

if(Up==0)

{

mdelay(8);

switch(count)

{case 1:

temp=Read1302(DS1302_SECOND); //读取秒数

temp=temp+1; //秒数加1

up_flag=1; //数据调整后更新标志

if((temp&0x7f)>0x59) //超过59秒,清零

temp=0;

break;

case 2:

temp=Read1302(DS1302_MINUTE); //读取分数

temp=temp+1; //分数加1

up_flag=1;

if(temp>0x59) //超过59分,清零

temp=0;

break;

case 3:

temp=Read1302(DS1302_HOUR); //读取小时数

temp=temp+1; //小时数加1

up_flag=1;

if(temp>0x23) //超过23小时,清零

temp=0;

break;

case 4:

temp=Read1302(DS1302_WEEK); //读取星期数

temp=temp+1; //星期数加1

up_flag=1;

if(temp>0x7)

temp=1;

break;

case 5:

temp=Read1302(DS1302_DAY); //读取日数

temp=temp+1; //日数加1

up_flag=1;

if(temp>0x31)

temp=1;

break;

case 6:

temp=Read1302(DS1302_MONTH); //读取月数

temp=temp+1; //月数加1

up_flag=1;

if(temp>0x12)

temp=1;

break;

case 7:

temp=Read1302(DS1302_YEAR); //读取年数

temp=temp+1; //年数加1

up_flag=1;

if(temp>0x85)

temp=0;

break;

default:break;

}

while(Up==0);

}

}

void Downkey()//降序按键

{

Down=1;

6、用DS1302与LCD1602可调数字万年历实验设计报告

利用时钟芯片DS1302实现万年历 系别电子通信工程系 组别第十组 专业名称电子信息工程 指导教师 组内成员 2013年8月19日

用DS1302与LCD1602设计 的可调式电子日历时钟 一、总体设计 1.1、设计目的 为巩固所学的单片机知识,把所学理论运用到实践中,用LCD1602与DS1302 设计可调式电子日历时钟。 1.2、设计要求 (1)显示:年、月、日、时、分、秒和星期; (2)设置年、月、日、时、分、秒和星期的初始状态; (3)能够用4个按键调整日历时钟的年、月、日、时、分、秒和星期; 完成可调式电子日历时钟的硬件和软件的设计,包括单片机的相关内 容;日历时钟模块的设计,液晶显示模块的设计,按键模块的设计。 控制程序的编写等。 备注:本程序另外添加了每到上午8:10和下午2:10的闹钟提醒功能。 1.3、系统基本方案选择和论证 1.3.1、单片机芯片的选择方案 方案一: 采用89C51芯片作为硬件核心,采用Flash ROM,内部具有4KB ROM 存储空间,能于3V的超低压工作,而且与MCS-51系列单片机完全兼容。 方案二: 采用STC12C5A60S2系列单片机是宏晶科技生产的单时钟/机器周期(1T)的单片机,是高速/低功耗/超强抗干扰的新一代8051单片机,指令代码完全兼容传统8051,但速度快8-12倍。内部集成MAX810专用复位电路,2路PWM,8路高速10位A/D转换(250K/S),针对电机控制,强干扰场合。但造价较高。

1.3.2 、显示模块选择方案和论证: 方案一: 采用点阵式数码管显示,点阵式数码管是由八行八列的发光二极管组成,对于显示文字比较适合,如采用显示数字显得太浪费,且价格也相对较高。所以不用此种作为显示。 方案二: 采用LED数码管动态扫描,虽然LED数码管价格适中,但要显示多个数字所需要的个数偏多,功耗较大,显示出来的只是拼音,而不是汉字。所以也不用此种作为显示。 方案三: 采用LCD液晶显示屏,液晶显示屏的显示功能强大,可显示大量字符,且视觉效果较好,外形美观。LCD1602可实现显示2行十六个字符。 1.3.3、时钟芯片的选择方案和论证: 方案一: 直接采用单片机定时计数器提供秒信号,使用程序实现年、月、日、星期、时、分、秒计数。采用此种方案虽然减少芯片的使用,节约成本,但是,实现的时间误差较大。所以不采用此方案。 方案二: 采用DS1302时钟芯片实现时钟,DS1302芯片是一种高性能的时钟芯片,可自动对秒、分、时、日、星期、月、年以及闰年补偿的年进行计数,而且精度高,31*8位的RAM做为数据暂存区,工作电压范围为2.5V~5.5V,2.5V时耗电小于300nA。 1.3.4、电路设计最终方案决定 综上各方案所述,对此次作品的方案选定:采用80C51作为主控制系统;DS1302提供时钟;LCD1602液晶带汉字库显示屏作为显示部分。

推荐-电子万年历的设计与制作课程设计 精品

华南农业大学 电子工程学院应用物理系 课程设计(报告)任务书 设计题目:电子万年历的设计与制作 任务与要求(请按所选题目自行总结) 任务:设计一个电子万年历,利用实时时钟芯片ds1302和51单片机制作实时时钟。 要求: 1.使用LCD1602显示屏显示日期和时间; 2.能够显示新历和农历; 3. 包括时钟模块,能够显示实时时钟; 4. 要有时间设置按键部分; 5. 完成硬件电路的设计后,编写程序,实现时间和日期的显示等功能; 6. 调试程序,完成功能验证,写出完整的课程设计。 实验器材: 1.单片机最小系统:单片机(插座),晶振,电阻,电容,按键; 2.电源模块:自锁开关,LED灯,USB插座; 3.按键模块:按键; 4.1602显示模块:1602(排母),电位器,电容; 5.RTC模块:DS1302芯片(插座),晶振,CR2032电池(插座); 6.DIY小部件:漆包线,杜邦线,排针,排母,IC插座,电阻包,电容包,烙铁套装; 开始日期20XX 年 3 月 4 日完成日期20XX 年3 月 23 日

电子万年历设计 摘要:本系统是由单片机最小系统、电源模块、按键模块、LCD1602显示模块及RTC模块组成的电子万年历系统。通过时钟模块实时进行时间和日期的计数,进而传递给单片机处理,单片机再将其传递给LCD1602模块显示当前时间,另设有按键模块可以完成时间设置以及日期查询等功能操作。其设计简单,性能优良,时间设置可调,同时同步显示农历和星期,具有较强的实用性。本文先简要介绍每个模块的工作原理,再作整个系统电路的综合分析,说明该电子万年历的实现过程。 Summary:This system,electronic calendar system,is posed of SCM minimum system, power supply module, keys module, LCD1602 display module and RTC module .Through RTC module for counting the time and date, and then transmit to SCM for processing,and then send it to the LCD1602 module to show the current time, also operates key modules can be pleted time setting and operating date query function.Its simple design, excellent performance, adjustable time setting, synchronous display lunar calendar and week at the same time, has strong practicability.This paper first briefly introduces the working principle of each module, and then a prehensive analysis of the circuit.The last,illustrate the whole system implementation process of the electronic calendar. 关键词:万年历,计时,显示,农历 Keywords: calendar、timing、display、

数字电子课设:万年历的设计

编号 北京工商大学 数字电子技术基础 《万年历的设计》 姓名 学院 班级 学号 设计时间

一、设计目的 1、熟悉集成电路的引脚安排 2、掌握芯片的逻辑功能及使用方法 3、了解数字电子钟及万年历的组成及工作原理 4、熟悉数字电子钟及万年历的设计与制作 5、熟悉multisim电子电路设计及仿真软件的应用 二、设计思路 1、设计60进制秒计数器芯片 2、设计24进制时计数器芯片 3、设计31进制天计数器芯片 4、设计12机制月计数器芯片 5、设计7进制周计数器芯片 6、设计闰年平年不同月份不同进制逻辑 三、设计过程 1、Tr_min and s 60进制计数器芯片: “秒”、“分”电路都六十进制,它由一级十进制计数器和一级六进制计数器组成,六十进制计数器的设计图如下,采用四个片74ls161N串联而成,低位芯片的抚慰信号作为下级输入信号,串接起来构成“秒”、“分”计数器芯片。

2、Tr_hour24进制计数器芯片: 24进制计数器芯片的设计图如下,时计数电路由两片74ls161串联组成。当时个位计数为4,十位计数为2时,两片74ls160N复零,从而构成24进制计数。 3、Tr_day天计数器芯片: 采用两片74ls160N和一片74ls151N串联而成,天计数器的进制受到月计数器反馈M、N影响和年计数器反馈R4的影响,在M、N不收到反馈信息的时候,天计数器为28进制,电路设计图如下:

4、Tr_week周计数器芯片: 周计数器由一块74ls161N构成一个七进制计数器,原理与秒、分、时计数器相似,电路设计图如下 5、Tr_month月计数器芯片: 采用两片74160N和两片74HC151D_2V串联而成,月计数器的反馈信息M、N影响

液晶显示万年历设计

湄洲湾职业技术学院 液晶显示万年历设计 系别:自动化工程系 年级:10 级专业:电气自动化 姓名:陈承隆学号:1001020212 导师姓名:许振龙职称:讲师 2013年 5 月27日

目录 1.前言 (1) 2.系统设计参数要求 (2) 3.系统设计 (3) 3.1系统设计总体框图 (3) 3.2 各模块原理说明 (4) 3.2.1 AT89C52单片机最小系统模块 (4) 3.2.2 液晶显示模块 (5) 3.2.3 机给蜂鸣器模块 (5) 3.2.4 独立键盘模块 (5) 3.3 系统总原理图说明 (6) 3.4系统印刷电路板的制作图 (6) 3.5系统的操作说明 (6) 3.6 系统操作注意事项 (6) 参考文献 (7) 致谢词 (8) 附录 (9) 附录1:电路总原理图 (10) 附录2:印刷电路板 (11) 附录3:原件清单 (12)

1.前言 随着科技的快速发展,时间的流逝,从观太阳、摆钟到现在电子钟,人类不断研究,不断创新纪录。目前,单片机技术的应用产品已经走进了千家万户。电子万年历的出现给人们的生活带来了诸多方便。随着微电子技术的高速发展,单片机在国民经济的个人领域得到了广泛的运用。单片机以体积小、功能全、性价比高等诸多优点,在工业控制、家用电器、通信设备、信息处理、尖端武器等各种测控领域的应用中独占鳌头,单片机开发技术已成为电子信息、电气、通信、自动化、机电一体化等专业技术人员必须掌握的技术。 单片机单芯片的微小体积和低的成本,可广泛地嵌入到如玩具、家用电器、机器人、仪器仪表、汽车电子系统、工业控制单元、办公自动化设备、金融电子系统、舰船、个人信息终端及通讯产品中,成为现代电子系统中最重要的智能化工具,于是基于单片机的醒目而时尚的电子版万年历顺应而生。基于单片机的电子万年历结合了时钟和日历的功能,将其二者融为一体,在显示时间的同时还能显示日期和年、月,它主要是通过单片机来读取时钟芯片的时间、日期,然后送给显示设备显示出来。而电子万年历作为电子类小设计不仅是市场上的宠儿,也是是单片机实验中一个很常用的题目。因为它的有很好的开放性和可发挥性,因此对作者的要求比较高,不仅考察了对单片机的掌握能力更加强调了对单片机扩展的应用。而且在操作的设计上要力求简洁,功能上尽量齐全,显示界面也要出色。数字显示的日历钟已经越来越流行,特别是适合在家庭居室、办公室、大厅、会议室、车站和广场等使用,壁挂式LED数码管显示的日历钟逐渐受到人们的欢迎。LED数字显示的日历钟显示清晰直观、走时准确、可以进行夜视,并且还可以扩展出多种功能。

基于51单片机电子万年历设计

基于51单片机电子万年历设计 专业:机电设备维修与管理姓名:杜洪浦指导老师: 摘要电子万年历是一种非常广泛日常计时工具,对现代社会越来越流行。它可以对年、月、日、周日、时、分和秒进行计时,还具有闰年补偿等多种功能,而且DS1302的使用寿命长,误差小。对于数字电子万年历采用直观的数字显示,可以同时显示年、月、日、周日、时、分、秒等信息,还具有时间校准等功能。该电路采用AT89S52单片机作为核心,功耗小,能在3V的低压工作,电压可选用3到5V电压供电。 万年历的设计过程在硬件与软件方面进行同步设计。硬件部分主要由AT89C52单片机,液晶显示电路,复位电路,时钟电路,稳压电路电路以及串口下载电路等组成。在单片机的选择上使用了AT89C52单片机,该单片机适合于许多较为复杂控制应用场合。显示器使用液晶LCD1602。软件方面主要包括日历程序、液晶驱动程序,显示程序等。程序采用汇编语言编写。所有程序编写完成后,在Keil C51软件中进行调试,确定没有问题后,在Proteus软件中嵌入单片机内进行仿真。 关键词时钟电钟,DS1302,液晶LCD1602,单片机 目录 1设计要求与方案论证 (2) 1.1 设计要求 (2) 1.2 系统基本方案选择和论证 (2) 1.2.1单片机芯片的选择方案和论证 (2) 1.2.2 显示模块选择方案和论证 (3) 1.2.3时钟芯片的选择方案和论证: (3) 1.3 电路设计最终方案决定 (3) 2系统的硬件设计与实现 (3) 2.1 电路设计框图 (4) 2.2 系统硬件概述 (4) 2.3 主要单元电路的设计 (4) 2.3.1单片机主控制模块的设计 (4)

电子万年历课程设计报告

课程:创新与综合课程设计 电子与电气工程系 实践教学环节说明书 题目名称电子万年历 院(系)电子与电气工程学院 专业电子信息工程 班级119411 学号1109635010 学生姓名11 指导教师q1 起止日期13周周一~14周周五

电子万年历 一.设计目的 设计一个具有报时功能、停电正常运行(来电无需校时)、带有年月日、时分秒及星期显示的电子日历。 二.方案设计 硬件控制电路主要用了AT89S52芯片处理器、LCD1602显示器等。根据各自芯片的功能互相连接成电子万年历的控制电路。软件控制程序主要有主控程序、电子万年历的时间控制程序、时间显示及星期显示程序等组成。主控程序中对整个程序进行控制,进行了初始化程序及计数器、还有键盘功能程序、以及显示程序等工作,时间控制程序是电子万年历中比较重要的部分。时间控制程序体现了年、月、日、时、分、秒及星期的计算方法。时间控制程序主要是定时器0计时中断程序每隔10ms中断一次当作一个计数,每中断一次则计数加1,当计数100次时,则表示1秒到了,秒变量加1,同理再判断是否1分钟到了,再判断是否1小时到了,再判断是否1天到了,再判断是否1月到了,再判断是否1年到了,若计数到了则相关变量清除0。先给出一般年份的每月天数。如果是闰年,第二个月天数不为28天,而是29天。再用公式s=v-1 +〔(y-1/4〕-〔(y-1/100〕+〔(y-1/400〕+ d计算当前显示日期是星期几,当调节日期时,星期自动的调整过来。闰年的判断规则为,如果该年份是4或100的整数倍或者是400的整数倍,则为闰年;否则为非闰年。在我们的这个设计中由于只涉及100年范围内,所以判断是否闰年就只需要用该年份除4来判断就行了。 三.系统的设计框图 本系统以AT89S52单片机为核心,结合时钟芯片DS1302,LCD1602,键盘等外围器件,实现电子万年历的一系列功能,并通过液晶屏和按键控制完成人机交互的功能。系统总体设计框图如图(1)所示

电子万年历的设计与实现

毕业设计(论文)任务书 题目:电子万年历的设计与实现 任务与要求: 设计一以单片机为核心控制的万年历,具有多项显示和控制功能。要求:准确计 时,以数字形式显示当前年月日、星期、时间; 具有年月日、星期、时间的设置和调整功能;自行设计所需直流电源 时间: 2010年9 月 27 日至 2010 年 11 月 23 日共 8 周 所属系部:电子工程系

摘要 随着微电子技术的高速发展,单片机在国民经济的个人领域得到了广泛的运用。单片机以体积小、功能全、性价比高等诸多优点,在工业控制、家用电器、通信设备、信息处理、尖端武器等各种测控领域的应用中独占鳌头,单片机开发技术已成为电子信息、电气、通信、自动化、机电一体化等专业技术人员必须掌握的技术。 而电子万年历作为电子类小设计不仅是市场上的宠儿,也是是单片机实验中一个很常用的题目。因为它的有很好的开放性和可发挥性,因此对作者的要求比较高,不仅考察了对单片机的掌握能力更加强调了对单片机扩展的应用。而且在操作的设计上要力求简洁,功能上尽量齐全,显示界面也要出色。数字显示的日历钟已经越来越流行,特别是适合在家庭居室、办公室、大厅、会议室、车站和广场等使用,壁挂式LED数码管显示的日历钟逐渐受到人们的欢迎。LED数字显示的日历钟显示清晰直观、走时准确、可以进行夜视,并且还可以扩展出多种功能。所以,电子万年历无论作为比赛题目还是练习题目都是很有价值。 关键词:单片机;万年历 1

目录 1 概述 (5) 1.1单片机原理及应用简介 (5) 1.2系统硬件设计 (6) 1.3结构原理与比较.............................. 错误!未定义书签。2系统总体方案及硬件设计......................... 错误!未定义书签。 2.1系统总体方案................................ 错误!未定义书签。 2.2硬件电路的总体框图设计 (12) 2.3硬件电路原理图设计 (12) 3软件设计 (13) 3.1主程序流程图 (13) 3.2显示模块流程图 (14) 4P ROTEUS软件仿真 (15) 4.1仿真过程 (15) 4.2仿真结果 (16) 5课程设计体会 (17) 参考文献 (18) 附录:源程序代码附 (18) 结束语 (25) 2

基于液晶显示的万年历-毕设论文

毕业设计(论文)报告题目基于液晶显示的万年历 系别 专业 班级 学生姓名 学号

指导教师 2013年4 月

基于液晶显示的万年历 摘要: 本设计应用AT89S52芯片作为核心,采用C语言进行编程,实现以下功能:小时、分、秒、年、月、日、星期的显示和实时温度检测。该设计的电子时钟系统由时钟电路、LCD显示电路、按键调整电路和温度检测电路四部分组成。使用时钟芯片DS1302完成时钟日期的功能,以LCD1602为显示器,同时利用温度传感器DS18B20测量周围环境温度,并且可以依靠按键随时对日期时间进行调整。我们共设计四个按键,一个模式键,也就是我们用来选定被修改的数字的,两个调整键,一个“加”键和一个“减”键,当按下模式键,选定要调整的数字的时候,“加”、“减”可以帮我们调到所需的状态,还有一个复位键,显示精度为1秒。设计还提供三位实时温度检测并显示,其显示精度为0.1℃。 关键词: AT89S52、时钟日历芯片DS1302、温度传感器DS18B20、LCD1602

目录 前言 (1) 第一章方案选择与万年历研究情况 (2) 1.1 方案选择 (2) 1.1.1时钟芯片选择 (2) 1.1.2键盘选择 (3) 1.1.3显示模块选择 (3) 1.2电子万年历的研究情况 (4) 第二章主要硬件描述 (5) 2.1 AT89S52 (5) 2.1.1主要性能 (5) 2.1.2引脚说明 (5) 2.2 LCM1602 (8) 2.2.1工作原理 (8) 2.2.2端口引脚第二功能 (9) 2.2.3管脚功能 (10) 2.3 芯片DS1302 (11) 2.3.1工作原理 (11) 2.3.2引脚功能及结构 (12) 2.4 数字温度传感器DS18B20 (12) 2.4.1DS18B20工作原理 (12) 2.4.2DS18B20 引脚定义 (13) 第三章硬件设计与实现 (14) 3.1 单片机最小系统的设计 (14) 3.2 时钟电路的设计 (15) 3.3 温度采集模块的设计 (15) 3.4 LCDM1602显示模块设计 (16) 第四章系统软件设计与实现 (17)

单片机课程设计—万年历[1]

郑州轻工业学院 软件学院 单片机与接口技术课程设计总结报告 设计题目:电子万年历 学生姓名: 系别: 专业: 班级: 学号: 指导教师: 2011年12月16日

设计题目: 电子万年历 设计任务与要求: 1、显示年月日时分秒及星期信息 2、具有可调整日期和时间功能 3、增加闰年计算功能 方案比较: 方案一:系统分为主控制器模块、显示模块、按键开关模块,主控制模块采用 AT89C52单片机为控制中心,显示模块采用普通的共阴LED数码管,键输入采用中断实现 功能调整,计时使用AT89C52单片机自带的定时器功能,实现对时间、日期的操作,通 过按键盘开关实现对时间、日期的调整。 方案二:系统分为主控模块、时钟电路模块、按键扫描模块,LCD显示模块,电源 电路、复位电路、晶振电路等模块。主控模块采用AT89C52单片机,按键模块用四个按键,用于调整时间,显示模块采用LCD1602,时钟电路模块采用DS1302时钟芯片实现对 时间、日期的操作。 两个方案工作原理大致相同,只有显示模块和时钟电路不同。LED数码管价格适中,对于数字显示效果较好,而且使用单片机的端口也较少; LCD1602液晶显示屏,显示功 能强大,可以显示大量文字、图形,显示多样性,清晰可见,价格相对LED数码管来说 要昂贵些,但是基于本设计显示的东西较多,若采用LED数码管的话,所需数码管较多,而且不利于控制,因此选择LCD1602作为显示模块。DS1302是一款高性能的实时时钟芯片,以计时准确、接口简单、使用方便、工作电压范围宽和低功耗等优点,得到广泛的 应用,实时时钟有秒、分、时、星期、日、月和年,月小于31天时可以自动调整,并具 有闰年补偿功能,而且在掉电时能够在外部纽扣电池的供电下继续工作。单片机有定时 器的功能,但时间误差较大,且需要编写时钟程序,因此采用DS1302作为时钟电路。 对比以上方案,结合设计技术指标与要求我们选择了方案二进行设计。

用DS1302与LCD1602可调数字万年历课程设计

数字开发与实践 课 程 设 计 题目:用DS1302与LCD1602 设计可调式电子日历时钟 班级: 姓名: 学号: 学院: 二O一二年六月五日

用DS1302与LCD1602设计 的可调式电子日历时钟 一、总体设计 1.1、设计目的 为巩固所学的单片机知识,把所学理论运用到实践中,用LCD1602与DS1302 设计可调式电子日历时钟。 1.2、设计要求 (1)显示:年、月、日、时、分、秒和星期; (2)设置年、月、日、时、分、秒和星期的初始状态; (3)能够用4个按键调整日历时钟的年、月、日、时、分、秒和星期; 完成可调式电子日历时钟的硬件和软件的设计,包括单片机的相关内 容;日历时钟模块的设计,液晶显示模块的设计,按键模块的设计。 控制程序的编写等。 备注:本程序另外添加了每到上午8:10和下午2:10的闹钟提醒功能。 1.3、系统基本方案选择和论证 1.3.1、单片机芯片的选择方案 方案一: 采用89C51芯片作为硬件核心,采用Flash ROM,内部具有4KB ROM 存储空间,能于3V的超低压工作,而且与MCS-51系列单片机完全兼容。 方案二: 采用STC12C5A60S2系列单片机是宏晶科技生产的单时钟/机器周期(1T)的单片机,是高速/低功耗/超强抗干扰的新一代8051单片机,指令代码完全

兼容传统8051,但速度快8-12倍。内部集成MAX810专用复位电路,2路PWM,8路高速10位A/D转换(250K/S),针对电机控制,强干扰场合。但造价较高。 1.3.2 、显示模块选择方案和论证: 方案一: 采用点阵式数码管显示,点阵式数码管是由八行八列的发光二极管组成,对于显示文字比较适合,如采用显示数字显得太浪费,且价格也相对较高。所以不用此种作为显示。 方案二: 采用LED数码管动态扫描,虽然LED数码管价格适中,但要显示多个数字所需要的个数偏多,功耗较大,显示出来的只是拼音,而不是汉字。所以也不用此种作为显示。 方案三: 采用LCD液晶显示屏,液晶显示屏的显示功能强大,可显示大量字符,且视觉效果较好,外形美观。LCD1602可实现显示2行十六个字符。 1.3.3、时钟芯片的选择方案和论证: 方案一: 直接采用单片机定时计数器提供秒信号,使用程序实现年、月、日、星期、时、分、秒计数。采用此种方案虽然减少芯片的使用,节约成本,但是,实现的时间误差较大。所以不采用此方案。 方案二: 采用DS1302时钟芯片实现时钟,DS1302芯片是一种高性能的时钟芯片,可自动对秒、分、时、日、星期、月、年以及闰年补偿的年进行计数,而且精度高,31*8位的RAM做为数据暂存区,工作电压范围为2.5V~5.5V,2.5V时耗电小于300nA。 1.3.4、电路设计最终方案决定 综上各方案所述,对此次作品的方案选定:采用80C51作为主控制系统;DS1302提供时钟;LCD1602液晶带汉字库显示屏作为显示部分。

单片机电子万年历设计

单片机原理与应用 综合实验报告 电子万年历设计 专业班级:电子09-1 姓名: 学号: 时间: 指导教师: 20 年月日

电子万年历 电子09-1 舒绪榕 摘要:本设计是电子万年历。具备三个功能:能显示:年、月、日、时、分、秒及星期信息,并具有可调整日期和时间功能。 我选用的是单片机AT89C52来实现电子万年历的功能。该万年历可实现时钟显示、日期星期显示以及日期时间更改等功能。 该电子万年历使用12MHZ晶振与单片机AT89C52相连接,通过软件编程的方法实现了以24小时为一个周期,同时显示小时、分钟和秒的要求。利用单片机定时器及计数器产生定时效果通过编程形成数字钟效果,再利用数码管动态扫描显示单片机内部处理的数据。同时通过端口读入当前外部控制状态来改变程序的不同状态,实现不同功能。 电子万年历设计与制作可采用数字电路实现,也可以采用单片机来完成。若用数字电路完成,所设计的电路相当复杂,大概需要十几片数字集成块,其功能也主要依赖于数字电路的各功能模块的组合来实现,焊接的过程比较复杂,成本也非常高。若用单片机来设计制作完成,由于其功能的实现主要通过软件编程来完成,这样一来就降低了硬件电路的复杂性,从而使得其成本降低,更适合我们大学生自主研发。硬件部分主要由A T89C52单片机,LCD显示电路,以及调时按键电路等组成。在单片机的选择上本人使用了AT89C52单片机,该单片机适合于许多较为复杂控制应用场合。因此,采用单片机AT89C52原理制作的电子万年历,不仅仅在原理上能够成功实现计时等功能,也更经济,更适用,更符合我们实际生活的需要,对我们大学生来说也更加有用。 关键词:电子万年历52系列单片机时钟芯片FLASH存储器液晶显示 1引言 在日新月异的21世纪里,家用电子产品得到了迅速发展。许多家电设备都趋于人性化、智能化,这些电器设备大部分都含有CPU控制器或者是单片机。单片机以其高可靠性、高性价比、低电压、低功耗等一系列优点,近几年得到迅猛发展和大范围推广,广泛应用于工业控制系统、通讯设备、日常消费类产品和玩具等。并且已经深入到工业生产的各个环节以及人民生活的各个方面,如车间流水线控制、自动化系统等、智能型家用电器(冰箱、空调、彩电)等。用单片机来控制的小型家电产品具有便携实用,操作简单的特点。 本文设计的电子万年历属于小型智能家用电子产品。利用单片机进行控制,实时时钟芯片进行记时,外加显示电路,和温度显示电路,可实现时间的调整和和温度的显示。电子万年历既可广泛应用于家庭,也可应用于银行、邮电、宾馆、医院、学校、企业、商店等相关行业的大厅,以及单位会议室、门卫等场所。因而,此设计具有相当重要的现实意义和实用价值。 2 总体设计方案 2.1设计思路 2.1.1方案1——基于A T89S52单片机的电子万年历设计 不使用时钟芯片,而直接用AT89S52单片机来实现电子万年历设计。AT89S52是一种带8K 字节闪烁可编程可擦除只读存储器的低电压,高性能CMOS 8位微处理器,俗称单片机。单片机的可擦除只读存储器可以反复擦写1000余次。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89S52是一种高效微控制器,为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。 若采用单片机计时,利用它的一个16位定时器/计数器每50ms产生一个中断信号,中断20次后产生一个秒信号,然后根据时间进制关系依次向分、时、日、星期、月、年进位。这样就实

多功能电子万年历课程设计

课程设计(论文) 题目名称多功能电子万年历课程设计 课程名称单片机原理及应用 2012年6月18 日

摘要 本设计基于AT89C51单片机的多功能电子万年历的硬件结构和软硬件设计方法。系统以AT89C51单片机为控制器,以串行时钟日历芯片DS1302记录日历和时间,它可以对年、月、日、时、分、秒进行计时,还具有闰年补偿等多种功能。万年历采用直观的数字显示,可以在LED上同时显示年、月、日、周日、时、分、秒,还具有时间校准等功能。此万年历具有读取方便、显示直观、功能多样、电路简洁、成本低廉等诸多优点,具有广阔的市场前景。 关键词:AT89C51;电子万年历; DS1302

目录 1 绪论 (1) 1.1课题研究的背景 (1) 1.2课题的研究目的与意义 (1) 1.3课题解决的主要内容 (1) 2 系统的总体设计 (1) 2.1系统方案构思 (2) 2.2系统硬件框图 (2) 3 系统硬件的设计 (3) 3.1.1 器件的选用 (3) 3.1.2 AT89C51单片机 (3) 3.1.3单片机的选择 (6) 3.1.4 显示电路 (7) 3.1.5 ds1302时钟电路 (11) 4 系统软件的设计 (14) 4.1 算法设计、流程图、主程序 (14) 4.2 从1302读取日期和时间程序 (15) 5 系统仿真 (16) 5.1仿真环境PROTEUS (16) 5.2用PROTEUS ISIS对电子万年历的硬件电路设计 (16) 5.3用PROTEUS ISIS进行电子万年历的仿真测试 (20) 结论 (23) 致谢 (24) 参考文献 (25) 附录 (26) 附录1 (26)

电子万年历设计

课程论文论文题目基于单片机的电子万年历设计 课程名称单片机原理及接口技术 专业年级 2014级自动化3班 学生姓名孙宏远贾腾飞 学号 2016年12 月3 日

摘要: 本文介绍了基于AT89C51单片机的多功能电子万年历的硬件结构和软硬件设计方法。系统以AT89C51单片机为控制器,以串行时钟日历芯片DS1302记录日历和时间,它可以对年、月、日、时、分、秒进行计时,还具有闰年补偿等多种功能。万年历采用直观的数字显示,可以在LED上同时显示年、月、日、周日、时、分、秒,还具有时间校准等功能。此万年历具有读取方便、显示直观、功能多样、电路简洁、成本低廉等诸多优点,具有广阔的市场前景。。 关键词:AT89C51单片机,DS1602时钟芯片,LCD1602显示屏。串口通信。 一:引言 本设计的基于单片机控制的电子万年历,具有年、月、日、星期、时、分、秒的显示等功能,实现过程就是由主控制发送信息给DS1302时钟芯片再由时钟芯片反馈给单片机,再由主控制器传送给LCD1602显示屏显示信息。并且可以在键盘设置模块输入修改时间,当键盘设置时间、日期时,单片机主控制根据输入信息,通过串口通信传送给DS1302时钟芯片,DS1302芯片读取当前新信息产生反馈传送给单片机,然后单片机根据控制最后输送显示信息到LCD1602液晶显示屏模块上显示。 二:硬件设计: 2.0.硬件的设计总框图 2.1 DS1032时钟电路 DS1302的引脚排列,其中Vcc1为后备电源,VCC2为主电源。在主电源关闭的情况下,也能保持时钟的连续运行。DS1302由Vcc1或Vcc2两者中的较大者供电。当Vcc2大于Vcc1+0.2V时,Vcc2给DS1302供电。当Vcc2小于Vcc1时,DS1302由Vcc1供电。X1和X2是振荡源,外接32.768kHz晶振。芯片如图。 DS1302的内部主要由移位寄存器、指令和控制逻辑、振荡分频电路、实时时钟以及RAM组成。每次操作时,必须首先把CE置为高电平。再把提供地址和命令信息的8位装入移位寄存器。数据在SCLK的上升沿串行输入。无论是读周期还是写周期发生,也无论传送方式是单字节还是多字节,开始8位将指定内部何处被进行访问。在开始 8个时钟周期把含有地址信息的命令字装入移位寄存器之后。紧随其后的时钟在读操作时输出数据。 2.2 LCD1602与AT89C52的引脚接线 LCD1602采用总线式与单片机相连,AT89c52的P1口直接与液晶模块的数据总线D0~D7相连;P2 口的0,1,2脚分别与液晶模块的RS、RW、E脚相连。滑动变阻器用于调整液晶显示的亮度。电路如图

基于AT89C51单片机的电子万年历的设计_课程设计报告

课程设计报告 设计名称:电子万年历设计 专业班级:自动化10101班 完成时间:2013年6月9日 报告成绩:

摘要 本文介绍了基于AT89C51单片机的多功能电子万年历的硬件结构和软硬件设计方法。系统以AT89C51单片机为控制器,以串行时钟日历芯片DS1302记录日历和时间,它可以对年、月、日、时、分、秒进行计时,还具有闰年补偿等多种功能。万年历采用直观的数字显示,可以在LED上同时显示年、月、日、周日、时、分、秒,还具有时间校准等功能。此万年历具有读取方便、显示直观、功能多样、电路简洁、成本低廉等诸多优点,具有广阔的市场前景。 关键字AT89C51;电子万年历; DS1302

1 绪论 1.1 课题研究的背景 随着科技的快速发展,时间的流逝,从观太阳、摆钟到现在电子钟,人类不断研究,不断创新纪录。它可以对年、月、日、时、分、秒进行计时,还具有闰年补偿等多种功能,而且DS1302的使用寿命长,误差小。对于数字电子万年历采用直观的数字显示,可以同时显示年、月、日、时、分、秒和温度等信息,还具有时间校准等功能。该电路采用AT89C51单片机作为核心,功耗小,能在3V 的低压工作,电压可选用3~5V电压供电。 此万年历具有读取方便、显示直观、功能多样、电路简洁、成本低廉等诸多优点,符合电子仪器仪表的发展趋势,具有广阔的市场前景。 1.2课题的研究目的与意义 二十一世纪是数字化技术高速发展的时代,而单片机在数字化高速发展的时代扮演着极为重要的角色。电子万年历的开发与研究在信息化时代的今天亦是当务之急,因为它应用在学校、机关、企业、部队等单位礼堂、训练场地、教学室、公共场地等场合,可以说遍及人们生活的每一个角落。所以说电子万年历的开发是国家之所需,社会之所需,人民之所需。 由于社会对信息交换不断提高的要求及高新技术的逐步发展,促使电子万年历发展并且投入市场得到广泛应用。 1.3课题解决的主要内容 本课题所研究的电子万年历是单片机控制技术的一个具体应用,主要研究内容包括以下几个方面: (1)选用电子万年历芯片时,应重点考虑功能实在、使用方便、单片存储、低功耗、抗断电的器件。 (2)根据选用的电子万年历芯片设计外围电路和单片机的接口电路。 (3)在硬件设计时,结构要尽量简单实用、易于实现,使系统电路尽量简单。 (4)根据设计的硬件电路,编写控制AT89C51芯片的单片机程序。 (5)通过编程、编译、调试,把程序下载到单片机上运行,并实现本设计的功能。 (6)在硬件电路和软件程序设计时,主要考虑提高人机界面的友好性,方便用户操作等因素。 (7)软件设计时必须要有完善的思路,要做到程序简单,调试方便。

万年历系统设计方案

电子万年历系统设计 The design of Electronic calendar system 专业:电子信息科学与技术 学号: 姓名:

电子万年历系统设计 摘要:近年来随着计算机在社会领域的渗透和大规模集成电路的发展,单片机的应用正在不断地走向深入,由于它具有功能强,体积小,功耗低,价格便宜,工作可靠,使用方便等特点,因此特别适合于与控制有关的系统,并且给人类生活带来了根本性的改变。尤其是单片机技术的应用产品已经走进了千家万户。电子万年历的出现给人们的生活带来的诸多方便。虽然在日常生活中,各种信息处理终端如电脑、手机等给我们提供了准确的时间信息。但是在大多数场合却仅仅局限于个人的适用围之。在家居生活中,一款悬挂余居室墙壁上大方得体的电子钟不仅能为我们提供准确的时间显示,而且魅惑了环境,给单调的居室带来了现代化的气息,因而成为许多家庭的必备之选。 本文设计了一种基于八位串行输入-并行输出移位寄存器74HC164芯片,以STC89C52单片机为核心、数码显示的电子万年历,主要介绍了时钟芯片、温度传感器、仿真模块,以及万年历硬件和软件的设计,实现了准确显示,公历年、月、日、农历月、日、时、分、秒功能。 关键字:单片机;时钟芯片;温度传感器;仿真

The Design of Electronic Calendar System Abtract:In recent years, with computer penetration in the social sphere and the development of large-scale integrated circuits, MCU applications are constantly deepening, as it has a function of strong, small size, low power consumption, cheap, reliable, easy to use , And other characteristics, and therefore particularly suited to control the system and to human life brought about fundamental changes. SCM is by the application of technology products have entered the tens of thousands of households. The emergence of electronic calendar to the lives of people of many convenience. While in everyday life, dealing with all kinds of information terminals such as computers, mobile phones has provided us with accurate time information. However, in most occasions is limited to individuals within the scope of the application. In home life, hoisted more than a generous living room walls of the appropriate electronic bell can not only provide us with accurate time, and tantalized by the environment, bring to the monotonous room a modern flavor, so many families must Of the election. In this paper, a design based on eight serial input - output parallel shift register 74 HC164 chip to STC89C52 microcontroller as the core, digital display electronic calendar, mainly on the clock chip temperature sensor, simulation modules, hardware and calendar And software design, to achieve an accurate, the calendar year, month, day and the Lunar month, day, hours, minutes and seconds functions. Key words:MCU;Clock chip;Temperature sensor;Simulation

基于单片机的液晶显示“万年历”

宁波大红鹰学院 《单片机原理及应用》课程设计报告 课题名称:单片机液晶显示“万年历” 分院:机械与电气工程学院 教研室:电气工程及其自动化 班级: 09电自3 姓名:徐卡达 学号:0 指导教师:杨会保 二○一二年五月

单片机液晶显示“万年历” 一、设计任务 利用STC89C52RC单片机设计一个具有如下功能的电子万年历: (一)、能够显示年、月、日、时、分、秒、星期 (二)、能正确显示闰年日期 (三)、用独立键盘进行校时 二、硬件设计 1、系统框图 按照系统设计的要求和功能,将系统分为主控模块、时钟电路模块、按键扫描模块、LCD显示模块、蜂鸣器电路、电源电路、复位电路、晶振电路几个模块,系统框图如图1所示。主控模块采用STC89C52RC单片机,按键模块用5个按键,用于调整时间和设定闹钟,显示模块采用LCD1602,时钟电路模块采用DS1302实时时钟实现对时间,日期的操作。 图1 基于AT89C52RC单片机的电子万年历系统框图 2、原理图 基于STC89C52RC单片机的电子万年历硬件仿真电路图如图10所示,系统由STC89C52RC单片机、按键扫描电路、显示电路、时钟电路、晶振电路、复位电路、蜂鸣器电路组成。

图2 电子万年历仿真图 3、各部分介绍 (1)、主控模块 控制芯片使用STC89C52,控制系统如下图: 图3 STC89C52RC主控模块 主控制芯片采用STC89C52,系统包括晶振电路、复位电路、下载接口。

(2)、时钟芯片 时钟芯片使用DS1302,该模块电路原理图如下图: 图4 DS1302时钟电路 时钟电路采用的是ds1302芯片,DS1302 是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能,工作电压为~。采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。工作电压与单片机的输入电压比较适合。上面是它的一些基本的应用介绍。下面是它的引脚的描述: 图5 DS1302引脚 下面是DS1302的时钟寄存器。我们要读取的时间数据就是从下面这些数据寄存器中读取出来的。当我们要想调整时间时,可以把时间数据写入到相应的寄存器中就可以了。 图6 DS1302的时钟寄存器 DS1302和单片机的连接很简单。只需一根复位线,一根时钟线,一根数据

单片机电子万年历课程设计

单片机课程设计 姓名:吕长明 学号:021 专业班级:机电四班

一、单片机原理及应用简介 随着国内超大规模集成电路的出现,微处理器及其外围芯片有了迅速的发展。集成技术的最新发展之一是将CPU和外围芯片,如程序存储器、数据存储器、并行、串行I/O口、定时/计数器、中断控制器及其他控制部件集成在一个芯片之中,制成单片计算机(Single-Chip Microcomputer)。而近年来推出的一些高档单片机还包括有许多特殊功能单元,如A/D、D/A 转换器、调制解调器、通信控制器、锁相环、DMA、浮点运算单元等。因此,只要外加一些扩展电路及必要的通道接口就可以构成各种计算机应用系统,如工业控制系统、数据采集系统、自动测试系统、万年历电子表等。 二、系统硬件设计 8052 是标准的40引脚双列直插式集成电路芯片,引脚分布请参照----单片机引脚图图1: 图1 8052引脚 ~ P0口8位双向口线(在引脚的39~32号端子)。 ~ P1口8位双向口线(在引脚的1~8号端子)。 ~ P2口8位双向口线(在引脚的21~28号端子)。 ~ P2口8位双向口线(在引脚的10~17号端子)。 8052芯片管脚说明: VCC:供电电压。 GND:接地。P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL 门电流。当P1口的管脚第一次写1时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。在FIASH编程时,P0

口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。 P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH 编程和校验时,P1口作为第八位地址接收。 P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时,P2口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。P2口在FLASH编程和校验时接收高八位地址信号和控制信号。 P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL 门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。 P3口也可作为AT89C51的一些特殊功能口,如表1所示: 表1 特殊功能口 P3口同时为闪烁编程和编程校验接收一些控制信号。 RST:复位输入。当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。 ALE/PROG:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。在FLASH编程期间,此引脚用于输入编程脉冲。一般情况下,ALE 端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用

相关文档
最新文档