//判断是否是闰年
int leapYear(int year)
{
if((year%4==0 &&year%100!=0) || !(year%400))
return 1
else
return 0
}
//返回星期几
int weekday(int year,int day_sum)
{
if(year<2012)
return (7-day_sum%7+1)
else
return (day_sum%7+1)
}
//年份之间相隔的天数
int year_sum(int year)
{
int yearSum=0
if(year<=2011)
for(int i=yeari<2012i++)
{
if(leapYear(i))
yearSum+=366
else
yearSum+=365
}
else if(year==2012 || year==2013)
return 0
else if(year>2013)
for(int i=yeari>2013i--)
{
if(leapYear(i-1))
yearSum+=366
else
yearSum+=365
}
return yearSum
}
//某月的天数
int month_sum(int year,int month)
{
if(month==1 || month==3 || month==5 || month==7 || month==8 || month==10 || month==12)
return 31
else if(month==2)
{
if(leapYear(year))
return 29
else
return 28
}
else
return 30
}
//打印日历
void print(int year)
{
FILE *p
p=fopen("calendar.txt","a+")
fprintf(p,"输入要打印日历的年份:%d\n",year)
int cal[31]
int initWeek
int totalDay=0
int count=0
if(year<2012)
totalDay=year_sum(year)+64
else if(year==2012)
totalDay=year_sum(year)+62
else
totalDay=year_sum(year)+302
initWeek=weekday(year,totalDay)
for(int j=1j<=12j++)
{
printf("%d年%d月\n",year,j)
fprintf(p,"%d年%d月\n",year,j)
printf("星期日\t星期一\t星期二\t星期三\t星期四\t星期五\t星期六\n")
fprintf(p,"星期日\t星期一\t星期二\t星期三\t星期四\t星期五\t星期六\n")
printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n")
fprintf(p,"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n")
int limit=month_sum(year,j)
if(j>=2)
{
initWeek=count%7
count=0
}
if(initWeek!=7)
{
for(int n=0n<initWeekn++)
{
printf("\t")
fprintf(p,"\t")
count++
}
}
for(int i=0i<limiti++)
cal[i]=i+1
for(i=0i<limiti++)
{
printf("%4d\t",cal[i])
fprintf(p,"%4d\t",cal[i])
count++
if(count%7==0)
{
printf("\n")
fprintf(p,"\n")
}
}
printf("\n\n\n")
fprintf(p,"\n\n\n")
}
fclose(p)
}
int main()
{
int year
printf("输入要打印日历的年份:")
while(scanf("%d",&year)!=EOF){
print(year)
}
return 0
}
没分啊 那也给你发一个吧DS1302+DS18B20 用1602显示
我在PROTUES仿真上做的 你可以根据程序画电路图 很简单
程序 采用模块化方式
/*初始化*/
#define uint unsigned int
#define uchar unsigned char
uchar code tab[]=" 20 - - "
uchar code table[]=" : : "
uchar code ttable[]={"Now temperature:"}
sbit RS=P3^0
sbit E=P3^1
sbit button1=P1^0
sbit button2=P1^3
sbit button3=P1^6
sbit RST=P2^5
sbit SCLK=P2^6
sbit IO=P2^7
sbit ACC7=ACC^7
sbit DQ=P3^6
char hour,minute,second,n,k,week,day,month,year1=20 ,year,nn,flag
uchar key=0
uint tem,a
void delay(uint x)
{
while(x--)
}
void write_zl(uchar zl)
{E=0
RS=0
P0=zl
E=1
delay(500)
E=0
}
void write_sj(uchar sj)
{E=0
RS=1
P0=sj
E=1
delay(500)
E=0
}
void init_lcd()
{
write_zl(0x38)//开显示
write_zl(0x01)//清屏
write_zl(0x06)//整屏不移动
write_zl(0x0C)//不开光标
}
/*18B20*/部分
void init_18b20()
{ DQ=1
delay(8)//延时
DQ=0
delay(80)
DQ=1
delay(20)
}
void write_dat(uchar dat)
{ uchar i,k
k=dat
for(i=0i<8i++)
{ DQ=0
DQ=k&0x01//从低位开始
delay(5)
DQ=1
k>>=1
}
delay(4)
}
int read_sj()
{
uchar j,date
for(j=0j<8j++)
{
DQ=1
delay(1)
DQ=0
date=date>>1
DQ=1
if(DQ==1) //
date|=0x80
delay(4)}
return(date)
}
void temperaturechange()
{ uint tempH,tempL
init_18b20()
write_dat(0xcc)//只对一个操作就跳过读序列号操作
write_dat(0x44)//启动温度转换
delay(60000)
delay(33750)//需要93.75ms
init_18b20()
write_dat(0xcc)
write_dat(0xbe)//读温度寄存器
tempL=read_sj()//读取温度低位LSB
tempH=read_sj()//读取温度高位MSB
if(tempH&0x80) //高5位是1为负数
{ a=1
tem=tempH
tem<<=8 //共16位
tem=tem|tempL//合并高低位数
tem=~tem+1
tem=tem*(0.0625)
}
else
{
a=0
tem=((tempH*256)+tempL)*0.0625//转换实际温度
}
}
void write_temperature(uint temp) //被调用的函数必须在前
{ uint bai,shi,ge
bai=temp/100
shi=temp%100/10
ge=temp%10
if(a==1)
{ if(shi>0)
{write_zl(0x80+0x50+3)
write_sj('-')
write_zl(0x80+0x50+4)
write_sj(0x30+shi) }
else
{
write_zl(0x80+0x50+3)
write_sj(0x00)
write_zl(0x80+0x50+4)
write_sj('-')}
}
else
{
if(bai>0) //若bai显示shi肯定显示
{
write_zl(0x80+0x50+3)
write_sj(0x30+bai)
write_zl(0x80+0x50+4)
write_sj(0x30+shi)
}
else
{
if(shi>0) //否则判断shi是否显示
{
write_zl(0x80+0x50+4)
write_sj(0x30+shi)
}
else
{
write_zl(0x80+0x50+4)
write_sj(0x00)
}
write_zl(0x80+0x50+3)
write_sj(0x00)
}
}
write_zl(0x80+0x50+5)//个位公用总的显示
write_sj(0x30+ge)
}
/*DS1302部分*/
void DS1302_write(uchar shju)
{ uchar s,j
s=shju
for(j=0j<8j++)
{ IO=s&0x01
SCLK=0
SCLK=1
s=s>>1
}}
uchar DS1302_readbyte()
{ uchar i,R=0
SCLK=0
delay(10)
for(i=8i>0i--)
{
ACC=ACC>>1
ACC7=IO
SCLK=1
SCLK=0
}
return(ACC)
/*{
R=R>>1
if(IO==1)
R=R|0x80
SCLK=1
SCLK=0
}
return(R)*/}
void DS1302write(uchar dz,uchar shij)//初始化1302
{ RST=1
SCLK=0
DS1302_write(dz)
DS1302_write(shij)
SCLK=1
RST=0
}
void start1302()
{ uchar num
for(num=0num<13num++)
{ write_sj(tab[num])}
for(num=13num<16num++)
{ write_sj(tab[num])}
write_zl(0x80+0x40)
for(num=0num<12num++)
{ write_sj(table[num])
}}
void write_hms(uchar add,uchar sj) //被调用的函数必须在前
{ uchar shi,ge
shi=sj/10
ge=sj%10
write_zl(0x80+0x40+add)
write_sj(0x30+shi)
write_sj(0x30+ge) }
void write_nyr(uchar add,uchar sj)
{ uchar shi,ge
shi=(sj/10)
ge=(sj%10)
write_zl(0x80+add)
write_sj(0x30+shi)
write_sj(0x30+ge) }
void write_XQ(uchar wk)
{ write_zl(0x80+13)
switch(wk)
{ case 2: write_sj('M')write_sj('O')write_sj('N')break
case 3: write_sj('T')write_sj('U')write_sj('E')break
case 4: write_sj('W')write_sj('E')write_sj('D')break
case 5: write_sj('T')write_sj('H')write_sj('U')break
case 6: write_sj('F')write_sj('R')write_sj('I')break
case 7: write_sj('S')write_sj('A')write_sj('T')break
case 1: write_sj('S')write_sj('U')write_sj('N')break
}
}
void write_day(uchar rue)
{
switch(rue)
{
case 1: nn=31break
case 2: if((year%4==0&&year%100!=0)||year%400==0)
nn=29
else
nn=28break
case 3: nn=31break
case 4: nn=30break
case 5: nn=31break
case 6: nn=30break
case 7: nn=31break
case 8: nn=31break
case 9: nn=30break
case 10: nn=31break
case 11: nn=30break
case 12: nn=31break
}}
void keyboard()
{
if(button1==0)
{ delay(5)
if(button1==0)
{ while(button1==0)
key++flag=1
switch(key)
{ case 1: write_zl(0x80+0x40+10)
write_zl(0x0f)break//shan shuo
case 2: write_zl(0x80+0x40+7)break
case 3: write_zl(0x80+0x40+4)break
case 4: write_zl(0x80+10)break
case 5: write_zl(0x80+7) break
case 6: write_zl(0x80+4) break
case 7: write_zl(0x80+2) break
case 8: key=0
write_zl(0x0c)
flag=0
DS1302write(0x80,second)
DS1302write(0x82,minute)
DS1302write(0x84,hour)
DS1302write(0x86,day)
DS1302write(0x88,month)
DS1302write(0x8A,week)
DS1302write(0x8C,year)break
}
}}
if(button2==0)
{ delay(10)
if(button2==0)
{ while(button2==0)
switch(key)
{case 1: second++if(second==60)second=0
write_hms(10,second)write_zl(0x80+0x40+10)break
case 2: minute++if(minute==60)minute=0
write_hms(7,minute)write_zl(0x80+0x40+7) break
case 3: hour++if(hour==24)hour=0
write_hms(4,hour)write_zl(0x80+0x40+4) break
case 4: day++week++
if(week==8)week=1write_XQ(week)
write_day(month)if(day==nn+1)day=1
write_nyr(10,day)write_zl(0x80+10)break
case 5: month++if(month==13)month=1
write_nyr(7,month)write_zl(0x80+7) break
case 6: year++ if(year==100)year=0
write_nyr(4,year)write_zl(0x80+4) break
case 7: year1++ if(year1==100)year1=0
write_nyr(2,year1)write_zl(0x80+2) break
}}}
if(button3==0)
{delay(10)
if(button3==0)
{ while(button3==0)
switch(key)
{case 1: second--if(second<0)second=59
write_hms(10,second)write_zl(0x80+0x40+10)break
case 2: minute--if(minute<0)minute=59
write_hms(7,minute)write_zl(0x80+0x40+7) break
case 3: hour--if(hour<0)hour=23
write_hms(4,hour)write_zl(0x80+0x40+4) break
case 4: week--if(week==0)week=7write_XQ(week)
day--write_day(month)if(day==0)day=nn
write_nyr(10,day)write_zl(0x80+10) break
case 5: month--if(month==0)month=12
write_nyr(7,month)write_zl(0x80+7) break
case 6: year-- if(year<0)year=99
write_nyr(4,year)write_zl(0x80+4) break
case 7: year1-- if(year1<0)year1=99
write_nyr(2,year1)write_zl(0x80+2) break}
}}
}
void DS1302_sfm()
{ uchar a,b
RST=1 //高电平期间启动一次数据转换
DS1302_write(0x81)
second=DS1302_readbyte()
RST=0// 结束转换
a=second/16//BCD码转换
b=second%16
second=a*10+b
write_hms(10,second)
//分
RST=1
DS1302_write(0x83)
minute= DS1302_readbyte()
a=minute/16
b=minute%16
minute=a*10+b
write_hms(7,minute)
RST=0
//时
RST=1
DS1302_write(0x85)
hour= DS1302_readbyte()
RST=0
a=hour/16
b=hour%16
hour=a*10+b
write_hms(4,hour)
//日
RST=1
DS1302_write(0x87)
day= DS1302_readbyte()
RST=0
a=day/16
b=day%16
day=a*10+b
write_nyr(10,day)
//月
RST=1
DS1302_write(0x89)
month= DS1302_readbyte()
RST=0
a=month/16
b=month%16
month=a*10+b
write_nyr(7,month)
// 周
RST=1
DS1302_write(0x8B)
week= DS1302_readbyte()
RST=0
a=week/16
b=week%16
week=a*10+b
write_XQ(week)
// 年
SCLK=0
delay(5)
RST=1
DS1302_write(0x8D)
IO=1
year= DS1302_readbyte()
RST=0
delay(5)
SCLK=1
a=year/16
b=year%16
year=a*10+b
write_nyr(4,year)
}
/* 总程序*/
#include<reg51.h>
#include<init.h>
#include<ds1302.h>
#include<18b20.h>
void main()
{
init_lcd()
start1302()
while(1)
{
RST=0
keyboard()
if(flag==0) //标志位为0才能读取1302,否则按键无效
DS1302_sfm()
write_zl(0x80+0x10)
for(n=0n<16n++)
write_sj(ttable[n])
temperaturechange()
write_temperature(tem)
}
}
下面是我的程序,还有仿真图,不懂可以再问我,祝你成功
/*******************************************
ds1302计时+lcd1602显示
*******************************************/
#include<reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit rs=P2^0
sbit rw=P2^1
sbit e=P2^2
sbit T_RST=P1^5
sbit T_CLK=P1^6
sbit T_IO=P1^7
sbit ACC0=ACC^0
sbit ACC7=ACC^7
/*******************************************
向1302写一个字节
*******************************************/
void input_BYTE(uchar dat)
{
uchar i
ACC=dat
for(i=8i>0i--)
{
T_IO=ACC0
T_CLK=1
T_CLK=0
ACC=(ACC>>1)
}
}
/*******************************************
1302读出一个字节
*******************************************/
uchar output_BYTE()
{
uchar i
for(i=8i>0i--)
{
ACC=(ACC>>1)
ACC7=T_IO
T_CLK=1
T_CLK=0
}
return (ACC)
}
/*******************************************
写数据
*******************************************/
void write_1302(uchar add,uchar dat)
{
T_RST=0
T_CLK=0
T_RST=1
input_BYTE(add)
input_BYTE(dat)
T_CLK=1
T_RST=0
}
/*******************************************
读数据
*******************************************/
uchar read_1302(uchar add)
{
uchar inf
T_RST=0
T_CLK=0
T_RST=1
input_BYTE(add)
inf=output_BYTE()
T_CLK=1
T_RST=0
return (inf)
}
void init_1302()
{
write_1302(0x8e,0x00)//关闭写保护
/* write_1302(0x90,0xaa)//设置充电方式
write_1302(0x80,0x00)//秒寄存器初始化
write_1302(0x82,0x46)//分.......
write_1302(0x84,0x22)//时.......
write_1302(0x86,0x17)//日........
write_1302(0x88,0x03)//月.......
write_1302(0x8a,0x04)//星期...
write_1302(0x8c,0x11)//年...... */
write_1302(0x8e,0x80)//打开写保护
}
uchar com,inf
uchar code table[]="DS1302"
uchar code table1[]="0123456789"
uchar code table2[]="WEEK-"
void delay1(uchar t)
{
uchar x,y
for(x=tx>0x--)
for(y=110y>0y--)
}
/*******************************************
给1602写指令
*******************************************/
void write_com(uchar com)
{
rs=0
P0=com
delay1(5)
e=1
delay1(5)
e=0
}
/*******************************************
给1602写数据
*******************************************/
void write_date(uchar date)
{
rs=1
P0=date
delay1(5)
e=1
delay1(5)
e=0
}
/*******************************************
1602初始化
*******************************************/
void unit()
{
e=0
rw=0
write_com(0x38)
write_com(0x0c)
write_com(0x06)
write_com(0x01)
}
/*******************************************
主函数
*******************************************/
void main()
{
uchar i
uchar t_sec,sec1,sec2
uchar t_min,min1,min2
uchar t_hour,hour1,hour2
uchar t_mon,mon1,mon2
uchar t_day,day1,day2
uchar t_year,year1,year2
uchar week,week1
uchar num
unit()
init_1302()
while(1)
{
t_sec=read_1302(0x81)//du miao
sec1=t_sec&0x0f
sec2=(t_sec>>4)
t_min=read_1302(0x83)//du fen
min1=t_min&0x0f
min2=(t_min>>4)
t_hour=read_1302(0x85)//du shi
hour1=t_hour&0x0f
hour2=(t_hour>>4)
t_day=read_1302(0x87)//du ri
day1=t_day&0x0f
day2=(t_day>>4)
t_mon=read_1302(0x89)//du yue
mon1=t_mon&0x0f
mon2=(t_mon>>4)
week=read_1302(0x8b)//du xing qi
week1=week&0x0f
t_year=read_1302(0x8d)//du nian
year1=t_year&0x0f
year2=(t_year>>4)
write_com(0x80)
for(i=0i<6i++)
{
write_date(table[i])
}
write_com(0x80+0x40)
for(i=0i<5i++)
{
write_date(table2[i])
}
write_com(0x80+0x07)
write_date(table1[year2])
write_com(0x80+0x08)
write_date(table1[year1])
write_com(0x80+0x09)
write_date('/')
write_com(0x80+0x0a)
write_date(table1[mon2])
write_com(0x80+0x0b)
write_date(table1[mon1])
write_com(0x80+0x0c)
write_date('/')
write_com(0x80+0x0d)
write_date(table1[day2])
write_com(0x80+0x0e)
write_date(table1[day1])
write_com(0x80+0x40+0x05)
write_date(table1[week1])
write_com(0x80+0x40+0x07)
write_date(table1[hour2])
write_com(0x80+0x40+0x08)
write_date(table1[hour1])
write_com(0x80+0x40+0x09)
write_date(':')
write_com(0x80+0x40+0x0a)
write_date(table1[min2])
write_com(0x80+0x40+0x0b)
write_date(table1[min1])
write_com(0x80+0x40+0x0c)
write_date(':')
write_com(0x80+0x40+0x0d)
write_date(table1[sec2])
write_com(0x80+0x40+0x0e)
write_date(table1[sec1])
}
}