導航:首頁 > 編程語言 > 1602萬年歷程序

1602萬年歷程序

發布時間:2022-09-19 04:12:14

Ⅰ 萬年歷程序設計C++

這個需要時間,我也是剛學C++的,但是有預感,這個還是可以做的。。還是自己多做做吧,有助於你的編程水平的提高

Ⅱ 單片機和lcd1602編寫萬年歷C語言程序,求高手啊

下面是我的程序,還有模擬圖,不懂可以再問我,祝你成功

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

ds1302計時+lcd1602顯示

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

#include<reg51.h>

#include<intrins.h>

#defineucharunsignedchar

#defineuintunsignedint

sbitrs=P2^0;

sbitrw=P2^1;

sbite=P2^2;

sbitT_RST=P1^5;

sbitT_CLK=P1^6;

sbitT_IO=P1^7;

sbitACC0=ACC^0;

sbitACC7=ACC^7;

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

向1302寫一個位元組

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

voidinput_BYTE(uchardat)

{

uchari;

ACC=dat;

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

{

T_IO=ACC0;

T_CLK=1;

T_CLK=0;

ACC=(ACC>>1);

}

}

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

1302讀出一個位元組

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

ucharoutput_BYTE()

{

uchari;

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

{

ACC=(ACC>>1);

ACC7=T_IO;

T_CLK=1;

T_CLK=0;

}

return(ACC);

}

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

寫數據

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

voidwrite_1302(ucharadd,uchardat)

{

T_RST=0;

T_CLK=0;

T_RST=1;

input_BYTE(add);

input_BYTE(dat);

T_CLK=1;

T_RST=0;

}

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

讀數據

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

ucharread_1302(ucharadd)

{

ucharinf;

T_RST=0;

T_CLK=0;

T_RST=1;

input_BYTE(add);

inf=output_BYTE();

T_CLK=1;

T_RST=0;

return(inf);

}

voidinit_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);//打開防寫;

}

ucharcom,inf;

ucharcodetable[]="DS1302";

ucharcodetable1[]="0123456789";

ucharcodetable2[]="WEEK-";

voiddelay1(uchart)

{

ucharx,y;

for(x=t;x>0;x--)

for(y=110;y>0;y--);

}

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

給1602寫指令

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

voidwrite_com(ucharcom)

{

rs=0;

P0=com;

delay1(5);

e=1;

delay1(5);

e=0;

}

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

給1602寫數據

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

voidwrite_date(uchardate)

{

rs=1;

P0=date;

delay1(5);

e=1;

delay1(5);

e=0;

}

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

1602初始化

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

voinit()

{

e=0;

rw=0;

write_com(0x38);

write_com(0x0c);

write_com(0x06);

write_com(0x01);

}

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

主函數

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

voidmain()

