導航:首頁 > 操作系統 > 51單片機實現農歷

51單片機實現農歷

發布時間:2024-03-27 17:52:44

Ⅰ 跪求個利用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;
}

Ⅱ 基於51單片機,DS1302,1602實現萬年歷(年月日時分秒)及鬧鍾功能的C程序,不要顯示農歷和溫度,謝謝!!

【八】電子表、萬年歷系列
[1]單片機公交車環境監測及時間顯示系統
功能描述:
1、按鍵調時間
2、帶備用電池(斷電繼續走時)
3、監測雜訊和溫濕度並實時顯示
4、超過報警值蜂鳴器會響
☆已作出的實物優酷視頻演示地址:
http://v.youku.com/v_show/id_XMTQ3OTMxMDUwMA==.html
[2]單片機語音報時電子表

功能描述:
1、按鍵調試設置鬧鍾
2、帶備用電池(斷電繼續走時)
3、整點語音報時
☆已作出的實物優酷視頻演示地址:
http://v.youku.com/v_show/id_XMTQ3OTMwMjM0OA==.html
[3]單片機紅外遙控電子表語音報時語音播報溫濕度

功能描述:
1、紅外遙控調時間設定鬧鍾
2、帶備用電池(斷電繼續走時)
3、整點語音報時語音播報溫濕度
4、按鍵遙控語音報時語音播報溫濕度
☆已作出的實物優酷視頻演示地址:
http://v.youku.com/v_show/id_XMTQ3OTMxMTUyOA==.html
[4]單片機紅外遙控電子表語音報時格林威治時間雙顯示

功能描述:
1、紅外遙控調時間設定鬧鍾
2、帶備用電池(斷電繼續走時)
3、整點語音報時語音播報溫濕度
4、按鍵遙控語音報時語音播報溫濕度
☆已作出的實物優酷視頻演示地址:
http://v.youku.com/v_show/id_XMTQ3OTMxMTUyOA==.html
[5]單片機多功能萬年歷電子表系統節日提醒溫濕度顯示

功能描述:
1、按鍵調時間,設置鬧鍾
2、帶備用電池(斷電繼續走時)
3、陽歷、農歷節日提醒;可顯示上午、中午、晚上、午夜、深夜等時間段
4、溫濕度實時顯示(可替換其他感測器數據顯示)
5、功能擴展:語音播報萬年歷、溫濕度等。(此項功能為擴展功能,需要需補差價)
☆已作出的實物優酷視頻演示地址:
http://v.youku.com/v_show/id_XMTU0MjI4OTExNg==.html
【二十】GPS授時定位系統系列
[1]GPS自動授時系統 語音報時/播報溫濕度
實現功能:
1.可設置授時模式為自動授時和手動更新
2.可脫離GPS數據利用本地時鍾晶元准確走時
3.可設置靜音模式、整點報時和自動語音播報溫濕度及其混合模式等四種語音工作模式
4.可以切換顯示本地時間和溫濕度數據和GPS衛星時間數據和定位數據
5.經過分析GPS數據,利用演算法縮短了解析時間在秒級時間內就能獲取到GPS時間數據(正常情況下,完成定位需要幾分鍾以上)
6.(亮點)利用演算法自動計算星期參數和農歷參數,程序內部演算法輸入任何陽歷日期數據即可得到准確的星期數據和農歷數據
7.利用12864串口工作模式,節省了8個IO
8.可根據需求進行功能定製
☆已作出的實物優酷視頻演示地址:
http://v.youku.com/v_show/id_XMjUzMzcyNTkyOA==.html

Ⅲ 基於51單片機製作萬年歷,用數碼管,定時器,不用時鍾晶元,不用液晶,怎麼做求大神解,原理圖和C程序

基於51單片機製作萬年歷,用兩個8位一體的共陰數碼管,顯示日期和時間。數碼管位選用兩片74HC138,便於動態掃描顯示,又節省引腳。用3個按鍵調時,K1為選擇調時狀態,K2為加1鍵,K3為減1鍵。

模擬圖如下:

Ⅳ 求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。

Ⅳ 51單片機 製作 日歷時鍾 用匯編語言 要詳細的代碼和硬體圖示

你好這是基於DS1302日歷時鍾的單片機匯編程序 51單片機
ORG 0000H
MOV SP,#30H
LOAD EQU P2.0
CLR LOAD
MOV R0,#0FH
MOV R1,#0AH ;亮度
ACALL TRT

MOV R0,#02H
MOV R1,#0BH ;掃描位數
ACALL TRT

