电子万年历设计报告

时间:2024.4.20

单片机课程设计

课题:电子万年历设计

系 别:电气与电子工程系

专 业:电子信息工程

姓 名:**

学 号:**

河南城建学院

20**年 12 月 28 日

摘要……………………………………………………………………Ⅰ

Abstract……………………………………………………………….Ⅰ

1绪论(课题背景、概述、目的)…………………………………..1

2 设计要求与方案论述……………………………………………….3

2.1设计要求…………………………………………………………...3

2.2创新要求 ………………………………………………………….3

2.3系统的方案选择…………………………………………………...3

2.4 电路设计最终方案 ……..………………………………….…….5

3 系统的硬件设计与实现…………………………………………….6

3.1电路设计框图……………………………………………………...6

3.2 硬件设计原理概述………………………………………………..6

3.3 主要模块的设计…………………………………………………..6

4系统的软件设计与实现…………………………………………….10

4.1程序流程框图…………………………………………….……….10

4.2程序的设计………………………………………………………..10

5总结 ………………………………………………………………...14

参考文献 ……………………………………………………………..15

附录1硬件电路全图…………………………………………………16

附录2程序……………………………………………………………17

摘 要

本设计基于AT89s51单片机,结合DS1302时钟芯片设计了一个数字万年历,显示部分用数码管动态显示,初始时间可由按键设置,此外还具有温度显示功能,掉电保护功能。万年历还具有节能模式,具有很强的实用性。

关键词:单片机 万年历 数码管显示 温度

Abstract

This paper is designed based on the AT89s52 SCM, Combining DS1302 clock chip. Display section is using digital tube dynamic display ; Initial time can be set by the button ; In addition , it has the temperature display function and the power-off protected function. Besides, it has energy saving mode;This calendar has strong Digital tube display practicability.

Keywords:scm;calendar; digital tube display; temperature display

1绪论

1.1设计背景

电子万年历是实现对年,月,日,时,分,秒数字显示的计时装置,广泛用于个人家庭,车站, 码头,办公室,银行大厅等场所,成为人们日常生活中的必需品。数字集成电路的发展和石英晶体振荡器的广泛应用,使得数字钟的精度远远超过老式钟表。钟表的数字化给人们生产生活带来了极大的方便,在此基础上完成的万年历精度高,功能易于扩展。可扩展成为诸如定时自动报警、按时自动打铃、时间程序自动控制、定时广播、自动起闭路灯、定时开关烘箱、通断动力设备、甚至各种定时电气的自动启用等电路。所有这些,都是以钟表数字化为基础的。因此,研究数字时钟及扩大其应用有着非常现实的意义。本设计就是数字时钟简单的扩展应用。

万年历的设计过程在硬件与软件方面进行同步设计。

1.2硬件部分

硬件部分主要由AT89S52单片机,LED显示电路,以及调时按键电路等组成。在单片机的选择上使用AT89S52单片机,该单片机适合于许多较为复杂控制应用场合。采用4-16译码器作为选择端,控制共阴数码管动态显示,结合时钟芯片DS1302和温度传感器18B20显示时间和温度。制作前在Proteus软件中嵌入单片机内进行仿真可以更好的进行硬件布局。

1.3软件部分

软件方面主要包括日历程序、时间调整程序,显示程序等。程序采用C语言编写,以便更简单地实现调整时间及阴历显示功能。所有程序编写完成后,在keil软件中进行调试,确定没有问题后,在Proteus软件中嵌入单片机内进行仿真。

2设计要求与方案论证

2.1设计要求:

2.1.1具有年、月、日、星期、时、分、秒等功能;

2.1.2万年历具有闰月识别显示功能;

2.1.3具备年、月、日、星期、时、分、秒校准功能;

2.2 创新要求

2.2.1万年历具有阴历显示功能;

2.2.2 具有测量室内温度功能;

2.3 系统基本方案选择和论证

2.3.1单片机芯片的选择方案和论证:

方案一:

采用89C51芯片作为硬件核心,采用Flash ROM,内部具有4KB ROM 存储空间,能于3V的超低压工作,而且与MCS-51系列单片机完全兼容,但是运用于电路设计中时由于不具备ISP在线编程技术, 当在对电路进行调试时,由于程序的错误修改或对程序的新增功能需要烧入程序时,对芯片的多次拔插会对芯片造成一定的损坏。

方案二:

采用AT89S52,片内ROM全都采用Flash ROM;能以3V的超底压工作;同时也与MCS-51系列单片机完全该芯片内部存储器为8KB ROM 存储空间,同样具有89C51的功能,且具有在线编程可擦除技术,当在对电路进行调试时,由于程序的错误修改或对程序的新增功能需要烧入程序时,不需要对芯片多次拔插,所以不会对芯片造成损坏。

所以选择采用AT89S52作为主控制系统.

2.3.2 显示模块选择方案和论证:

方案一:

采用LED液晶显示屏,液晶显示屏的显示功能强大,可显示大量文字,图形,显示多样,清晰可见,但是价格昂贵,需要的接口线多,所以在此设计中不采用LED液晶显示屏.

方案二:

采用点阵式数码管显示,点阵式数码管是由八行八列的发光二极管组成,对于显示文字比较适合,如采用在显示数字显得太浪费,且价格也相对较高,所以也不用此种作为显示.

方案三:

采用LED数码管动态扫描,LED数码管价格适中,对于显示数字最合适,而且采用动态扫描法与单片机连接时,占用的单片机口线少。

所以采用了LED数码管作为显示。

2.3.3时钟芯片的选择方案和论证:

方案一:

直接采用单片机定时计数器提供秒信号,使用程序实现年、月、日、星期、时、分、秒计数。采用此种方案虽然减少芯片的使用,节约成本,但是,实现的时间误差较大。所以不采用此方案。

方案二:

采用DS1302时钟芯片实现时钟,DS1302芯片是一种高性能的时钟芯片,可自动对秒、分、时、日、周、月、年以及闰年补偿的年进行计数,而且精度高,位的RAM做为数据暂存区,工作电压2.5V~5.5V范围内,2.5V时耗电小于300nA.

2.4 电路设计最终方案

综上各方案所述,对此次作品的方案选定: 采用AT89S52作为主控制系统; DS1302提供时钟;数字式温度传感器;LED数码管动态扫描作为显示。

3.系统的硬件设计与实现

3.1 电路设计框图

https://upload.fanwen118.com/wk-img/img100/3614551_1.jpg

图2.1 电路设计框图

3.2 系统硬件概述

本电路是由AT89S52单片机为控制核心,具有在线编程功能,低功耗,能在3V超低压工作;时钟电路由DS1302提供,它是一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V~5.5V。采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。温度的采集由DS18B20构成;显示部份由17个数码管,74ls154译码器构成。使用动态扫描显示方式对数字的显示。

3.3 主要模块的设计

3.3.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引脚为电源端. 如图3.3.1 所示

https://upload.fanwen118.com/wk-img/img100/3614551_2.jpg

图3.3.1 主控制系统

3.3.2时钟电路模块的设计

图3.3.2示出DS1302的引脚排列,其中Vcc1为后备电源,Vcc2为主电源。在主电源关闭的情况下,也能保持时钟的连续运行。DS1302由Vcc1或Vcc2两者中的较大者供电。当Vcc2大于Vcc1+0.2V时,Vcc2给DS1302供电。当Vcc2小于Vcc1时,DS1302由Vcc1供电。X1和X2是振荡源,外接32.768KHz晶振。RST是复位/片选线,通过把RST输入驱动置高电平来启动所有的数据传送。RST输入有两种功能:首先,RST接通控制逻辑,允许地址/命令序列送入移位寄存器;其次,RST提供终止单字节或多字节数据的传送手段。当RST为高电平时,所有的数据传送被初始化,允许对DS1302进行操作。如果在传送过程中RSTS置为低电平,则会终止此次数据传送,I/O引脚变为高阻态。上电动行时,在Vcc大于等于2.5V之前,RST必须保持低电平。中有在SCLK 为低电平时,才能将RST置为高电平,I/O为串行数据输入端(双向)。SCLK始终是输入端。

https://upload.fanwen118.com/wk-img/img100/3614551_3.jpg

图3.3.2 DS1302的引脚图

3.3.3温度传感器模块

https://upload.fanwen118.com/wk-img/img100/3614551_4.jpg

图3.3.318B20的引脚图

3.3.4显示模块的设计

如图3.3.4所示,采用动态扫描显示,由17个数码管,4-16译码器74LS154接1K限流电阻接到共阴数码管的CoM端作为选通位码,每位选择相应的列,P0口输出数据再接9013三极管送达数码管。

https://upload.fanwen118.com/wk-img/img100/3614551_5.jpg