{

uchari;

uchart_sec,sec1,sec2;

uchart_min,min1,min2;

uchart_hour,hour1,hour2;

uchart_mon,mon1,mon2;

uchart_day,day1,day2;

uchart_year,year1,year2;

ucharweek,week1;

ucharnum;

unit();

init_1302();

while(1)

{

t_sec=read_1302(0x81);//miao;

sec1=t_sec&0x0f;

sec2=(t_sec>>4);

t_min=read_1302(0x83);//fen;

min1=t_min&0x0f;

min2=(t_min>>4);

t_hour=read_1302(0x85);//shi;

hour1=t_hour&0x0f;

hour2=(t_hour>>4);

t_day=read_1302(0x87);//ri;

day1=t_day&0x0f;

day2=(t_day>>4);

t_mon=read_1302(0x89);//yue;

mon1=t_mon&0x0f;

mon2=(t_mon>>4);

week=read_1302(0x8b);//xingqi;

week1=week&0x0f;

t_year=read_1302(0x8d);//nian;

year1=t_year&0x0f;

year2=(t_year>>4);

write_com(0x80);

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

{

write_date(table[i]);

}

write_com(0x80+0x40);

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

{

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

}

}

Ⅲ 求51單片機 1602+1302可以顯示農歷的萬年歷或農歷部分的c語言程序

與MCS-51單片機產品兼容 、8K位元組在系統可編程Flash存儲器、 1000次擦寫周期、 全靜態操作:0Hz~33Hz 、 三級加密程序存儲器 、 32個可編程I/O口線 、三個16位定時器/計數器 八個中斷源 、全雙工UART串列通道、 低功耗空閑和掉電模式 、掉電後中斷可喚醒 、看門狗定時器 、雙數據指針 、掉電標識符 。

功能特性描述
At89s52 是一種低功耗、高性能CMOS8位微控制器,具有 8K 在系統可編程Flash 存儲器。使用Atmel 公司高密度非 易失性存儲器技術製造,與工業80C51 產品指令和引腳完 全兼容。片上Flash允許程序存儲器在系統可編程,亦適於 常規編程器。在單晶元上,擁有靈巧的8 位CPU 和在系統 可編程Flash,使得AT89S52為眾多嵌入式控制應用系統提 供高靈活、超有效的解決方案。 AT89S52具有以下標准功能: 8k位元組Flash,256位元組RAM, 32 位I/O 口線,看門狗定時器,2 個數據指針,三個16 位 定時器/計數器,一個6向量2級中斷結構,全雙工串列口, 片內晶振及時鍾電路。另外,AT89S52 可降至0Hz 靜態邏 輯操作,支持2種軟體可選擇節電模式。空閑模式下,CPU 停止工作,允許RAM、定時器/計數器、串口、中斷繼續工 作。掉電保護方式下,RAM內容被保存,振盪器被凍結, 單片機一切工作停止,直到下一個中斷或硬體復位為止。8 位微控制器 8K 位元組在系統可編程 Flash AT89S52

P0 口:P0口是一個8位漏極開路的雙向I/O口。作為輸出口,每位能驅動8個TTL邏
輯電平。對P0埠寫「1」時,引腳用作高阻抗輸入。
當訪問外部程序和數據存儲器時,P0口也被作為低8位地址/數據復用。在這種模式下,
P0具有內部上拉電阻。
在flash編程時,P0口也用來接收指令位元組;在程序校驗時,輸出指令位元組。程序校驗
時,需要外部上拉電阻。
P1 口:P1 口是一個具有內部上拉電阻的8 位雙向I/O 口,p1 輸出緩沖器能驅動4 個
TTL 邏輯電平。對P1 埠寫「1」時,內部上拉電阻把埠拉高,此時可以作為輸入
口使用。作為輸入使用時,被外部拉低的引腳由於內部電阻的原因,將輸出電流(IIL)。
此外,P1.0和P1.2分別作定時器/計數器2的外部計數輸入(P1.0/T2)和時器/計數器2
的觸發輸入(P1.1/T2EX),具體如下表所示。
在flash編程和校驗時,P1口接收低8位地址位元組。
引腳號第二功能
P1.0 T2(定時器/計數器T2的外部計數輸入),時鍾輸出
P1.1 T2EX(定時器/計數器T2的捕捉/重載觸發信號和方向控制)
P1.5 MOSI(在系統編程用)
P1.6 MISO(在系統編程用)
P1.7 SCK(在系統編程用)
P2 口:P2 口是一個具有內部上拉電阻的8 位雙向I/O 口,P2 輸出緩沖器能驅動4 個
TTL 邏輯電平。對P2 埠寫「1」時,內部上拉電阻把埠拉高,此時可以作為輸入
口使用。作為輸入使用時,被外部拉低的引腳由於內部電阻的原因,將輸出電流(IIL)。
在訪問外部程序存儲器或用16位地址讀取外部數據存儲器(例如執行MOVX @DPTR)
時,P2 口送出高八位地址。在這種應用中,P2 口使用很強的內部上拉發送1。在使用
8位地址(如MOVX @RI)訪問外部數據存儲器時,P2口輸出P2鎖存器的內容。
在flash編程和校驗時,P2口也接收高8位地址位元組和一些控制信號。
P3 口:P3 口是一個具有內部上拉電阻的8 位雙向I/O 口,p2 輸出緩沖器能驅動4 個
TTL 邏輯電平。對P3 埠寫「1」時,內部上拉電阻把埠拉高,此時可以作為輸入
口使用。作為輸入使用時,被外部拉低的引腳由於內部電阻的原因,將輸出電流(IIL)。
P3口亦作為AT89S52特殊功能(第二功能)使用,如下表所示。
在flash編程和校驗時,P3口也接收一些控制信號。

埠引腳 第二功能
P3.0 RXD(串列輸入口)
P3.1 TXD(串列輸出口)
P3.2 INTO(外中斷0)
P3.3 INT1(外中斷1)
P3.4 TO(定時/計數器0)
P3.5 T1(定時/計數器1)
P3.6 WR(外部數據存儲器寫選通)
P3.7 RD(外部數據存儲器讀選通)
此外,P3口還接收一些用於FLASH快閃記憶體編程和程序校驗的控制信號。
RST——復位輸入。當振盪器工作時,RST引腳出現兩個機器周期以上高電平將是單片機復位。
ALE/PROG——當訪問外部程存儲器或數據存儲器時,ALE(地址鎖存允許)輸出脈沖用於鎖存地址的低8位位元組。一般情況下,ALE仍以時鍾振盪頻率的1/6輸出固定的脈沖信號,因此它可對外輸出時鍾或用於定時目的。要注意的是:每當訪問外部數據存儲器時將跳過一個ALE脈沖。
對FLASH存儲器編程期間,該引腳還用於輸入編程脈沖(PROG)。
如有必要,可通過對特殊功能寄存器(SFR)區中的8EH單元的D0位置位,可禁止ALE操作。該位置位後,只有一條MOVX和MOVC指令才能將ALE激活。此外,該引腳會被微弱拉高,單片機執行外部程序時,應設置ALE禁止位無效。
PSEN——程序儲存允許(PSEN)輸出是外部程序存儲器的讀選通信號,當AT89C52由外部程序存儲器取指令(或數據)時,每個機器周期兩次PSEN有效,即輸出兩個脈沖,在此期間,當訪問外部數據存儲器,將跳過兩次PSEN信號。
EA/VPP——外部訪問允許,欲使CPU僅訪問外部程序存儲器(地址為0000H-FFFFH),EA端必須保持低電平(接地)。需注意的是:如果加密位LB1被編程,復位時內部會鎖存EA端狀態。
如EA端為高電平(接Vcc端),CPU則執行內部程序存儲器的指令。
FLASH存儲器編程時,該引腳加上+12V的編程允許電源Vpp,當然這必須是該器件是使用12V編程電壓Vpp。

Ⅳ 單片機萬年歷的c語言程序

沒分啊 那也給你發一個吧
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=0;i<8;i++)
{ DQ=0;
DQ=k&0x01;//從低位開始
delay(5);
DQ=1;
k>>=1;
}
delay(4);
}

