導航:首頁 > 操作系統 > 節氣顯示51單片機

節氣顯示51單片機

發布時間:2023-02-22 12:04:31

㈠ 51單片機如何實時顯示時間

單片機實時顯示時間,可以用ds1302產生時鍾,然後計算時鍾,並送出結果。

㈡ 用51單片機製作可以顯示年月日時分秒的萬年歷,有電路圖和匯編語言程序。

可以,有1602LCD就可以

記得採納啊

㈢ 51單片機雨滴定時燃氣溫度的程序

proteus。根據使用手冊下載。51單片機是對兼容英特爾8051指令系統的單片機的統稱。51單片機廣泛應用於家用電器、汽車、工業測控、通信設備中。因為51單片機的指令系統、內部結構相對簡單,所以國內許多高校用其進行單片機入門教學。

㈣ 求怎麼用51單片機8*8點陣顯示出生日快樂四個字有源代碼就更好了,求大佬指點!

用51單片機8*8點陣顯示出「生日快樂」四個字,這辦不到的。至少要用16X16的點陣才能顯示出漢字。8*8的點陣只能顯示0~9的數字。如果是模擬顯示,就用4個8*8的點陣組成一個顯示屏,也很簡單的。要是實物開發板,那就無法顯示了。

模擬的效果如下:

㈤ 51單片機萬年歷實現24節氣有的可以,有的不行,怎麼回事

看看數據有無溢出,不同的單片機或者編譯平台各數據類型的位寬有所不同。

㈥ 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

㈦ 51單片機數字溫度計常見故障及解決辦法

用51做處理器,外圍電路如圖,一片雙積分轉換晶元ICL7135做AD,它的時鍾需要125K,用51的ALE經過一片CD4024分頻得到。1403提供基準源。另外,一片7660提供7135工作所需要的負壓。
為了省電,把所有模擬電路部分電源用一個晶體管管理起來,由P1.0來控制。(上圖為示意圖,省去了電阻沒畫)P1.0為地的時候,模擬系統才上電
現在怪現象如下:
模擬機正常運行,燒寫晶元後無反應。
模擬正常,說明外圍晶元完全正常,電路也沒有錯誤。
經過檢查,晶體正常,復位可靠,EA高,程序堆棧都沒有溢出,並排除其它一切低級錯誤的可能。
再編寫一程序,
main()
{
while(1) {P1.1=0;}
}
P1.1和VCC間接有一發光管,開機無反應。
後來,發現更奇怪的現象:
拔除CD4024,MC1403,ICL7135,ICL7660中的任何一個,系統就可以正常運行!
百思不得其解,茶飯不思,郁悶了N久
更換全部晶元,如故。
更換ATMEL/PHILIPS/WINBOND的N款單片機,如故。
檢查,排除電路故障的可能,
後來又發現,只要上電之前把P1.0對地短路,(也就是模擬部分強加電源),上電,系統正常運行。
但是,如果開機前P1.0不對地短路,上電一定不能運行,此後即使再把P1.0對地接,也不行。
順這個思路,應該是和模擬部分有關……
又是郁悶N久,之後,無意間翻看CD4024內部圖,茅塞頓開……
CD4024等TTL/CMOS邏輯晶元,為了防止靜電或錯誤的IO電平,內部都有保護電路

51單片機故障分析一個 - cryinrain_cug - cryinrain_cug的博客
如圖2,每個IO口都有如圖的2個二極體,集成在晶元內部。保證IO口電壓在-0.6~5.6V之間
復位的過程中,全部IO為高,P1.0和ALE當然也是高。這樣模擬部分不上電。
那麼,ALE的輸出角就等效於通過一個二極體向這四塊模擬晶元供電!!!(如圖)
ALE的輸出能力不強,自然,ALE就被拉低了。
在查看51的手冊,ALE和/PROG腳是復用的!!
在復位過程中,ALE如果為低,晶元進入編程狀態!!!
也就是說,我的系統在上電復位的過程中就進入了PROG編程模式,難怪一條語句都不能執行
那麼,也很好解釋為什麼四個晶元中拔掉一個就能正常工作了,因為負載輕了,ALE可能還沒有被拉到2.5V以下,所以正常復位進入程序。
解決的辦法:ALE接2K的上拉,再通過47K電阻接到Cd4024上,上電,一切正常!
結論:單片機編程模式/ISP模式是通過用戶很不容易出現的一個時序來啟動的,在一些特殊應用時要小心避開這些非用戶代碼模式。