MOV R0,#0FFH
MOV R1,#09H ;解碼
ACALL TRT

MOV R0,#01H
MOV R1,#0CH
CALL TRT
SETB P1.0
MOV 22H,#00H
;以下為按鍵掃描輸入初值子程序
KEYSET: MOV 73H,#01H ;設溫度初值為10度
MOV 74H,#00H
MOV 75H,#00H
CALL DISPLAY
KEY1: CALL KS1 ;調判斷有無鍵按下子程序
JNZ LK1 ;有鍵按下(A)<>0轉消抖延時
AJMP KEY1 ;無鍵按下返回,等鍵按下
LK1: CALL DEL10MS ;延時
CALL KS1 ;若有鍵按下則為真實按下
JNZ KEYI ;鍵按下(A)<>0轉鍵掃描
AJMP KEY1 ;不是鍵按下返回
KEYI: JNB ACC.0,KEYR ;加1鍵未按下,轉查減1鍵
LK2: CALL KS1 ;等待鍵釋放
CALL DEL10MS
JNZ LK2 ;未釋放,等待
INC 75H ;末位加1
MOV A,75H
CJNE A,#0AH,PPA
MOV 75H,#00H
INC 74H
MOV A,74H
CJNE A,#0AH,PPA
MOV 74H,#00H
INC 73H
PPA: CALL DISPLAY
AJMP KEY1 ;轉再次掃描
KEYR: JNB ACC.1,KEYH ;減1鍵未按下,轉查上限確認鍵
LK3: CALL KS1
CALL DEL10MS
JNZ LK3
MOV A,75H
CJNE A,#00H,PPC
MOV 75H,#09H
MOV A,74H
CJNE A,#00H,PPD
MOV 74H,#09H
DEC 73H
AJMP PPB
PPD: DEC 74H
AJMP PPB
PPC: DEC 75H
PPB: CALL DISPLAY
AJMP KEY1 ;再次掃描
KEYH: JNB ACC.2,KEYL ;上限鍵未按下,轉查下限確認鍵
LK4: CALL KS1
CALL DEL10MS
JNZ LK4
MOV A,73H
MOV 70H,A ;保存上限
MOV A,74H
MOV 71H,A
MOV A,75H
MOV 72H,A
AJMP KEY1
;KEYL: JNB ACC.3,KEY1
LK5: CALL KS1
CALL DEL10MS
JNZ LK5
MOV A,73H
MOV 6DH,A ;保存下限
MOV A,74H
MOV 6EH,A
MOV A,75H
MOV 6FH,A

EX_CON: ;CPL P1.3 ;使用儀器測試時用
CALL DS18B20 ;轉DS18B20采樣子程序
CALL DISPLAY
;以下為後向通道控制部分
CONTROL:MOV A,73H
CJNE A,6DH,NEQA
MOV A,74H
CJNE A,6EH,NEQB
CLR P1.5
CLR P1.6
JMP EX_CON ;樣溫=下限,返回採樣
NEQA: JNC NEQD ;CY=0,即(73H)>(6DH)時轉比上限
SETB P1.5
CLR P1.6
JMP EX_CON
NEQB: JNC NEQD
SETB P1.5
CLR P1.6
JMP EX_CON
NEQD: MOV A,73H
CJNE A,70H,NEQE
MOV A,74H
CJNE A,71H,NEQF
CLR P1.5
CLR P1.6
JMP EX_CON ;樣溫=上限,返回採樣
NEQE: JNC NEQH ;CY=0,即(73H)>(70H)時轉打開降溫開關
CLR P1.5
CLR P1.6
JMP EX_CON
NEQF: JNC NEQH
CLR P1.5
CLR P1.6
JMP EX_CON
NEQH: CLR P1.5
SETB P1.6
JMP EX_CON

KS1: MOV P0,#0FFH
MOV A,P0
CPL A
ANL A,#0FH
RET
DEL10MS:MOV R7,#20
S2: MOV R6,#250
S1: DJNZ R6,S1
DJNZ R7,S2
RET

;以下為顯示
DISPLAY:MOV A,73H ;字碼
MOV R0,A
MOV R1,#01H ;位置
ACALL TRT

MOV A,74H
MOV R0, A
MOV R1,#02H
ACALL TRT

MOV A,75H
MOV R0,A
MOV R1,#03H
ACALL TRT
RET
;JMP DIS

