单片机做的日历 c语言程序

单片机做的日历 c语言程序,第1张

这是一个DS1302时钟程序,根据自己的硬件电路适当改改就可以做成日历了 /

DS1302控制程序 20111201 wqz

/

#include<reg52h>

#include<intrinsh>

typedef unsigned uchar;sbit sda=P2^1; //DS1302

sbit clk=P2^0;

sbit ce=P2^2;

//sbit sda=P3^4;

//sbit clk=P3^6;

//sbit ce=P3^5;

//

//sbit _138_A=P2^2; //138A,B,C口

//sbit _138_B=P2^3;

//sbit _138_C=P2^4;sbit IO =P1^7; //595控制信号

sbit RLK =P1^6;

sbit CLK =P1^5;#define my_delay5us() _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();\

_nop_();_nop_();_nop_();_nop_();_nop_();_nop_()

//#define T0_init() TMOD=0x01;TH0=0xb8;TL0=0x00;TR0=1;ET0=1;EA=1uchar cc[8]; //将要显示的时间由BCD码转换成要显示的数值存放在CC[]中

uchar bb[8]; //存放从DS1302中读取出来的数据

uchar aa[7]={0,30,18,20,12,6,11}; //初始时间

uchar code write_rtc[]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c}; //时间寄存器写地址

