c51数字钟c语言程序,有人会写数字钟的C语言程序吗?

DS1302时钟子程序

#define uchar unsigned char

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

sbit DS1302_IO = P2^4; //实时时钟数据线引脚

sbit DS1302_RST = 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; //秒,分,时到日,月,年位闪的计数

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

uchar temp_value; //温度值

uchar TempBuffer[5],week_value[2];

/***********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);

}

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

{ if(hide_yearDateString[0] = '2';

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

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

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

}

else

{

Time->DateString[0] = ' ';

Time->DateString[1] = ' ';

Time->DateString[2] = ' ';

Time->DateString[3] = ' ';

}

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

if(hide_monthDateString[5] = Time->Month/10 '0';

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

}

else

{

Time->DateString[5] = ' ';

Time->DateString[6] = ' ';

}

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

if(hide_dayDateString[8] = Time->Day/10 '0';

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

}

else

{

Time->DateString[8] = ' ';

Time->DateString[9] = ' ';

}

if(hide_weekWeek '0'; //星期的数据另外放到 week_value[]数组里,跟年,月,日的分开存放,因为等一下要在最后显示

}

else

{

week_value[0] = ' ';

}

week_value[1] = ' ';

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

}

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

{ if(hide_hourTimeString[0] = Time->Hour/10 '0';

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

}

else

{

Time->TimeString[0] = ' ';

Time->TimeString[1] = ' ';

}

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

if(hide_minTimeString[3] = Time->Minute/10 '0';

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

}

else

{

Time->TimeString[3] = ' ';

Time->TimeString[4] = ' ';

}

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

if(hide_secTimeString[6] = Time->Second/10 '0';

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

}

else

{

Time->TimeString[6] = ' ';

Time->TimeString[7] = ' ';

}

Time->DateString[8] = ' ';

}

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

{

unsigned char Second=Read1302(DS1302_SECOND);

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

{

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

Write1302(0x8c,0x09); //以下写入初始化时间 日期:09/04/01。

星期: 3。

时间: 23:59:59

Write1302(0x88,0x04);

Write1302(0x86,0x01);

Write1302(0x8a,0x07);

Write1302(0x84,0x23);

Write1302(0x82,0x59);

Write1302(0x80,0x59);

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

}

}

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

{

DS1302_GetTime(&CurrentTime); //获取时钟芯片的时间数据

TimeToStr(&CurrentTime); //时间数据转换液晶字符

DateToStr(&CurrentTime); //日期数据转换液晶字符

}。

全部

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值