图3.3.4显示模块

4.系统的软件设计

4.1程序流程框图

https://upload.fanwen118.com/wk-img/img100/3614551_6.jpg

图4.1程序流程框图

4.2 子程序的设计

4.2.1 读、写DS1302子程序

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

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

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

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

void Write1302(unsigned char ucAddr, unsigned char ucDa)

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

Write1302(0x8c,num) ;//写入year

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

4.2.2 读18b20子程序

//读取温度

unsigned char ReadTemperature(void)

{

unsigned char a=0;

unsigned char b=0;

unsigned char t=0;

Init_DS18B20();

WriteOneChar(0xCC); // 跳过读序号列号的操作

WriteOneChar(0x44); // 启动温度转换

delay_18b20(200);

Init_DS18B20();

WriteOneChar(0xCC); //跳过读序号列号的操作

WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度

a=ReadOneChar();

b=ReadOneChar();

b<<=4;

b+=(a&0xf0)>>4;

t=b;

return(t);

}

4.2.3 显示模块子程序

void display()

{

//年

P2=0xf0;

P0=seg[2];

delay(1);

}

4.2.4按键子程序

https://upload.fanwen118.com/wk-img/img100/3614551_7.jpg

图4.2.4按键子程序流程图

5 总结

在整个设计过程中,发挥团队精神,分工合作,充分发挥人的主观能动性,自主学习,学到了许多没学到的知识。较好的完成了作品。达到了预期的目的,在最初的设计中,相互学习、相互讨论、研究,完了最初的设想。在电路焊接时虽然没什么大问题,但从中也知道了焊接在整个作品中的重要性,电路工程量大,不能心急,一个个慢慢来不能急于求成。对电路的设计、布局要先有一个好的构思,才显得电路板美观、大方。程序编写中,由于思路不清晰,开始时遇到了很多的问题,经过静下心来思考,和同组员的讨论,理清了思路。在此次设计中,知道了做凡事要有一颗平常的心,不要想着走捷径,一步一脚印。也练就了我们的耐心,做什么事都在有耐心。

致谢:

感谢学院给我们提供了一个展现自己的舞台,给我们一次难得煅炼的机会,使得我们的动手能力和专业技能都有了很大的提高。感谢给我帮助的老师和同学,在你们的帮助下我才能完成这次设计。

参考文献

1.张齐,朱宁西 单片机系统设计与开发 华南理工大学 电子机械出版社.2008

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

3.张友德,赵志英,涂时亮 单片微型机 复旦大学复旦大学出版社.2006

4.谭浩强. C程序设计(第三版).北京:清华大学出版社.2005

5.谭浩强. C程序设计题解与上机指导(第三版).北京:清华大学出版社.2005

6.徐慧 林锐 C语言实例解析精粹 .武汉:华中理工大学出版社.1996

7.戴建鹏译 C语言大全(第三版) .北京:电子工业大学出版社.1994

8.杨恢先,黄辉先 单片机原理及应用 人民邮电出版社.2006

附录1硬件电路全图

https://upload.fanwen118.com/wk-img/img100/3614551_8.jpg

附录2程序

#include<reg51.h>

#define uchar unsigned char

#define uint unsigned int

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

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

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

sbit DQ = P1^4 ; //18B20接口

sbit mode=P3^4;

sbit inc=P3^5;

sbit dec=P3^6;

sbit power=P3^7;

sbit week_wei=P1^5; //星期位选

sbit encode=P1^6; //译码器使能

sbit ACC0 = ACC^0; //累加器位定义

sbit ACC7 = ACC^7;