uchar code tember[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; //共阴数码管显示表void my_delay1ms(int t); //延时1ms函数

void write_1byte(uchar temp); //写一字节数据

uchar read_1byte(); //读一字李数据

void write_addr_data(uchar Addr, uchar Data); //先写地址再写数据

uchar writeadd_readdat(uchar ucAddr); //先写地址再读数据

void write1_readM(); //连续读多个字节数据

void ds1302_init(); //DS1302初始化/

主函数

/void main()

{

uchar i,j,dat; my_delay1ms(10);

ds1302_init(); //给DS1302付初值 11年12月20日 周六 18-30-00

// T0_init(); while(1)

{

write1_readM(); //读DS1302中的数据 cc[0]=bb[0]%16;

cc[1]=bb[0]/16;

cc[2]=10;

cc[3]=bb[1]%16;

cc[4]=bb[1]/16;

cc[5]=10;

cc[6]=bb[2]%16;

cc[7]=bb[2]/16; for(j=0;j<8;j++)

{

dat=tember[cc[j]];

RLK=0;

my_delay5us();

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

{

if(dat&0x80)IO=1;

else IO=0;

my_delay5us();

CLK=1;

my_delay5us();

CLK=0;

dat<<=1;

}

my_delay5us();

RLK=1;

}

my_delay1ms(500);

}

}//void my_delay1ms(int t) //延时

{

uchar i,j;

while(t--)

{

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

for(j=50;j>0;j--);

}

}//void write_1byte(uchar temp) //写一字节数据

{

uchar i; clk=0;

my_delay5us();

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

{

if(temp&0x01)sda=1;

else sda=0;

my_delay5us();

clk=1;

my_delay5us();

clk=0;

temp>>=1;

}

}//uchar read_1byte() //读一字节数据

{

uchar i,num;

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

{

num>>=1;

if(sda)

num|=0x80;

my_delay5us();

clk=1;

my_delay5us();

clk=0;

}

return num;

}//void write_addr_data(uchar Addr, uchar Data) //先写地址再写数据

{

ce = 0;

my_delay5us();

clk = 0;

my_delay5us();

ce = 1;

my_delay5us();

write_1byte(Addr); // 地址,命令

write_1byte(Data); // 写1Byte数据

my_delay5us();

clk=1;

my_delay5us();

ce =0;

} //uchar writeadd_readdat(uchar ucAddr) //先写地址再读数据

{

uchar num1=0; ce = 0 ;

my_delay5us();

clk = 0;

my_delay5us();

ce = 1;

my_delay5us();

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

num1 = read_1byte(); // 读1Byte数据

my_delay5us();

clk = 1;

my_delay5us();

ce =0; return(num1);

}//void write1_readM() //连续读多个字节数据

{

uchar i,Addr; Addr=0x81;

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

{

bb[i] = writeadd_readdat( Addr);//格式为: 秒 分 时 日 月 星期 年

Addr += 2;

}

}//void ds1302_init() //初始时间 11年12月20日 周六 18-30-00

{

uchar i,p,tmp; for(i=0;i<7;i++)

{ /如想设置DS1302的“秒”,设置时间为37秒,所以输入的是十/

tmp=aa[i]/10; /进制数37,对应的16进制是0x25,但是DS1302寄存器使用的是压/

aa[i]=aa[i]%10; /缩BCD码,所以应该写入BCD数值37才行,即0x37。所以需要将/

aa[i]=aa[i]+tmp16; /10进制的37转换为16进制表示的0x37/

}

write_addr_data(0x8E,0X00);

p=write_rtc; //传地址

for(i=0;i<7;i++) //7次写入 秒分时日月周年

{

write_addr_data(p,aa[i]);

p++;

} write_addr_data(0x8E,0x80);

}////void ET0_ser() interrupt 1

//{

//// uchar i;

//

// TH0=0x55;

// TL0=0x00;

//

//// P0=tember[cc[i]];

//// switch(i)

//// {

//// case 0 : _138_A=1;_138_B=1;_138_C=1; break;

//// case 1 : _138_A=0;_138_B=1;_138_C=1; break;

//// case 2 : _138_A=1;_138_B=0;_138_C=1; break;

//// case 3 : _138_A=0;_138_B=0;_138_C=1; break;

//// case 4 : _138_A=1;_138_B=1;_138_C=0; break;

//// case 5 : _138_A=0;_138_B=1;_138_C=0; break;

//// case 6 : _138_A=1;_138_B=0;_138_C=0; break;

//// case 7 : _138_A=0;_138_B=0;_138_C=0; break;

//// }

//// i++;

//// if(i==8)i=0;

//}

# include <stdioh>

# include <mathh>

void printmonth(int m);

void printhead(int m);

int daysofmonth(int m);

int firstday(int y);

int year,weekday;

void main()

{

int i;

printf("请输入年份:");

scanf("%d",& year);

weekday=firstday(year);

printf("\n\n");

printf(" %d年\n",year);

for(i=1;i<=12;i++)

{

printmonth(i);

printf("\n");

}

printf("\n\n");

}

void printmonth(int m) //打印每月日历

{

int i,days;

printhead(m);

days=daysofmonth(m);

for(i=1;i<=days;i++)

{

printf("%5d",i);

weekday=(weekday+1)%7;

if (weekday==0) printf("\n ");

}

}

void printhead(int m) //打印每月的日历头(判定起始位置)

{

int i;

printf("\n%d月 日 一 二 三 四 五 六\n",m);

printf(" ");

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

printf(" ");

}

int daysofmonth(int m) //每月的天数

{

switch (m)

{

case 1:

case 3:

case 5:

case 7:

case 8:

case 10:

case 12:return 31;

case 4:

case 6:

case 9:

case 11:return 30;

case 2:if (((year%4==0 && year%100!=0)||year%400==0))

return 29;

else

return 28;

default: return 0;

}

}

int firstday(int y) //判断某年元旦是星期几

{

double s ;

s=floor(year-1+(year-1)/40-(year-1)/1000+(year-1)/4000+1);

return (int)s%7;

}

此题不是很难,我会前三个

关键是算那一年的第一天是周几

给你个基本算法,一年是365天,闰年366天

364是7的倍数,这样一年多出一天,中间多少个闰年,在加上相应的天数即可

400年多出来的天数是400+97=497也是7的倍数,那么400年一轮回,这样就算400年以内的即可

一个子函数,返回这一年的第一天是周几,很好做

int ye(int year)

{

int y=year%400;

int day=y;

int i;

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

if(闰年判断)

day++;

return day%7;

}

做一个月份天数的全局数组

int mo[12]={31,28,31,30,31,30,31,31,30,31,30,31};

需要时用一个if判断闰年改变m0[1]的值是28还是29

打印子函数,有一个小技巧,就是每个月前面的空缺部分,这个1月份是ye子函数的返回值,后面的你看和前面月份是不是重合啊,吧这个记录下来在下一月份用即可

1 2

3 4

这样月份排列更好打印一些,你的那个截图有点麻烦

int pr(int year)

{

int k=ye(year);

int i,j,;

if(闰年判断)

mo[1]=29;

else

mo[1]=28;

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

{

printf("周几英文的打印");

for(j=0;j<k;j++)

printf("一般是四个空格,就是月份前面空缺的打印");

for(j=1;j<=mo[i];j++)

{

printf("%4d",j);

k++;

if((k+j)%7==0)

printf("\n");

}

k%=7;

if(k!=0)

printf("\n");

}

}

如果像你那样,感觉需要赋值一个大一点的数组,在吧数组打印出来更好,呵呵

#include <stdioh>

int leap (int year)

{if(year%4==0&&year%100!=0||year%400==0) //判断是否是闰年

return 1;

else return 0;

}

int days_month (int month,int year) //判断大月和小月

{

if(month==1||month==3||month==5||month==7||month==8||month==10||month==12) //找出大月

return 31;

if(month==4||month==6||month==9||month==11) //找出小月

return 30;

if(month==2&&leap(year)==1) return 29; //判断二月是29天还是29天

else return 28;

}

int firstday(int month,int year)

{int w;

w=(1+2month+3(month+1)/5+year+year/4+year/400-year/100)%7+1; //判断每个月开始的第一天是星期几

return w;

}

main()

{int i,j=1,k=1,a,b,month,year;

printf("\n input month and year:\n");

scanf("%d%d",&month,&year); //输入月和年

b=days_month(month,year);

a=firstday (month,year);

printf(" Sun Mon Tue Wed Thu Fri Sat \n"); //输出对应当月的日历

if(a==7)

{for(i=1;i<=b;i++)

{printf("%4d",i);

if(i%7==0)

{printf("\n");

}

}

}

if(a!=7)

{while (j<=4a)

{printf(" ");

j++;

}

for(i=1;i<=b;i++)

{printf("%4d",i);

if(i==7k-a)

{printf("\n");

k++;

}

}

}

printf("\n");

}

以上就是关于单片机做的日历 c语言程序全部的内容,包括:单片机做的日历 c语言程序、用C语言编写一个日历、C语言编写 年历显示程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存