int read_sj()
{
uchar j,date;
for(j=0;j<8;j++)
{
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 ,shi,ge;
=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(>0) //若顯示shi肯定顯示
{
write_zl(0x80+0x50+3);
write_sj(0x30+);
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=0;j<8;j++)
{ IO=s&0x01;
SCLK=0;
SCLK=1;

s=s>>1;
}}
uchar DS1302_readbyte()
{ uchar i,R=0;
SCLK=0;
delay(10);
for(i=8;i>0;i--)
{
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=0;num<13;num++)
{ write_sj(tab[num]);}
for(num=13;num<16;num++)
{ write_sj(tab[num]);}
write_zl(0x80+0x40);
for(num=0;num<12;num++)
{ 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=31;break;
case 2: if((year%4==0&&year%100!=0)||year%400==0)
nn=29;
else
nn=28;break;
case 3: nn=31;break;
case 4: nn=30;break;
case 5: nn=31;break;
case 6: nn=30;break;
case 7: nn=31;break;
case 8: nn=31;break;
case 9: nn=30;break;
case 10: nn=31;break;
case 11: nn=30;break;
case 12: nn=31;break;
}}
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=1;write_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=7;write_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=0;n<16;n++)
write_sj(ttable[n]);
temperaturechange();
write_temperature(tem);
}
}