㈧ 求只用51單片機設計的能顯示時分秒且能校時的C語言程序最好詳解哦

//at89c2051單片機 運用在(sft ck301)時鍾上的程序 12m晶振
//省去其他的功能,只有顯示時間功能,是24小時顯示制。
//三個按鍵的設置安排由左向右是
//k1:設置秒分時退出的循環按鈕 P3.5初始高電平
//k2; 數字上加循環 P3.4初始高電平
//k3: 數字下減循環 P3.2 初始高電平
//
//蜂鳴器 P3.7 初始高電平 低電平觸發
//
//數碼管
//段碼埠P1
//位碼分別是 P3.0十萬位 P3.4萬位 P3.2千位 P3.5百位P3.3十位 P3.1個位
//原11版本的計數器設置TMOD設置為0X20是錯誤的,應該是0x10,已經更正
//且裝填的數字是50000累加中斷數字是20都已經更正
#include<reg51.h> //包含單片機寄存器的頭文件
unsigned char code Tab[]={0x81,0xe7,0x92,0xa2,0xe4,0xa8,0x88,0xe3,0x80,0xa0,0xff};//數碼管段碼///P1口
////////////////////////----0----1----2---3-----4----5----6----7----8---9---空
unsigned int m; //// 秒
unsigned int f;//// 分
unsigned int s; //// 時
unsigned int a;//////主秒a
unsigned int b;//////主秒 b
unsigned int c; //////調節循環 0//顯示 1//調分 2//調時
sbit p30=P3^0;
sbit p31=P3^1;
sbit p32=P3^2;
sbit p33=P3^3;
sbit p34=P3^4;
sbit p35=P3^5;
sbit p37=P3^7;
sbit p17=P1^7;
/****************************************************************
函數名 delay(); 函數功能:延時一段時間 始
*****************************************************************/
void delay(void) //兩個void意思分別為無需返回值,沒有參數傳遞
{
unsigned int i; //定義無符號整數,最大取值范圍65535
for(i=0;i<10;i++) //做20000次空循環
; //什麼也不做,等待一個機器周期
}
/****************************************************************
函數名 delay(); 函數功能:延時一段時間 終
*****************************************************************/
/****************************************************************
函數名 xianshi(); 函數功能:顯示整個時鍾 始
*****************************************************************/
void xianshi() //兩個void意思分別為無需返回值,沒有參數傳遞
{
////////// 個位
p33=0;
p31=1;
p32=1;
p35=1;
p30=1;
p34=1;
P1=Tab[m%10];
delay();
//////////
p33=1;//////消除鬼影語句
delay();//////消除鬼影語句
P1=0xff;//////消除鬼影語句
////////// 十位
p33=1;
p31=0;
p32=1;
p35=1;
p30=1;
p34=1;
P1=Tab[m/10];
delay();
//////////
p31=1;//////消除鬼影語句
delay();//////消除鬼影語句
P1=0xff;//////消除鬼影語句
////////// 百位
p33=1;
p31=1;
p32=0;
p35=1;
p30=1;
p34=1;
P1=Tab[f%10];
delay();
//////////
p32=1;//////消除鬼影語句
delay();//////消除鬼影語句
P1=0xff;//////消除鬼影語句
////////// 千位
p33=1;
p31=1;
p32=1;
p35=0;
p30=1;
p34=1;
P1=Tab[f/10];
delay();
//////////
p35=1;//////消除鬼影語句
delay();//////消除鬼影語句
P1=0xff;//////消除鬼影語句
////////// 萬位
p33=1;
p31=1;
p32=1;
p35=1;
p30=0;
p34=1;
P1=Tab[s%10];
delay();
//////////
p30=1;//////消除鬼影語句
delay();//////消除鬼影語句
P1=0xff;//////消除鬼影語句
//////////十萬位
p33=1;
p31=1;
p32=1;
p35=1;
p30=1;
p34=0;
P1=Tab[s/10];
delay();
//////////
p34=1;//////消除鬼影語句
delay();//////消除鬼影語句
P1=0xff;//////消除鬼影語句
p33=1;
p31=1;
p32=1;
p35=1;
p30=1;
p34=1;

}
/****************************************************************
函數名 xianshi(); 函數功能:顯示整個時鍾 終
*****************************************************************/
/****************************************************************
函數名 xianshifen(); 函數功能:顯示分 始
*****************************************************************/
void xianshifen() //兩個void意思分別為無需返回值,沒有參數傳遞
{
////////// 百位
p33=1;
p31=1;
p32=0;
p35=1;
p30=1;
p34=1;
P1=Tab[f%10];
delay();
//////////
p32=1;//////消除鬼影語句
delay();//////消除鬼影語句
P1=0xff;//////消除鬼影語句
////////// 千位
p33=1;
p31=1;
p32=1;
p35=0;
p30=1;
p34=1;
P1=Tab[f/10];
delay();
//////////
p35=1;//////消除鬼影語句
delay();//////消除鬼影語句
P1=0xff;//////消除鬼影語句
p33=1;
p31=1;
p32=1;
p35=1;
p30=1;
p34=1;

}
/****************************************************************
函數名 xianshifen(); 函數功能:顯示分 終
*****************************************************************/
/****************************************************************
函數名 xianshishi(); 函數功能:顯示時 始
*****************************************************************/
void xianshishi() //兩個void意思分別為無需返回值,沒有參數傳遞
{

////////// 萬位
p33=1;
p31=1;
p32=1;
p35=1;
p30=0;
p34=1;
P1=Tab[s%10];
delay();
//////////
p30=1;//////消除鬼影語句
delay();//////消除鬼影語句
P1=0xff;//////消除鬼影語句
//////////十萬位
p33=1;
p31=1;
p32=1;
p35=1;
p30=1;
p34=0;
P1=Tab[s/10];
delay();
//////////
p34=1;//////消除鬼影語句
delay();//////消除鬼影語句
P1=0xff;//////消除鬼影語句
p33=1;
p31=1;
p32=1;
p35=1;
p30=1;
p34=1;

}
/****************************************************************
函數名 xianshishi(); 函數功能:顯示時 終
*****************************************************************/
/****************************************************************
函數名 leijijiamiao(); 函數功能:利用中斷累計加秒 始
*****************************************************************/
void leijijiamiao(void) //兩個void意思分別為無需返回值,沒有參數傳遞
{
if(b==1)
{
b=0;
m++;
p17=~p17; ////p17取反實現冒號閃爍
if(m==60)
{
m=0;
f++;
}
if(f==60)
{
f=0;
s++;
}
if(s==24)
{
s=0;
}
}
}
/****************************************************************
函數名 leijijiamiao(); 函數功能:利用中斷累計加秒 終
*****************************************************************/
/*******************************************************************
函數功能:主函數 (C語言規定必須有也只能有1個主函數) 始
********************************************************************/
void main()
{ //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/******************************************************************
定義初始值
******************************************************************/
p37=1;////蜂鳴器不發聲
f=0;
m=0;
s=0;
c=0;
p17=1;
/******************************************************************
定義初始值
******************************************************************/

/***********************************************************************
定時計數器的操作 作為定時器使用1秒計時 始
************************************************************************/
EA=1; //開總中斷
ET1=1; //定時器T1中斷允許
TR1=1;//啟動定時計數器T1
TMOD=0x10;////0001 0000 設置定時計數器T1為定時使用,並使用16位定時器
TH1=(65536-50000)/256;//////裝填定時計數器T1高8位//定時5000次的時間是0.05秒。得循環20次才是1秒
TL1=(65536-50000)%256;//////裝填定時技數器T1底8位//定時5000次的時間是0.05秒。得循環20次才是1秒
TF1=0;/////////定時計數器1的溢出位清零
/***********************************************************************
定時計數器的操作 作為定時器使用1秒計時 終
************************************************************************/
while(1) ////////////////////////////////////主循環
{////////////////////////////////////主循環 始
//////////////////////////////////////////////////////////顯示 循環
while(c==0)
{
xianshi();
leijijiamiao();
if(p35==0)
{
delay();
delay();
delay();
delay();
if(p35==0)
{
c++;
while(!p35)
{
;
}
}
}
}
//////////////////////////////////////////////////////////顯示 循環
//////////////////////////////////////////////////////////調分 循環
while(c==1)
{
xianshifen();
////////////////// 調分 上加按鈕判斷
if(p34==0)
{
delay();
delay();
delay();
delay();
if(p34==0)
{
f++;
if(f==60)
{
f=0;
}
while(!p34)
{
;
}
}
}
/////////////////// 調分 上加按鈕判斷
/////////////////// 調分 下減按鈕判斷
if(p32==0)
{
delay();
delay();
delay();
delay();
if(p32==0)
{
if(f==00)
{
f=60;
}
f--;
while(!p32)
{
;
}
}
}
///////////////////調分 下減按鈕判斷
///////////////////循環按鈕判斷
if(p35==0)
{
delay();
delay();
delay();
delay();
if(p35==0)
{
c++;
while(!p35)
{
;
}
}
}
///////////////////循環按鈕判斷
}
//////////////////////////////////////////////////////////調分 循環
//////////////////////////////////////////////////////////調時 循環
while(c==2)
{
xianshishi();
///////////////////調時 上加按鈕判斷
if(p34==0)
{
delay();
delay();
delay();
delay();
if(p34==0)
{
s++;
if(s==24)
{
s=0;
}
while(!p34)
{
;
}
}
}
///////////////////調時 上加按鈕判斷
///////////////////調時 下減按鈕判斷
if(p32==0)
{
delay();
delay();
delay();
delay();
if(p32==0)
{
if(s==00)
{
s=24;
}
s--;
while(!p32)
{
;
}
}
}
///////////////////調時 下減按鈕判斷
///////////////////循環按鈕判斷
if(p35==0)
{
delay();
delay();
delay();
delay();
if(p35==0)
{
c=0;
while(!p35)
{
;
}
}
}
///////////////////循環按鈕判斷
}
//////////////////////////////////////////////////////////調時 循環
}////////////////////////////////////主循環 終
} //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/*******************************************************************
函數功能:主函數 (C語言規定必須有也只能有1個主函數) 終
********************************************************************/
/*****************************************************************************************************************
中斷服務函數;定時器T1中斷服務函數//當定時計數器T1有溢出時則執行本函數,執行完本函數後接著執行之前的運行的程序
******************************************************************************************************************/
void Time1(void) interrupt 3 using 0
//interrupt 3 理解是中斷函數修飾後面的數字取值由0--31,
//目前數字意義是0--外部中斷0、1--定時計數器T0、2--外中斷1、3--定時計數器T1、4--串列中斷、5--定時計數器T2(其他數值保留)
//using 0 理解是工作寄存器組,可以忽略 通常取0
{
TF1=0;
TH1=(65536-50000)/256;//////裝填定時計數器T1高8位//定時5000次的時間是0.05秒。得循環20次才是1秒
TL1=(65536-50000)%256;//////裝填定時技數器T1底8位//定時5000次的時間是0.05秒。得循環20次才是1秒
a++;
if(a==20)////檢測a的數值為3713後給b加1///當定時器有3713次溢出時最接近1秒計時(20121018號由原來的3713改為3715)之前時鍾偏快
{
a=0;
b=1;
}
}
/*****************************************************************************************************************
中斷服務函數;定時器T1中斷服務函數//當定時計數器T1有溢出時則執行本函數,執行完本函數後接著執行之前的運行的程序
******************************************************************************************************************/

