求单片机电子时钟程序设计

我是做单片机的实习 需要做时钟 要求 有年 月 日 小时 分钟 秒 求高手帮忙 小弟感激不近,

第1个回答  2013-10-19
#include "../inc/DS1307.H"
#include "../inc/delay.H"
#include "../inc/i2c.H" unsigned char idata Sec,Min,Hr,Dy,Dt,Mn,Yr;
bit hour_mode=0;
/********************************************************************************
函数功能: 数码转换
bcd:BCD码 z:为1转换高位,否则转换低位 Data:二进制数
********************************************************************************/
unsigned char BCD_ASCII(unsigned char bcd,bit z) //把BCD码转换为ASCII码
{
unsigned char temp;
if(z)
temp=(bcd>>4)+'0'; //+48
else temp=(bcd&0x0f)+'0'; //+48
return temp;
}
unsigned char CHAR_BCD(unsigned char Data) //把二进制数转换为BCD码
{
unsigned char bcd; if(Data>100) Data=0;
bcd = Data/10;
bcd<<=4;
bcd = bcd+(Data%10);
return bcd;
}
/********************************************************************************
函数功能: 判断日期是否合法
a:年(00-99之间) b:月 d:日
********************************************************************************/
bit Leap_year(unsigned char n) //判断是否为闰年 计算范围2000-2099年
{
if((((2000+n)%4 == 0)&&((2000+n)%100 != 0)) || ((2000+n)%400 == 0))
return 0;
else return 1; //是闰年返回1
}
bit Valid_date(unsigned char a,unsigned char b,unsigned char c)
{
unsigned char flag=1; if((b<=0)||(b>12)||(c<=0)||(c>31)) flag=0;
if(((b==4)||(b==6)||(b==9)||(b==11))&&(c>30)) flag=0;
if(Leap_year(a)) if((b==2)&&(c>29)) flag=0;
else if(b==2&&c>28) flag=0;
return flag; //合法返回1
}
/********************************************************************************
函数功能: 初始化时间和日期
********************************************************************************/
void RTC_init(void)
{
i2c_start();
i2c_sendbyte(ADDRTC); //写器件地址
i2c_waitACK();
i2c_sendbyte(0); // 地址指针置为 0
i2c_waitACK();
i2c_sendbyte(Sec&0x7f); //CH(Sec^7)位置为 0,启动时钟
i2c_waitACK();
i2c_stop();

i2c_start();
i2c_sendbyte(ADDRTC);
i2c_waitACK();
i2c_sendbyte(2); // 地址指针置为 2
i2c_waitACK();
if(hour_mode)
i2c_sendbyte(Hr|0x40); // 12小时模式,Hr^6置1
else i2c_sendbyte(Hr&0xbf); // 24小时模式,Hr^6置0
i2c_waitACK();
i2c_stop();

i2c_start();
i2c_sendbyte(ADDRTC);
i2c_waitACK();
i2c_sendbyte(7); // 地址指针置为 7
i2c_waitACK();
i2c_sendbyte(0x10); // sqwe引脚1Hz的输出
i2c_waitACK();
i2c_stop();
}
/********************************************************************************
函数功能: 写RTC寄存器
********************************************************************************/
void write_RTC_time(void)
{
i2c_start();
i2c_sendbyte(ADDRTC); // 写从机地址(器件地址)
i2c_waitACK();
i2c_sendbyte(0); // 地址指针置为 0
i2c_waitACK();
i2c_sendbyte(Sec); // Sec
i2c_waitACK();
i2c_sendbyte(Min); // Min
i2c_waitACK();
i2c_sendbyte(Hr); // Hr
i2c_waitACK();
i2c_sendbyte(Dy); // Dy
i2c_waitACK();
i2c_sendbyte(Dt); // Dt
i2c_waitACK();
i2c_sendbyte(Mn); // Mn
i2c_waitACK();
i2c_sendbyte(Yr); // Yr
i2c_waitACK();
i2c_stop();
}/********************************************************************************
********************************************************************************/
第2个回答  2013-10-19
不好意思啊 这个很难 可能没人会
第3个回答  2013-10-19
单片计算机即单片微型计算机。由RAM ,ROM,CPU构成,定时,计数和多种接口于一体的微控制器。它体积小,成本低,功能强,广泛应用于智能产业和工业自动化上。而51系列单片机是各单片机中最为典型和最有代表性的一种。这次课程设计通过对它的学习,应用,从而达到学习、设计、开发软、硬的能力。
本设计主要设计了一个基于AT89C51单片机的电子时钟。并在数码管上显示相应的时间。并通过一个控制键用来实现时间的调节和是否进入省电模式的转换。应用Proteus的ISIS软件实现了单片机电子时钟系统的设计与仿真。该方法仿真效果真实、准确,节省了硬件资源。
关键字:单片机;子时钟;键盘控制。

目 录

摘 要 4
1 电子时钟 6
1.1 电子时钟简介 6
1.2 电子时钟的基本特点 6
1.3 电子时钟的原理 6
2 单片机识的相关知识 6
2.1 单片机简介 6
2.2 单片机的发展史 7
2.3 单片机的特点 8
2.4 89C51单片机介绍 8
3 控制系统的硬件设计 10
3.1 单片机型号的选择 10
3.2 数码管显示工作原理 10
3.3 键盘电路设计 11
3.4 整个电路原理图 12
4 控制系统的软件设计 12
4.1程序设计 12
4.2 程序流程图 15
4.3 仿真图 18
4.4 仿真结果分析 19
5 结束语 19
6 附录 20
参考文献 28

1、电子时钟
1.1 电子时钟简介
1957年,Ventura发明了世界上第一个电子表,从而奠定了电子时钟的基础,电子时钟开始迅速发展起来。现代的电子时钟是基于单片机的一种计时工具,采用延时程序产生一定的时间中断,用于一秒的定义,通过计数方式进行满六十秒分钟进一,满六十分小时进一,满二十四小时小时清零。从而达到计时的功能,是人民日常生活补课缺少的工具。本回答被网友采纳