Ⅳ stc89c52 用1602顯示萬年歷 時間只走一次

目錄 III
第一章 緒 論 - 1 -
1.1課題的背景 - 1 -
1.2課題意義 - 2 -
1.3本章小結 - 3 -
第二章 總體設計方案與論證 - 4 -
2.1 電源模塊方案的選擇與論證 - 4 -
2.2 時鍾電路方案的選擇與論證 - 4 -
2.3 顯示電路方案的選擇與論證 - 5 -
2.4 鬧鍾電路方案的選擇與論證 - 5 -
2.5 鍵掃描電路方案的選擇與論證 - 6 -
2.6 本章小結 - 6 -
第三章 系統硬體設計 - 7 -
3.1 主控晶元STC89C52的介紹 - 7 -
3.1.1 STC89C52的主要性能參數 - 7 -
3.1.2 STC89C52單片機的功能特性概述: - 8 -
3.2時鍾部分功能介紹及電路設計 - 11 -
3.3顯示模塊功能介紹及電路設計 - 14 -
3.4鬧鍾電路模塊介紹及電路設計 - 16 -
3.5功能按鍵模塊介紹及電路設計 - 17 -
3.6電源模塊介紹及電路設計 - 17 -
3.7 本章小結 - 18 -
第四章 系統軟體設計 - 19 -
4.1日歷程序設計 - 19 -
4.2 時間調整程序設計 - 20 -
4.3 鬧鍾設置程序設計 - 22 -
4.4 鬧鍾蜂鳴程序設計 - 23 -
4.5本章小結 - 23 -
第五章 系統調試 - 24 -
5.1系統的調試 - 24 -
5.2系統的調試出現的問題及解決 - 24 -
5.3本章小結 - 24 -
第六章 結 論 - 25 -
參考文獻 - 26 -
致 謝 - 27 -
附錄 - 28 -
附錄一 :本設計電路原理圖 - 28 -
附錄二:數字日歷鍾電路設計的C程序 - 29 -

Ⅵ 跪求個利用51單片機1602顯示屏DS1302做的萬年歷c編程序,帶有公歷,農歷,星期,時間功能,一定要有農歷