㈨ 關於51單片機哪款適合做電子時鍾

STC8952足夠了,網上有現成的萬年歷51,包括時間,日期,(陰歷)節氣都有,當然鬧鍾也是有的,代碼也非常小,你不一定要去看那個代碼,
實際上就是告訴你寫出這個程序代碼不需要很大的空間,52完全是夠了,速度方面52足夠強了,再去買ds1302晶元,其它的也可以,不買都行,上面萬年歷那個就可以實現這個功能,+顯示屏
淘寶上大量都可以選擇。

㈩ 51單片機電子鍾程序數碼管顯示

#include<reg51.h>

#define uchar unsigned char

sbit la=P2^6;
sbit wela=P2^7;
sbit beep=P2^3;
unsigned char j,k,a1,a0,b1,b0,c1,c0,s,f,m,key=10,temp,qq;
uchar shi20,shi10,fen20,fen10,miao20,miao10,new,ok=1,wei;
unsigned int pp;
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

void delay(unsigned char i)
{
for(j=i;j>0;j--)
for(k=125;k>0;k--);
}
void display(uchar shi2,uchar shi1,uchar fen2,uchar fen1,uchar miao2,uchar miao1)
{
la=0;
P0=table[shi2];
la=1;
la=0;

wela=0;
P0=0xfe;
wela=1;
wela=0;
delay(5);

P0=table[shi1]|0x80;
la=1;
la=0;

P0=0xfd;
wela=1;
wela=0;
delay(5);

P0=table[fen2];
la=1;
la=0;

P0=0xfb;
wela=1;
wela=0;
delay(5);

P0=table[fen1]|0x80;
la=1;
la=0;

P0=0xf7;
wela=1;
wela=0;
delay(5);

P0=table[miao2];
la=1;
la=0;

P0=0xef;
wela=1;
wela=0;
delay(5);

P0=table[miao1];
la=1;
la=0;

P0=0xdf;
wela=1;
wela=0;
delay(5);
}