uchar code seg[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

uchar temp,year,month,date,hour,minute,second,week,position;

bit flag; //开关显示标志

/*********************延时ms***********************/

void delay(uint z)

{

uint x,y;

for(x=z;x>0;x--)

for(y=112;y>0;y--);

}

/***********************************************************

******************DS1302驱动程序******************

************************************************************/

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_init()

{

if(Read1302(0xc1) != 0xf0)

{

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

Write1302(0xc0,0xf0) ; //写入初始化标志 ,系统上电后检测此标志,即此子函数只会在第一次初始化一次。

/******时间初始值******/

Write1302(0x8c,0x10) ;//年

Write1302(0x88,0x04) ;//月

Write1302(0x86,0x06) ;//日

Write1302(0x84,0x22) ;//时

Write1302(0x82,0x59) ;//分

Write1302(0x80,0x55) ;//秒

Write1302(0x90,0xa4) ;//充电

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

}

}

/***********************************************************

******************DS18B20驱动程序******************

************************************************************/

/*************************************************************************************/

void delay_18b20(unsigned int i)//延时函数

{

while(i--);

}

/***************************************************************************************/

//18b20初始化函数

void Init_DS18B20(void)

{

unsigned char x=0;

DQ = 1; //DQ复位

delay_18b20(8); //稍做延时

DQ = 0; //单片机将DQ拉低

delay_18b20(80); //精确延时 大于 480us

DQ = 1; //拉高总线

delay_18b20(10);

x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败

delay_18b20(5);

}

//读一个字节

unsigned char ReadOneChar(void)

{

unsigned char i=0;

unsigned char dat = 0;

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

{

DQ = 0; // 给脉冲信号

dat>>=1;

DQ = 1; // 给脉冲信号

if(DQ)

dat|=0x80;

delay_18b20(5);

}

return(dat);

}

//写一个字节

void WriteOneChar(unsigned char dat)

{

unsigned char i=0;

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

{

DQ = 0;

DQ = dat&0x01;

delay_18b20(5);

DQ = 1;

dat>>=1;

}

delay_18b20(5);

}

//读取温度

unsigned char ReadTemperature(void)

{

unsigned char a=0;

unsigned char b=0;

unsigned char t=0;

Init_DS18B20();

WriteOneChar(0xCC); // 跳过读序号列号的操作

WriteOneChar(0x44); // 启动温度转换

delay_18b20(200);

Init_DS18B20();

WriteOneChar(0xCC); //跳过读序号列号的操作

WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度

a=ReadOneChar();

b=ReadOneChar();

b<<=4;

b+=(a&0xf0)>>4;

t=b;

return(t);

}

/*************************************************/

void display()

{

//年

P2=0xf0;

P0=seg[2];

delay(1);

P2=0xf1;

P0=seg[0];

delay(1);

P2=0xf2;

P0=seg[year/16];

delay(1);

P2=0xf3;

P0=seg[year%16];

delay(1);

//month

P2=0xf4;

P0=seg[month/16];

delay(1);

P2=0xf5;

P0=seg[month%16];

delay(1);

//date

P2=0xf6;

P0=seg[date/16];

delay(1);

P2=0xf7;

P0=seg[date%16];

delay(1);

// hour

P2=0xf8;

P0=seg[hour/16];

delay(1);

P2=0xf9;

P0=seg[hour%16];

delay(1);

//minute

P2=0xfa;

P0=seg[minute/16];

delay(1);

P2=0xfb;

P0=seg[minute%16];

delay(1);

//second

P2=0xfc;

P0=seg[second/16];

delay(1);

P2=0xfd;

P0=seg[second%16];

delay(1);

//temp

P2=0xfe;

P0=seg[temp/10];

delay(1);

P2=0xff;

P0=seg[temp%10];

delay(1);

//week

encode=1;

week_wei=0;

P0=seg[week];

delay(1);

encode=0;

week_wei=1;

P0=0;

}

void set()

{

if(mode==0)

{

delay(5);

if(mode==0)

{

position++;

if(position==7)

position=0;

}

while(!mode); //再次确认是否松开,松开就跳出while语句

}

/////////////////////////////////////////

if(position==1) //year

{

int num;

if(inc==0)

{ delay(5);

if(inc==0)

{

num=Read1302(0x8d);

num=(num/16)*10+num%16;

num++;

if(num==99) num=0;

num=(num/10)*16+num%10;

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

Write1302(0x8c,num) ;//写入year

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

}

while(!inc); //再次确认是否松开,松开就跳出while语句

}

////////////

else if(dec==0)

{ delay(5);

if(dec==0)

{

num=Read1302(0x8d);

num=(num/16)*10+num%16;

num--;

if(num==-1) num=99;

num=(num/10)*16+num%10;

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

Write1302(0x8c,num) ;//写入year

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

}

while(!dec); //再次确认是否松开,松开就跳出while语句

}

///////////////

year=Read1302(0x8d); //年

P2=0xf0;

P0=seg[2];

delay(4);

P2=0xf1;

P0=seg[0];

delay(4);

P2=0xf2;

P0=seg[year/16];

delay(4);

P2=0xf3;

P0=seg[year%16];

delay(4);

//////////////////////////

}

/************************/

else if(position==2) //month

{

int num;

if(inc==0)

{ delay(5);

if(inc==0)

{

num=Read1302(0x89);

num=(num/16)*10+num%16;

num++;

if(num==13) num=1;

num=(num/10)*16+num%10;

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

Write1302(0x88,num) ;//写入month

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

}

while(!inc); //再次确认是否松开,松开就跳出while语句

}

////////////

else if(dec==0)

{ delay(5);

if(dec==0)

{

num=Read1302(0x89);

num=(num/16)*10+num%16;

num--;

if(num==0) num=12;

num=(num/10)*16+num%10;

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

Write1302(0x88,num) ;//写入month

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

}

while(!dec); //再次确认是否松开,松开就跳出while语句

}

///////////////

month=Read1302(0x89); //month

P2=0xf4;

P0=seg[month/16];

delay(8);

P2=0xf5;

P0=seg[month%16];

delay(8);

//////////////////////////

}

/****************************************/

else if(position==3) //date

{

int num;

if(inc==0)

{ delay(5);

if(inc==0)

{

num=Read1302(0x87);

num=(num/16)*10+num%16;

num++;

if(num==32) num=1;

num=(num/10)*16+num%10;

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

Write1302(0x86,num) ;//写入date

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

}

while(!inc); //再次确认是否松开,松开就跳出while语句

}

////////////

else if(dec==0)

{ delay(5);

if(dec==0)

{

num=Read1302(0x87);

num=(num/16)*10+num%16;

num--;

if(num==0) num=31;

num=(num/10)*16+num%10;

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

Write1302(0x86,num) ;//写入date

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

}

while(!dec); //再次确认是否松开,松开就跳出while语句

}

///////////////

date=Read1302(0x87); //date

P2=0xf6;

P0=seg[date/16];

delay(8);

P2=0xf7;

P0=seg[date%16];

delay(8);

//////////////////////////

}

/************************/

else if(position==4) //hour

{

int num;

if(inc==0)

{ delay(5);

if(inc==0)

{

num=Read1302(0x85);

num=(num/16)*10+num%16;

num++;

if(num==24) num=0;

num=(num/10)*16+num%10;

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

Write1302(0x84,num) ;//写入hour

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

}

while(!inc); //再次确认是否松开,松开就跳出while语句

}

////////////

else if(dec==0)

{ delay(5);

if(dec==0)

{

num=Read1302(0x85);

num=(num/16)*10+num%16;

num--;

if(num==-1) num=23;

num=(num/10)*16+num%10;

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

Write1302(0x84,num) ;//写入hour

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

}

while(!dec); //再次确认是否松开,松开就跳出while语句

}

///////////////

hour=Read1302(0x85);

P2=0xf8;

P0=seg[hour/16];

delay(8);

P2=0xf9;

P0=seg[hour%16];

delay(8);

//////////////////////////

}

/****************************************/

else if(position==5) //minute

{

int num;

if(inc==0)

{ delay(5);

if(inc==0)

{

num=Read1302(0x83);

num=(num/16)*10+num%16;

num++;

if(num==60) num=0;

num=(num/10)*16+num%10;

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

Write1302(0x82,num) ;//写入minute

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

}

while(!inc); //再次确认是否松开,松开就跳出while语句

}

////////////

else if(dec==0)

{ delay(5);

if(dec==0)

{

num=Read1302(0x83);

num=(num/16)*10+num%16;

num--;

if(num==-1) num=59;

num=(num/10)*16+num%10;

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

Write1302(0x82,num) ;//写入minute

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

}

while(!dec); //再次确认是否松开,松开就跳出while语句

}

minute=Read1302(0x83);

P2=0xfa;

P0=seg[minute/16];

delay(8);

P2=0xfb;

P0=seg[minute%16];

delay(8);

}

/****************************************/

else if(position==6) //week

{

int num;

if(inc==0)

{ delay(5);

if(inc==0)

{

num=Read1302(0x8b);

num=(num/16)*10+num%16;

num++;

if(num==8) num=1;

num=(num/10)*16+num%10;

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

Write1302(0x8a,num) ;//写入week

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

}

while(!inc); //再次确认是否松开,松开就跳出while语句

}

else if(dec==0)

{ delay(5);

if(dec==0)

{

num=Read1302(0x8b);

num=(num/16)*10+num%16;

num--;

if(num==0) num=7;

num=(num/10)*16+num%10;

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

Write1302(0x8a,num) ;//写入week

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

}

while(!dec); //再次确认是否松开,松开就跳出while语句

}

week=Read1302(0x8b);

encode=1;

week_wei=0;

P0=seg[week];

delay(16);

}

/*****************************************/

}

void main()

{

DS1302_init();

while(1)

{

if(power==0)

{ delay(5);

if(power==0)

flag=!flag;

while(!power);

}

//////////////////////

if(position==0)

{

if(flag)

P0=0;

else

{

temp=ReadTemperature();

year=Read1302(0x8d);

month=Read1302(0x89);

date=Read1302(0x87);

hour=Read1302(0x85);

minute=Read1302(0x83);

second=Read1302(0x81);

week=Read1302(0x8b);

encode=0;

display();

}

}

/////////////////////

set();

/////////////////////

}

}

更多相关推荐:
万年历设计报告

课程学院计算机与信息工程学院班级学号姓名王智论文报告万年历12级通信3班20xx47561引言万年历是我国古代传说中最古老的一部太阳历为纪念历法编撰者万年的功绩便将这部历法命名为万年历而现在所使用的万年历实际上...

万年历课程设计报告

西安文理学院软件学院课程设计报告设计名称设计题目万年历学生学号1402110147专业班级软件工程一班学生姓名罗强强学生成绩指导教师职称课题工作时间20xx1115至20xx1129软件学院课程设计任务书指导教...

万年历设计报告

JAVA万年历设计报告学习中心层次专业姓名学号榆林绥德教师进修学校专升本计算机科学与技术李利平61271510310003JAVA万年历设计报告一课程实习目的1为用户开发一个便捷的万年历2对java技术的灵活应...

C语言万年历设计报告

C语言课程设计报告题目:编写万年历系统年级:专业:班级:姓名:学号:目录第1章设计目的第2章需求分析第3章概要设计第4章源程序清单第5章执行结果1)登陆界面2)显示当前日月历3)显示具体日期信息第6章程序问题调…

