基于51单片机,DS1302,1602实现万年历(年月日时分秒)及闹钟功能的C程序,不要显示农历和温度,谢谢!!

基于51单片机,DS1302,1602实现万年历(年月日时分秒)及闹钟功能的C程序,不要显示农历和温度,谢谢!!,第1张

八电子表、万年历系列

[1]单片机公交车环境监测及时间显示系统

功能描述:

1、按键调时间

2、带备用电池(断电继续走时)

3、监测噪声和温湿度并实时显示

4、超过报警值蜂鸣器会响

☆已作出的实物优酷视频演示地址:

>

这是我以前写的一段程序,希望对你能有帮助

我的程序,首先有一点,肯定是调试通过的,不像我以前找的一些网络程序,貌似可以,就是不能执行结果。

/DS1302时钟芯片显示设置

功能:显示 时间 日期 星期

引脚说明:DS1302三引脚 CLK = P1^5; IO=P1^6; RST=P1^7;

设计整理:创达科技 陈仲库

技术服务:kuzi00@163com QQ:86828048

整理时间:2007年5月26日

/

#define uchar unsigned char

#define uint unsigned int

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

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

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

sbit ACC0 = ACC^0;

sbit ACC7 = ACC^7;

typedef struct __SYSTEMTIME__

{

uchar Second;

uchar Minute;

uchar Hour;

uchar Week;

uchar Day;

uchar Month;

uchar Year;

uchar DateString[9];

uchar TimeString[9];

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

void DS1302_WR_Byte(uchar d) //实时时钟写入一字节(内部函数)

{

uchar i;

ACC = d;

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

{

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

DS1302_CLK = 1;

DS1302_CLK = 0;

ACC = ACC >> 1;

}

}

uchar DS1302_RD_Byte(void) //实时时钟读取一字节(内部函数)

{

uchar i;

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

{

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

ACC7 = DS1302_IO;

DS1302_CLK = 1;

DS1302_CLK = 0;

}

return(ACC);

}

void DS1302_Write(uchar ucAddr, uchar ucDa) //ucAddr: DS1302地址, ucData: 要写的数据

{

DS1302_RST = 0;

DS1302_CLK = 0;

DS1302_RST = 1;

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

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

DS1302_CLK = 1;

DS1302_RST = 0;

}

uchar DS1302_Read(uchar ucAddr) //读取DS1302某地址的数据

{

uchar ucData;

DS1302_RST = 0;

DS1302_CLK = 0;

DS1302_RST = 1;

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

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

DS1302_CLK = 1;

DS1302_RST = 0;

return(ucData);

}

void DS1302_SetTime(uchar Address, uchar Value) // 设置时间函数

{

DS1302_Write(0x8E,0x00); //写保护

DS1302_Write(Address, ((Value/10)<<4 | (Value%10)));

}

void DS1302_GetTime(SYSTEMTIME Time)

{

uchar ReadValue;

ReadValue = DS1302_Read(0x80);

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

ReadValue = DS1302_Read(0x82);

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

ReadValue = DS1302_Read(0x84);

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

ReadValue = DS1302_Read(0x86);

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

ReadValue = DS1302_Read(0x8a);

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

ReadValue = DS1302_Read(0x88);

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

ReadValue = DS1302_Read(0x8c);

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

}

void DateToStr(SYSTEMTIME Time)

{

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

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

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

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

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

Time->DateString[5] = '-';

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

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

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

}

void TimeToStr(SYSTEMTIME Time)

{

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

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

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

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

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

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

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

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

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

}

void DS1302_Init(void)

{

uchar Second=DS1302_Read(0x80);

if(Second&0x80) DS1302_SetTime(0x80,0);

//时间设置初始化 秒 分 时

DS1302_SetTime(0x80,30);

DS1302_SetTime(0x82,59);

DS1302_SetTime(0x84,23);

DS1302_SetTime(0x8A,6); //周

DS1302_SetTime(0x86,26); //天

DS1302_SetTime(0x88,5); //月

DS1302_SetTime(0x8C,7); //年

}

/调用说明

DS1302_Init();初始化

DS1302_GetTime(&CurrentTime);//取得当前时间

DateToStr(&CurrentTime); //取得当前日期

TimeToStr(&CurrentTime); //取得当前时间

// 数据处理 CurrentTimeDateString 格式"07-05-26"

// CurrentTimeTimeString 格式"00;00;00"

/

把按键检测,和执行按键功能,分开。

参考如下程序:

void main(){ mm = 0, kk = 0; while(1) { kk = keyscan(); //返回0、1、2、3 if(kk == 0) display(shi, fen, miao); //没有按就正常走时 if(kk == 1) {mm++; if(mm == 4) mm = 0;} //改变项目 if(kk == 2) { switch(mm) { case 1 : if(miao < 59) miao++; break; case 2 : if(fen < 59) fen++; break; case 3 : if(shi < 23) shi++; break; } } if(kk == 3) { switch(mm) { case 1 : //相应项目--; break; case 2 : //相应项目--; break; case 3 : //相应项目--; break; } } }}

不用ds1302

#include

<reg52h>

sbit

led=P1^0;

sbit

key=P1^1;

int

s=0;

int

n=0;

int

b=0;

int

a=1;

void

delay10ms(void)

{

unsigned

char

a,b,c;

for(c=1;c>0;c--)

for(b=38;b>0;b--)

for(a=130;a>0;a--);

}

void

timer(void)

interrupt

1

using

1

{

int

i;

if(i==20)

{

s++;

i=0;

}

if(s==60)

{

n++;

s=0;

}

if(n==a)

{

led=0;

s=0;

n=0;

b=0;

}

i++;

TH0=(65536-52800)/256;

TL0=(65536-52800)%256;

}

void

init(void)

{

EA=1;

TMOD=0x01;

ET0=1;

TH0=(65536-52800)/256;

TL0=(65536-52800)%256;

TR0=1;

}

void

main()

{

init();

while(1)

{

if(n==a)

{

led=0;

}

if(key==0)

{

delay10ms();

if(key==0)a++;

}

}

}

//用keil4通过编译了默认定时1小时按一下key就加一最大定时24小时

以上就是关于基于51单片机,DS1302,1602实现万年历(年月日时分秒)及闹钟功能的C程序,不要显示农历和温度,谢谢!!全部的内容,包括:基于51单片机,DS1302,1602实现万年历(年月日时分秒)及闹钟功能的C程序,不要显示农历和温度,谢谢!!、51单片机用ds1302芯片闹钟。要求按键k1,k2,k3控制调节时分秒。、求一用51(盛群单片机更好)和ds1302设计的时钟程序并用LED显示出来,还要有闹钟功能等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9676026.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-30
下一篇 2023-04-30

发表评论

登录后才能评论

评论列表(0条)

保存