void keyscan0()
{
P3=0xfb;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xbb:
ok=0;
break;

case 0x7b:
ok=1;
break;
}
}
}
}

void keyscan()
{
{
P3=0xfe;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xee:
key=0;
wei++;
break;

case 0xde:
key=1;
wei++;
break;

case 0xbe:
key=2;
wei++;
break;

case 0x7e:
key=3;
wei++;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
beep=0;
}
beep=1;
}
}
P3=0xfd;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xed:
key=4;
wei++;
break;

case 0xdd:
key=5;
wei++;
break;

case 0xbd:
key=6;
wei++;
break;

case 0x7d:
key=7;
wei++;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
beep=0;
}
beep=1;
}
}
P3=0xfb;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
if(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xeb:
key=8;
wei++;
break;

case 0xdb:
key=9;
wei++;
break;
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
beep=0;
}
beep=1;
}
}
}
}

void main()
{
TMOD=0x01;

TH0=(65536-46080)/256;// 由於晶振為11.0592,故所記次數應為46080,計時器每隔50000微秒發起一次中斷。
TL0=(65536-46080)%256;//46080的來歷,為50000*11.0592/12
ET0=1;
EA=1;

while(1)
{ keyscan0();

if(ok==1)
{ TR0=1;
wei=0;

if(pp==20)
{ pp=0;
m++;
if(m==60)
{
m=0;
f++;
if(f==60)
{
f=0;
s++;
if(s==24) //為24h一個循環,若要12h,只需在此改為12即可。
{
s=0;
}
}
}
}

a0=s%10;
a1=s/10;
b0=f%10;
b1=f/10;
c0=m%10;
c1=m/10;
display(a1,a0,b1,b0,c1,c0);
}
else
{ TR0=0;
keyscan();
if(key!=10)
{

switch(wei)
{
case 1: if(key<3) //小時最高位為2
a1=key;
else
wei--;
break;
case 2: if(a1==1|a1==0)
a0=key;
else
if(key<5)
a0=key; //當小時最高位為2時,低位最高為4
break;
case 3: if(key<7) //分鍾最高位為6
b1=key;
else
wei--;
break;
case 4: b0=key; break;
case 5: if(key<7) //秒最高位為6
c1=key;
else
wei--;
break;
case 6: c0=key; break;
}
key=10;
}
m=c1*10+c0;
f=b1*10+b0;
s=a1*10+a0;
display(a1,a0,b1,b0,c1,c0);
}
}
}

void time0() interrupt 1
{ TH0=(65536-46080)/256;
TL0=(65536-46080)%256;
pp++;
}

閱讀全文

與節氣顯示51單片機相關的資料

熱點內容
雲空間在哪個文件夾 瀏覽:924
編程游戲小貓抓小魚 瀏覽:782
安卓dosbox怎麼打開 瀏覽:772
伺服器無影響是怎麼回事 瀏覽:950
比德電子采購平台加密 瀏覽:200
加密貨幣400億 瀏覽:524
植發2次加密 瀏覽:44
vc6查看編譯的錯誤 瀏覽:595
心理大全pdf 瀏覽:1002
區域鏈加密幣怎麼樣 瀏覽:343
查找命令符 瀏覽:95
壓縮工具zar 瀏覽:735
白盤怎麼解壓 瀏覽:475
辰語程序員學習筆記 瀏覽:47
程序員被公司勸退 瀏覽:523
java三子棋 瀏覽:693
加密空間怎麼強制進入 瀏覽:345
ug分割曲線命令 瀏覽:209
學碼思程序員 瀏覽:610
自考雲學習app為什麼登不上 瀏覽:410