農歷計算方式,
///月份數據表
code uchar day_code1[9]={0x0,0x1f,0x3b,0x5a,0x78,0x97,0xb5,0xd4,0xf3};
code uint day_code2[3]={0x111,0x130,0x14e};
/*
函數功能:輸入BCD陽歷數據,輸出BCD陰歷數據(只允許1901-2099年)
調用函數示例:Conversion(c_sun,year_sun,month_sun,day_sun)
如:計算2004年10月16日Conversion(0,0x4,0x10,0x16);
c_sun,year_sun,month_sun,day_sun均為BCD數據,c_sun為世紀標志位,c_sun=0為21世
紀,c_sun=1為19世紀
調用函數後,原有數據不變,讀c_moon,year_moon,month_moon,day_moon得出陰歷BCD數據
*/
bit c_moon;
data uchar year_moon,month_moon,day_moon,week;
/*子函數,用於讀取數據表中農歷月的大月或小月,如果該月為大返回1,為小返回0*/
bit get_moon_day(uchar month_p,uint table_addr)
{
uchar temp;
switch (month_p)
{
case 1:{temp=year_code[table_addr]&0x08;
if (temp==0)return(0);else return(1);}
case 2:{temp=year_code[table_addr]&0x04;
if (temp==0)return(0);else return(1);}
case 3:{temp=year_code[table_addr]&0x02;
if (temp==0)return(0);else return(1);}
case 4:{temp=year_code[table_addr]&0x01;
if (temp==0)return(0);else return(1);}
case 5:{temp=year_code[table_addr+1]&0x80;
if (temp==0) return(0);else return(1);}
case 6:{temp=year_code[table_addr+1]&0x40;
if (temp==0)return(0);else return(1);}
case 7:{temp=year_code[table_addr+1]&0x20;
if (temp==0)return(0);else return(1);}
case 8:{temp=year_code[table_addr+1]&0x10;
if (temp==0)return(0);else return(1);}
case 9:{temp=year_code[table_addr+1]&0x08;
if (temp==0)return(0);else return(1);}
case 10:{temp=year_code[table_addr+1]&0x04;
if (temp==0)return(0);else return(1);}
case 11:{temp=year_code[table_addr+1]&0x02;
if (temp==0)return(0);else return(1);}
case 12:{temp=year_code[table_addr+1]&0x01;
if (temp==0)return(0);else return(1);}
case 13:{temp=year_code[table_addr+2]&0x80;
if (temp==0)return(0);else return(1);}
}
}
/*
函數功能:輸入BCD陽歷數據,輸出BCD陰歷數據(只允許1901-2099年)
調用函數示例:Conversion(c_sun,year_sun,month_sun,day_sun)
如:計算2004年10月16日Conversion(0,0x4,0x10,0x16);
c_sun,year_sun,month_sun,day_sun均為BCD數據,c_sun為世紀標志位,c_sun=0為21世
紀,c_sun=1為19世紀
調用函數後,原有數據不變,讀c_moon,year_moon,month_moon,day_moon得出陰歷BCD數據
*/
void Conversion(bit c,uchar year,uchar month,uchar day)
{ //c=0 為21世紀,c=1 為19世紀 輸入輸出數據均為BCD數據
uchar temp1,temp2,temp3,month_p;
uint temp4,table_addr;
bit flag2,flag_y;
temp1=year/16; //BCD->hex 先把數據轉換為十六進制
temp2=year%16;
year=temp1*10+temp2;
temp1=month/16;
temp2=month%16;
month=temp1*10+temp2;
temp1=day/16;
temp2=day%16;
day=temp1*10+temp2;
//定位數據表地址
if(c==0)
{
table_addr=(year+0x64-1)*0x3;
}
else
{
table_addr=(year-1)*0x3;
}
//定位數據表地址完成
//取當年春節所在的公歷月份
temp1=year_code[table_addr+2]&0x60;
temp1=_cror_(temp1,5);
//取當年春節所在的公歷月份完成
//取當年春節所在的公歷日
temp2=year_code[table_addr+2]&0x1f;
//取當年春節所在的公歷日完成
// 計算當年春年離當年元旦的天數,春節只會在公歷1月或2月
if(temp1==0x1)
{
temp3=temp2-1;
}
else
{
temp3=temp2+0x1f-1;
}
// 計算當年春年離當年元旦的天數完成
//計算公歷日離當年元旦的天數,為了減少運算,用了兩個表
//day_code1[9],day_code2[3]
//如果公歷月在九月或前,天數會少於0xff,用表day_code1[9],
//在九月後,天數大於0xff,用表day_code2[3]
//如輸入公歷日為8月10日,則公歷日離元旦天數為day_code1[8-1]+10-1
//如輸入公歷日為11月10日,則公歷日離元旦天數為day_code2[11-10]+10-1
if (month<10)
{
temp4=day_code1[month-1]+day-1;
}
else
{
temp4=day_code2[month-10]+day-1;
}
if ((month>0x2)&&(year%0x4==0))
{ //如果公歷月大於2月並且該年的2月為閏月,天數加1
temp4+=1;
}
//計算公歷日離當年元旦的天數完成
//判斷公歷日在春節前還是春節後
if (temp4>=temp3)
{ //公歷日在春節後或就是春節當日使用下面代碼進行運算
temp4-=temp3;
month=0x1;
month_p=0x1; //month_p為月份指向,公歷日在春節前或就是春節當日month_p指向首月
flag2=get_moon_day(month_p,table_addr);
//檢查該農歷月為大小還是小月,大月返回1,小月返回0
flag_y=0;
if(flag2==0)temp1=0x1d; //小月29天
else temp1=0x1e; //大小30天
temp2=year_code[table_addr]&0xf0;
temp2=_cror_(temp2,4); //從數據表中取該年的閏月月份,如為0則該年無閏月
while(temp4>=temp1)
{
temp4-=temp1;
month_p+=1;
if(month==temp2)
{
flag_y=~flag_y;
if(flag_y==0)
month+=1;
}
else month+=1;
flag2=get_moon_day(month_p,table_addr);
if(flag2==0)temp1=0x1d;
else temp1=0x1e;
}
day=temp4+1;
}
else
{ //公歷日在春節前使用下面代碼進行運算
temp3-=temp4;
if (year==0x0)
{
year=0x63;c=1;
}
else year-=1;
table_addr-=0x3;
month=0xc;
temp2=year_code[table_addr]&0xf0;
temp2=_cror_(temp2,4);
if (temp2==0)
month_p=0xc;
else
month_p=0xd; //
/*month_p為月份指向,如果當年有閏月,一年有十三個月,月指向13,無閏月指向12*/
flag_y=0;
flag2=get_moon_day(month_p,table_addr);
if(flag2==0)temp1=0x1d;
else temp1=0x1e;
while(temp3>temp1)
{
temp3-=temp1;
month_p-=1;
if(flag_y==0)month-=1;
if(month==temp2)flag_y=~flag_y;
flag2=get_moon_day(month_p,table_addr);
if(flag2==0)temp1=0x1d;
else temp1=0x1e;
}
day=temp1-temp3+1;
}
c_moon=c; //HEX->BCD ,運算結束後,把數據轉換為BCD數據
temp1=year/10;
temp1=_crol_(temp1,4);
temp2=year%10;
year_moon=temp1|temp2;
temp1=month/10;
temp1=_crol_(temp1,4);
temp2=month%10;
month_moon=temp1|temp2;
temp1=day/10;
temp1=_crol_(temp1,4);
temp2=day%10;
day_moon=temp1|temp2;
}
/*************************************************************************
/*函數功能:輸入BCD陽歷數據,輸出BCD星期數據(只允許1901-2099年)
調用函數示例:Conver_week(c_sun,year_sun,month_sun,day_sun)
如:計算2004年10月16日Conversion(0,0x4,0x10,0x16);
c_sun,year_sun,month_sun,day_sun均為BCD數據,c_sun為世紀標志位,c_sun=0為21世
紀,c_sun=1為19世紀
調用函數後,原有數據不變,讀week得出陰歷BCD數據
*/
code uchar table_week[12]={0,3,3,6,1,4,6,2,5,0,3,5}; //月修正數據表
/*
演算法:日期+年份+所過閏年數+月較正數之和除7 的余數就是星期但如果是在
閏年又不到3 月份上述之和要減一天再除7
星期數為0
*/
void Conver_week(bit c,uchar year,uchar month,uchar day)
{//c=0 為21世紀,c=1 為19世紀 輸入輸出數據均為BCD數據
uchar temp1,temp2;
temp1=year/16; //BCD->hex 先把數據轉換為十六進制
temp2=year%16;
year=temp1*10+temp2;
temp1=month/16;
temp2=month%16;
month=temp1*10+temp2;
temp1=day/16;
temp2=day%16;
day=temp1*10+temp2;
if (c==0){year+=0x64;} //如果為21世紀,年份數加100
temp1=year/0x4; //所過閏年數只算1900年之後的
temp2=year+temp1;
temp2=temp2%0x7; //為節省資源,先進行一次取余,避免數大於0xff,避免使用整型數據
temp2=temp2+day+table_week[month-1];
if (year%0x4==0&&month<3)temp2-=1;
week=temp2%0x7;
}