万年历设计报告

万年历设计1、设计目的:1、学会对单片机外围电路的使用。2、熟悉使用proteus电路仿真软件。3、熟悉使用KILEC语言编程软件。4、了解数字万年历的工作原理及其组成。2、设计任务:1、显示年月日时分秒及星期…

万年历综合课程设计报告

目录目录1第一章设计目的与要求311设计目的312设计要求3第二章课程设计分析421设计背景422程序开发环境423课程设计主要内容4第三章总体设计531整体流程图532功能模块图633各模块功能详细说明633...

数字万年历课程设计报告

电子万年历设计课程设计报告课程名称微控制器原理与接口技术课程设计系部计算机科学系专业班级计算机科学与技术专业B0905班学生姓名完成时间报告成绩摘要本设计是一种基于AT89C51单片机控制的数字万年历设计它具有...

万年历课程设计报告

嵌入式系统应用课程设计计算机信息工程学院20xx20xx第一学期嵌入式系统应用课程设计题目基于Clinux和MINIGUI的万年历系统设计专业计算机科学与技术学生姓名康登辉学号08030112小组及组员姓名唐卫...

java课程设计报告之万年历程序设计报告(1)

徐州工业职业技术学院目录前言21需求分析211需求分析212功能设计22概要设计221程序设计思路222程序运行界面323流程图43各模块的功能及程序说明431初始化组件432初始化数据533绘制程序界面54测...

电子万年历设计开题报告

毕业设计论文开题报告学生姓名专业设计论文题目指导教师20xx年3月16日学号电子信息工程基于单片机的万年历设计毕业设计论文开题报告毕业设计论文开题报告毕业设计论文开题报告毕业设计论文开题报告毕业设计论文开题报告...

基于时钟芯片DS1302万年历系统的设计开题报告

毕业设计论文开题报告学生姓名专业设计论文题目指导教师学号电子科学与技术基于芯片DS1302万年历系统的设计20xx年3月24日开题报告填写要求1开题报告含文献综述作为毕业设计论文答辩委员会对学生答辩资格审查的依...

51单片机万年历课程设计报告

一设计任务1设计任务设计并制作一个数字钟2设计要求显示年月日时分秒及星期信息具有可调整日期和时间功能增加闰年计算功能显示部分由LCD1602完成二方案论证1显示部分显示部分是本次设计的重要部分一般有以下两种方案...

万年历设计报告(40篇)