日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

c语言闰年的判断条件DS1302,DS1302驱动程序(平年和闰年天数自动调整)

發布時間:2025/3/8 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c语言闰年的判断条件DS1302,DS1302驱动程序(平年和闰年天数自动调整) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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

1.本程序能夠顯示年,月,日,時,分,

秒,星期七個參數.

2.時間和日期可調。可分別完成年,月,日,時,分,

秒六個參數的調整。支持平年和閏年天數的自動調整。

實驗名稱:時鐘芯片DS12C887演示程序

晶振:內部? 8M

接線方法:

1.PA0-PA2分別接DS1302的CS,TADA,SLK.

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

#include#include#define uchar unsigned char

#define uint unsigned int

#define ds1302_PIN???????????? PINA&BIT(PA1)

#define ds1302_DDR???????????? DDRA

#define ds1302_DDR_OUT???????? ds1302_DDR|=BIT(PA0)|BIT(PA1)|BIT(PA2)

#define ds1302_DDR_IN????????? ds1302_DDR&=~(BIT(PA1)|BIT(PA2))

#define ds1302_PORT??????????? PORTA

#define ds1302_RST_H??? ??? ds1302_PORT|= BIT(PA0)? //片選

#define ds1302_RST_L??? ??? ds1302_PORT&= ~BIT(PA0)

#define ds1302_DAT_H??? ??? ds1302_PORT|= BIT(PA1)? //數據

#define ds1302_DAT_L??? ??? ds1302_PORT&= ~BIT(PA1)

#define ds1302_CLK_H??? ??? ds1302_PORT|= BIT(PA2)? //時鐘

#define ds1302_CLK_L??? ??? ds1302_PORT&= ~BIT(PA2)

const char start_time[]={0x00,0x00,0x00,0x01,0x01,0x07,0x06};?? //初始值;

char month_p[13]={0,31,28,31,30,31,30,31,31,30,31,30,31,};//平年

char month_y[13]={0,31,29,31,30,31,30,31,31,30,31,30,31,};//閏年

uchar second=0;

uchar minute=0;

uchar hour=0;

uchar day=1;

uchar month=1;

uchar year=6;

uchar week=7;

uchar month_max=0;//每月最大天數

/****************DS1302子程序***********************/

void ds1302_inputbyte(uchar CD)? //寫入一字節數據

{

uchar i,mid=0;

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

{

mid=CD&0x01;

if (mid==0)

ds1302_DAT_L;

else

ds1302_DAT_H ;

ds1302_CLK_H ;

ds1302_CLK_L ;

CD=CD>>1;

}

}

uchar ds1302_outputbyte(void)? //讀取一字節數據

{

uchar i,mid=0;

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

{

ds1302_DDR_IN;

mid=mid>>1;

if ((ds1302_PIN)==0)

mid&=~BIT(PB7);

else

mid|=BIT(PB7);

ds1302_DDR_OUT;

ds1302_CLK_H ;

ds1302_CLK_L ;

}

return(mid);

}

void w1302(uchar ucAddr,uchar ucDa)?? //寫入數據

{

ds1302_DDR_OUT ;

ds1302_RST_L;

ds1302_CLK_L;

ds1302_RST_H;

ds1302_inputbyte(ucAddr);

ds1302_inputbyte(ucDa);

ds1302_CLK_H ;

ds1302_RST_L;

}

uchar r1302(uchar ucAddr)??????? //讀取數據

{

uchar ucDa;

ds1302_DDR_OUT ;

ds1302_RST_L;

ds1302_CLK_L ;

ds1302_RST_H ;

ds1302_inputbyte(ucAddr);

ucDa=ds1302_outputbyte();

ds1302_CLK_H ;

ds1302_RST_L;

return(ucDa);

}

//設置初始時間

//格式:秒,分,時,日,月,星期,年

void set1302()

{

uchar i;

uchar ucaddr=0x80;

w1302(0x8e,0x00);//寫允許

w1302(0x90,0xa6);//打開充電功能

for (i=0;i<7;i++)

{

w1302(ucaddr,start_time[i]);

ucaddr+=2;

}

w1302(0x8e,0x80);//寫禁止

}

//讀取當前時間

void get1302()

{

uchar i=0,ucaddr=0x81;

uchar uctimer[6];

char sec1,day1,mon1,year1,min1,hour1;

for (i=0;i<7;i++)

{

uctimer[i]=r1302(ucaddr);

ucaddr+=2;

}

sec1=uctimer[0];//十進制到二進制的調整

second=((sec1&0x70)>>4)*10+(sec1&0x0f);

min1=uctimer[1];

minute=((min1&0x70)>>4)*10+(min1&0x0f);

hour1=uctimer[2];

hour=((hour1&0x30)>>4)*10+(hour1&0x0f);

day1=uctimer[3];

day=((day1&0x30)>>4)*10+(day1&0x0f);

mon1=uctimer[4];

month=((mon1&0x10)>>4)*10+(mon1&0x0f);

week=uctimer[5];

year1=uctimer[6];

year=((year1&0x70)>>4)*10+(year1&0x0f);

}

void second_set()?? //調秒

{

w1302(0x8e,0x00);

w1302(0x80,((second/10)<<4)+(second%10));

w1302(0x8e,0x80);

}

void minute_set()? //調分

{

w1302(0x8e,0x00);

w1302(0x82,((minute/10)<<4)+(minute%10));

w1302(0x8e,0x80);

}

void hour_set()? //調時

{

w1302(0x8e,0x00);

w1302(0x84,((hour/10)<<4)+(hour%10));

w1302(0x8e,0x80);

}

void year_set()? //調年

{

year++;

if (year>69)

year=6;

if (year%4==0)

month_max=month_y[month];

else

month_max=month_p[month];

if (day>month_max)

day=month_max;

day_set();

w1302(0x8e,0x00);

w1302(0x8c,((year/10)<<4)+(year%10));

w1302(0x8e,0x80);

}

void month_set()? //調月

{

month++;

if (month>12)

month=1;

if (year%4==0)

month_max=month_y[month];

else

month_max=month_p[month];

if (day>month_max)

day=month_max;

day_set();

w1302(0x8e,0x00);

w1302(0x88,((month/10)<<4)+(month%10));

w1302(0x8e,0x80);

}

void day_set()? //調日

{

uchar i=0;

uchar j=0;

uchar month_m=0;

uint day_n=0;

day_n=0;

for (i=6;i? {

if (i?? {

if (i%4==0)

day_n=day_n+366;

else

day_n=day_n+365;

}

if (i==year)

{

if (month>1)

{

for (j=1;j???? ?{

if (year%4==0)

month_m=month_y[j];

else

month_m=month_p[j];

day_n=day_n+month_m;

}

}

}

}

if (year%4==0)

month_max=month_y[month];

else

month_max=month_p[month];

if (day>month_max)

day=1;

week=(day_n+day-1)%7;

if (week==0)

week=7;

w1302(0x8e,0x00);

w1302(0x86,((day/10)<<4)+(day%10));

w1302(0x8a,week);

w1302(0x8e,0x80);

}

總結

以上是生活随笔為你收集整理的c语言闰年的判断条件DS1302,DS1302驱动程序(平年和闰年天数自动调整)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。