Ⅶ 求不需要時鍾晶元單片萬年歷LCD1602顯示程序。坐等,急急急 基於STC89C52

這是一個1602計時的程序,稍微改一下就是萬年歷了

//12MHz
#include<AT89X51.H>
unsignedcharSec,Min,Hour;
#defineDBP2
#defineRSP3_0
#defineRWP3_1
#defineEP3_2
voiddelay1ms(void)//誤差0us
{
unsignedchara,b,c;
for(c=1;c>0;c--)
for(b=142;b>0;b--)
for(a=2;a>0;a--);
}
voidnop(unsignedchartime){while(time--);}
voidLCD_WriteCmd(unsignedcharcmd)
{
RS=0;
DB=cmd;
E=0;
nop(5);
E=1;
nop(5);
}
voidLCD_WriteData(unsignedchardat)
{
RS=1;
DB=dat;
E=0;
nop(5);
E=1;
nop(5);
}

voidInit1602(void)
{
RW=0;
LCD_WriteCmd(0x38);
delay1ms();
LCD_WriteCmd(0x0c);
delay1ms();
LCD_WriteCmd(0x06);
delay1ms();
LCD_WriteCmd(0x01);
delay1ms();
}

voidLCD_Clear()
{
LCD_WriteCmd(0x01);
delay1ms();
}
voidLCD_SetAddress(unsignedcharx,unsignedchary)
{
if(y)
LCD_WriteCmd(0xc0+x);
else
LCD_WriteCmd(0x80+x);
delay1ms();
}
voidLCD_DrawChar(unsignedchardat)
{
LCD_WriteData(dat);
delay1ms();
}
voidInitTimer0(void)
{
TMOD=0x01;
TH0=0x3C;
TL0=0x0B0;
EA=1;
ET0=1;
TR0=1;
}