DS18B20:LCALL RESET ;測試溫度探頭存在否?
MOV A,#0CCH
LCALL WRITE
MOV A,#44H
LCALL WRITE ;命令字寫入探頭內
MOV R7,#70D ;延時
CALL DE11
LCALL RESET
MOV A,#0CCH
LCALL WRITE
MOV A,#0BEH
LCALL WRITE
LCALL READ ;讀取探頭內的溫度值
MOV B,A
MOV 21H,A ;保存溫度值低位
LCALL READ
MOV 20H,A ;保存溫度值高位
LCALL EXCHANG ;溫度值B轉D並送入顯示緩存
RET

RESET:
LA: SETB P1.0 ;復位
NOP
LB: CLR P1.0 ;480US < TS < 960US
MOV R7,#36D
CALL DE11
SETB P1.0 ;60US < T <90US
LC: MOV R7,#6D
CALL DE11
CLR C
ORL C,P1.0
JC LB
LF: MOV R7,#18D ;T > 270
CALL DE11
SETB P1.0
RET

WRITE:
MOV R3,#8
WR1: SETB P1.0
CLR P1.0 ;延時
MOV R4,#2
WR2: DJNZ R4,WR2
RRC A
MOV P1.0,C ;寫的數據在線上需延時
MOV R4,#18
WR3: DJNZ R4,WR3
NOP
SETB P1.0
DJNZ R3,WR1
SETB P1.0
RET

READ:
MOV R3,#8
RD1: CLR C
SETB P1.0 ;適當延時
NOP
NOP
CLR P1.0 ;適當延時
NOP
NOP
SETB P1.0 ;延時
MOV R4,#9
RD2: DJNZ R4,RD2
MOV C,P1.0
RRC A
MOV R5,#23
RD3: DJNZ R5,RD3
DJNZ R3,RD1
RET

DELAY: MOV R7,#10
DL2: MOV R6,#200
DL1: MOV R5,#250
DL0: DJNZ R5,DL0
DJNZ R6,DL1
DJNZ R7,DL2
RET

EXCHANG: MOV A,21H
SWAP A
ANL A,#0FH
MOV 24H,A
MOV A,20H
ANL A,#07H
SWAP A
ADD A,24H
MOV B,#10D
DIV AB
MOV 73H,A
MOV 74H,B
MOV A,21H
ANL A,#0FH
mov dptr,#SADDR ;小數部分的轉換查表
movc a,@a+dptr
MOV 75H,A
ret
SADDR: DB 00H,1H,02h ; bo_ying address in eeprom 0800h-0A08H
DB 03H,3H,04h ; da_ling address in eeprom 0A10H-0AD3H
DB 04H,05H,06h ;shou_ying address in eeprom 0AE0H-0C25H
DB 06H,7H,08h ; lu_ying address in eeprom 0C30H-0D75H
DB 08H,9H,9h,9H

DELAY15US: ;12MHZ ,15US
DE11: NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
DJNZ R7,DE11
RET

TRT: CLR P2.0 ;LOAD
MOV R2,#08H
MOV A,R1
T_1: CLR P2.2 ;SETB P2.2 ;CLK
RLC A
MOV P2.1,C ;DATA
CALL TDELAY
SETB P2.2 ;CLR P2.2
DJNZ R2,T_1
CALL TDELAY
MOV R2, #08H
MOV A,R0
TT2: CLR P2.2 ;SETB P2.2
RLC A
MOV P2.1,C
CALL TDELAY
SETB P2.2 ;CLR P2.2
DJNZ R2,TT2
SETB P2.0 ;CLR P2.0
RET

TDELAY: MOV R6,#01H
TMS0: MOV R7,#03H
TMS1: DJNZ R7,TMS1
DJNZ R6,TMS0
RET

Ⅵ C51單片機的萬年歷程序設計

我這有個數碼管顯示的程序
以前做的,。。
你可以在我這個程序上修改修改
包括鍵盤掃描,還有動態顯示



