单片机万年历c语言

Python020

单片机万年历c语言,第1张

#include<stdio.h>

//判断是否是闰年

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])

}

}