voidmain(void)
{
InitTimer0();//初始化50ms定時器中斷
Init1602();//初始化1602
LCD_Clear();//1602清屏
while(1)
{
LCD_SetAddress(4,0);//顯示時間
LCD_DrawChar(Hour/10+'0');
LCD_DrawChar(Hour%10+'0');
LCD_DrawChar(':');
LCD_DrawChar(Min/10+'0');
LCD_DrawChar(Min%10+'0');
LCD_DrawChar(':');
LCD_DrawChar(Sec/10+'0');
LCD_DrawChar(Sec%10+'0');
}
}

voidTimer0Interrupt(void)interrupt1
{
staticunsignedcharcont;
TH0+=0x3C;
TL0+=0x0B0;
if(++cont==20)//20*50ms=1s
{
cont=0;
if(++Sec==60)
{
Sec=0;
if(++Min==60)
{
Min=0;
if(++Hour==24)
{
Hour=0;
}
}
}
}
}

效果:

閱讀全文

與1602萬年歷程序相關的資料

熱點內容
個稅app在哪裡填寫贍養父母 瀏覽:341
打開cad時總彈出一個文件 瀏覽:87
刪除一個文件夾找不到了 瀏覽:654
電腦桌面文件管理哪個軟體好 瀏覽:188
蘋果數據線頭歪了 瀏覽:135
ghostwin764位系統鏡像文件 瀏覽:443
感測器視頻教程下載 瀏覽:95
flash源文件賀卡下載 瀏覽:434
如何提高網路扶貧的效果 瀏覽:654
飛車軟體文件夾叫什麼 瀏覽:242
刷ec用什麼編程器 瀏覽:765
方菱數控u盤文件格式 瀏覽:260
編程為什麼輸出兩個變數 瀏覽:490
衛星大鍋2017用升級嗎 瀏覽:113
玉米win10系統下載 瀏覽:134
fgo技能升級減cd嗎 瀏覽:129
什麼記賬app免費好用 瀏覽:441
網路檢測可以檢測到什麼 瀏覽:504
sip協議教程 瀏覽:832
編程哪裡可以接項目 瀏覽:119

友情鏈接