【。。。】
#include
//常量參數
#define TMODW 0x01;
#define SCONW 0x00;
#define xplay 0x04;//顯示分頻系數
//顯示位選
unsigned char data stb;
//鍵值緩存,0xFF無鍵命令
unsigned char data keynum;
//顯示字型變數
unsigned char data play[8];
//工作參數
unsigned char data l,m;
//字型碼
unsigned char code BCDPC[10]=
{0x3F,0x06,0x5B,0x4F,0x66,
0x6D,0x7D,0x07,0x7F,0x6F};
//字位碼
unsigned char code STBCODE[8]=
{0x01,0x02,0x04,0x08,
0x10,0x20,0x40,0x80 };
//400Hz xplay分頻計數
unsigned char data cttime;
//時鍾參數
unsigned char data hr,min,sec,sec100;
//調整時鍾參數(時鍾「走」)
void ct1()
{sec100++;
if (sec100==100)
{sec100=0;sec++;
if (sec==60)
{sec=0;min++;
if (min==60)
{min=0;hr++;
if (hr==24) hr=0;
}
}
}
}
//時鍾參數→LED 顯示緩存7段參數轉換函數;
void xcplay()
{play[0]=BCDPC[hr/10];
play[1]=BCDPC[hr%10];
play[2]=BCDPC[min/10];
play[3]=BCDPC[min%10];
play[4]=BCDPC[sec/10];
play[5]=BCDPC[sec%10];
play[6]=BCDPC[sec100/10];
play[7]=BCDPC[sec100%10];
}
//顯示掃描
void cplay()
{T0=1;//T0-高電平消隱
T1=0;//T1-低電平準備發脈沖前沿
TI=0;//?
P1=0;//?
SBUF=STBCODE[stb];
while (TI==0)
{
};
TI=0;
SBUF=play[stb];
while (TI==0)
{
};
T1=1;
T0=0;
stb=++stb&0x07;
}

extern void cthl0();
//定時器0中斷處理程序
void ct0(void) interrupt 1 using 1
{cthl0();
cttime--;
if (cttime==0)
{cttime=xplay;
ct1();//調用時鍾「走」函數
xcplay();//調用時鍾參數→Led顯示緩存轉換函數
};
cplay();
}
void w20ms()
{for (l=0;l<41;l++)
{for (m=0;m<81;m++)
{
}
}
}
void tkey()
{P1=0xF0;
keynum=0xFF;
if (P1!=0xF0)
{w20ms();
P1=0xF0;
if (P1!=0xF0)
{P1=0xFE;
switch (P1)
{case 0xEE:keynum=0;break;
case 0xDE:keynum=1;break;
case 0xBE:keynum=2;break;
case 0x7E:keynum=3;break;
}
P1=0xFD;
switch (P1)
{case 0xED:keynum=4;break;
case 0xDD:keynum=5;break;
case 0xBD:keynum=6;break;
case 0x7B:keynum=7;break;
}
P1=0xFB;
switch (P1)
{
case 0xEB:keynum=8;break;
}
};
};
P1=0x00;
}
void command()
{switch (keynum)
{
case 0:{hr=hr+1;
if (hr==24)
hr=0;
}
break;

case 1:{min=min+1;
if (min==60)
min=0;
}
break;

case 2:{sec=sec+1;
if (sec==60)
sec=0;
}
break;

case 3:{sec100=0;
}
break;

case 4:{
while(!(P1=0xED))
{
hr=0;
min=0;
sec=0;
}
}
break;

case 5:{hr=hr-1;
if (hr==00)
hr=24;
}
break;
case 6:{min=min-1;
if (min==00)
min=59;
}
break;

case 7:{sec=sec-1;
if (sec==00)
sec=0;
}
break;

case 0xFF:break;
}
keynum=0xFF;
}
main ()
{ hr=8;
min=5;
sec=8;
sec100=0;
TMOD=TMODW;
SCON=SCONW;
ET0=1;
TR0=1;
EA=1;
cttime=xplay;
while (1)
{w20ms();
tkey();
command();

};
}

閱讀全文

與51單片機實現農歷相關的資料

熱點內容
建立表結構的命令 瀏覽:577
安卓文件為什麼蘋果手機打不開 瀏覽:82
東奧輕4可以在哪個app做題 瀏覽:163
金融科技加密卡 瀏覽:835
程序員那麼開一共有多少集 瀏覽:980
面試程序員被問數學問題怎麼辦 瀏覽:91
背大學英語的app哪個最好 瀏覽:719
哪個app買的衣服好 瀏覽:467
天刀以前玩過的伺服器忘了怎麼辦 瀏覽:211
單片機基礎代碼解讀 瀏覽:233
廣東青少年編程學習 瀏覽:509
買男士香水去哪個app 瀏覽:548
androidsleep函數 瀏覽:151
android內核代碼下載 瀏覽:665
伺服器如何添加墨跡 瀏覽:747
diglinux安裝 瀏覽:279
虛擬機執行命令 瀏覽:444
cctv16奧林匹克頻道加密播出 瀏覽:899
c盤微信文件夾隱私 瀏覽:229
asp壓縮mdb 瀏覽:670