導航:首頁 > 編程語言 > 51單片機時鍾匯編程序

51單片機時鍾匯編程序

發布時間:2023-01-18 14:30:17

1. 用51單片機實現時鍾功能程序

anEQUP0;

weiEQUP2;

keyBITP3.7;

ORG0000H

AJMPMAIN;絕對轉移指令,2kb范圍(11位)內跳轉LJMP16位64kb范圍內跳轉

;短轉移指令的功能是先使程序計數器PC加1兩次(即:取出指令碼),然後把加2後的地址和rel相加作為目標轉移地址。因此,短轉移指令是一條相對轉移指令,是一條雙位元組雙周期指令

ORG0030H;指明後面的程序從程序存儲器的0030H單元開始存放

DELAY200US:;@11.0592MHz

NOP

NOP

NOP

PUSH30H

PUSH31H

MOV30H,#2

MOV31H,#179

NEXT:

DJNZ31H,NEXT

DJNZ30H,NEXT

POP31H

POP30H

RET

ORG0060H

;DISPLAY子程序

DISPLAY:

PUSHACC;不能寫A,此處ACC代表地址,push後跟地址,代表把地址內的內容壓入棧中

PUSH00H;R0

PUSH06H;R6

PUSH07H;R7

PUSH83H;DPH

PUSH82H;DPL

MOVR6,#01H;位選數據,01指的是緩沖區最低位數據

MOVR7,#08H;循環次數

FLAG:

MOVan,#0x00;消影

MOVA,R6

CPLA;取反

MOVwei,A;位選

MOVA,#disBufDat

ADDA,R7

SUBBA,#0X08

MOVR0,A

MOVA,@R0;讀出要顯示的數據到A

MOVDPTR,#disTab

MOVCA,@A+DPTR;從rom取數據,取出要顯示的數據對應的段碼

MOVan,A;段選

MOVA,R6

RLA

MOVR6,A;更新下一次位選

LCALLDELAY200US

DJNZR7,FLAG

POP82H;DPL

POP83H;DPH

POP07H

POP06H

POP00H

POPACC

RET

ORG0100H

;定時器中斷0初始化

T0_INIT:

MOVTMOD,#0X01

MOVTH0,#0X3C

MOVTL0,#0XB0

SETBEA

SETBTR0

SETBET0

RET

ORG0130H

;T0中斷處理程序

INT_TIMERE0:

PUSHACC

SETBRS0

MOVTH0,#0X3C

MOVTL0,#0XB0

INCR0

MOVA,R0

SUBBA,#0X14

JBCY,SECFLAG

MOVR0,#0x00

INCsec

SECFLAG:

CLRRS0

POPACC

RETI

ORG000BH;定時器/計數器T0入口地址

LJMPINT_TIMERE0;跳轉到定時器/計數器中斷服務程序中去

disTab:DB0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00,0x40;0-f,空白,橫杠的段選數據

disBufDatEQU47H;定義顯示緩沖數據變數區,8個

disBufDatHeadEQU40H//單片機上顯示在最左邊

secEQU48H

;主程序

ORG0180H

MAIN:

MOVSP,#0X60;將0x60到0x7f設為堆棧區

LCALLT0_INIT

MOVdisBufDatHead,#0X00

MOVdisBufDatHead+1,#0X00

MOVdisBufDatHead+2,#0X11

MOVdisBufDatHead+3,#0X11

MOVdisBufDatHead+4,#0X11

MOVdisBufDatHead+5,#0X11

MOVdisBufDatHead+6,#0X11

MOVdisBufDatHead+7,#0X11

MOVsec,#0X3A

WHILE:

JBkey,KEYSCAN

MOVsec,0x00

KEYSCAN:

MOVA,sec

SUBBA,#3CH;超過60s歸零

JBCY,CLEAR

MOVsec,#0X00;clr加ram地址無效

CLEAR:

MOVA,sec

MOVB,#0AH

DIVAB;A/B,商存到A中,余數存B中

MOVdisBufDatHead,A

MOVdisBufDatHead+1,B

LCALLDISPLAY

LJMPWHILE;循環

END;

(1)51單片機時鍾匯編程序擴展閱讀

51機器周期和指令周期

1、機器周期是指單片機完成一個基本操作所花費的時間,一般使用微秒來計量單片機的運行速度,51單片機的一個機器周期包括12個時鍾振盪周期,也就是說如果51單片機採用12MHz晶振,那麼執行一個機器周期就只需要1μs;如果採用的是6MHz的晶振,那麼執行一個機器周期就需要2μs。

2、指令周期是指單片機執行一條指令所需要的時間,一般利用單片機的機器周期來計量指令周期。在51單片機里有單周期指令(執行這條指令只需一個機器周期),雙周期指令(執行這條指令只需要兩個機器周期),四周期指令(執行這條指令需要四個機器周期)。

除了乘、除兩條指令是四周期指令,其餘均為單周期或雙周期指令。也就是說,如果51單片機採用的是12MHz晶振,那麼它執行一條指令一般只需1~2微秒的時間;如果採用的是6MH晶振,執行一條指令一般就需2~4微秒的時間。

2. 51單片機時鍾程序設計

朋友以下是本人歷時一個月殫精竭慮自主開發的一個8位51單片機時鍾程序,望吾之兄弟姐妹習之,此程序乃採用一鍵控制,通過感知按下鍵持續時間的長短來進行調整時間,鬧鈴,6隻共陽數碼管輸出顯示,此外還包括整點鈴聲功能,在看程序之前我先交代一下運行該程序的硬體要求:12M晶振,P0埠驅動顯示,P2.0到P2.5控制顯示掃描,P2.7輸出鈴聲,注意:鈴聲功放三極體應採用pnp管。以下是該程序:
ORG 00H
SETB TR0
JMP START
ORG 000BH
LJMP T0
START: MOV IE,#82H
MOV TMOD,#01H
MOV DPTR,#TAB
MOV SP,#60H
MOV 20H,#0
MOV R0,#0
MOV R1,#0
MOV R2,#0
MOV R3,#0
MOV R4,#0
MOV R5,#0
MOV R6,#0
MOV R7,#0
MOV 50H,#0
MOV 51H,#0
MOV 52H,#0
MOV 53H,#0
MOV 54H,#0
MOV 55H,#0
MOV A,TL0
ADD A,0B5H
MOV TL0,A
MOV TH0,#3CH
LOOP: ANL 20H,#08H
UNSV: MOV R1,#0
LCALL DISPLAY
JB 03H,LOP1
LCALL SOUND
LCALL HDLY
LOP1: MOV P3,#0FEH ;按鍵監視
MOV A,P3
CJNE A,#0FEH,LOP2
MOV R1,#0
JMP LOOP
LOP2: MOV R1,#2 ;誤按判斷
LOP3: LCALL HD
DJNZ R1,LOP3
JNB 04H,LOOP
CLR 04H
LOP4: INC R1
MOV C,00H ;調秒
CPL C
MOV 00H,C
LCALL HDLY
CJNE R1,#40,LOP5
JMP LOOP
LOP5: JNB 05H,LOP4
CLR 05H
MOV R1,#0
LCALL HD
CLR 00H
JB 04H,TF
MOV R2,#0
MOV R3,#0
JMP LOP4
TF: CLR 04H
LOP6: INC R1
MOV C,01H ;調分
CPL C
MOV 01H,C
LCALL HDLY
CJNE R1,#40,LOP7
JMP LOOP
LOP7: JNB 05H,LOP6
CLR 05H
MOV R1,#0
LCALL HD
CLR 01H
JB 04H,TS
INC R4
MOV R1,#0
CJNE R4,#10,LOP6
MOV R4,#0
INC R5
CJNE R5,#6,LOP6
MOV R5,#0
JMP LOP6
TS: CLR 04H
LOP8: INC R1
MOV C,02H ;調時
CPL C
MOV 02H,C
LCALL HDLY
CJNE R1,#40,LOP9
JMP LOOP
LOP9: JNB 05H,LOP8
CLR 05H
MOV R1,#0
LCALL HD
CLR 02H
JB 04H,TN
INC R6
CJNE R7,#2,NO2
CJNE R6,#4,LOP8
MOV R7,#0
MOV R6,#0
NO2: CJNE R6,#10,LOP8
MOV R6,#0
INC R7
JMP LOP8
TN: CLR 04H ;調鬧鈴
SETB RS0
CLR RS1
MOV R2,#0
MOV R3,#0
MOV R4,#0
MOV R5,#0
MOV R6,#0
MOV R7,#0
NS: INC R1 ;鬧鈴秒調整
MOV C,00H
CPL C
MOV 00H,C
LCALL HDLY
CJNE R1,#40,NS1
JMP NH2
NS1: JNB 05H,NS
CLR 05H
MOV R1,#0
LCALL HD
CLR 00H
JB 04H,NF
INC R2
CJNE R2,#10,NS
MOV R2,#0
INC R3
CJNE R3,#6,NS
MOV R3,#0
JMP NS
NF: CLR 04H ;鬧鈴分
NF1: INC R1
MOV C,01H
CPL C
MOV 01H,C
LCALL HDLY
CJNE R1,#40,NF2
LJMP NH2
NF2: JNB 05H,NF1
CLR 05H
MOV R1,#0
LCALL HD
CLR 01H
JB 04H,NH
INC R4
CJNE R4,#10,NF1
MOV R4,#0
INC R5
CJNE R5,#6,NF1
MOV R5,#0
JMP NF1
NH: CLR 04H ;鬧鈴時調整
NH1: INC R1
MOV C,02H
CPL C
MOV 02H,C
LCALL HDLY
CJNE R1,#40,NH3
NH2: MOV 50H,R2
MOV 51H,R3
MOV 52H,R4
MOV 53H,R5
MOV 54H,R6
MOV 55H,R7
CLR RS0
CLR RS1
LJMP LOOP
NH3: JNB 05H,NH1
CLR 05H
MOV R1,#0
LCALL HD
CLR 02H
JB 04H,NH2
INC R6
CJNE R7,#2,NOT2
CJNE R6,#4,NH1
MOV R6,#0
MOV R7,#0
JMP NH1
NOT2: CJNE R6,#10,NH1
MOV R6,#0
INC R7
JMP NH1
;子程序區
TIMES: CJNE R0,#20,LOOP16
MOV R0,#0
INC R2
CJNE R2,#10,LOOP16
MOV R2,#0
INC R3
CJNE R3,#6,LOOP16
MOV R3,#0
ADMINI: INC R4
CJNE R4,#10,LOOP16
MOV R4,#0
INC R5
CJNE R5,#6,LOOP16
MOV R5,#0
HOUR: INC R6
LCALL SOUND ;整點鈴聲
CJNE R7,#2,LOOP14
CJNE R6,#4,LOOP16
MOV R6,#0
MOV R7,#0
JMP LOOP16
LOOP14: CJNE R6,#10,LOOP16
MOV R6,#0
INC R7
LOOP16: RET
DISPLAY:MOV P2,#0FFH
MOV A,R2
MOVC A,@A+DPTR
MOV P0,A
MOV C,00H
MOV P2.0,C
MOV P2,#0FFH
MOV A,R3
MOVC A,@A+DPTR
MOV P0,A
MOV P2.1,C
MOV P2,#0FFH
MOV A,R4
MOVC A,@A+DPTR
MOV P0,A
MOV C,01H
MOV P2.2,C
MOV P2,#0FFH
MOV A,R5
MOVC A,@A+DPTR
MOV P0,A
MOV P2.3,C
MOV P2,#0FFH
MOV A,R6
MOVC A,@A+DPTR
MOV P0,A
MOV C,02H
MOV P2.4,C
MOV P2,#0FFH
MOV A,R7
MOVC A,@A+DPTR
MOV P0,A
MOV P2.5,C
MOV P2,#0FFH
RET
HDLY: MOV 40H,#2
HDL1: MOV 41H,#25
HDL2: MOV 42H,#100
HDL3: DJNZ 42H,HDL4
DJNZ 41H,HDL2
DJNZ 40H,HDL1
JMP HDOT
SOUT: SETB 05H
HDOT: RET
HDL4: MOV P3,#0FEH
MOV A,P3
CJNE A,#0FEH,SOUT
CLR 05H
LCALL DISPLAY
JMP HDL3
HD: MOV 30H,#5
HD1: MOV 31H,#50
HD2: MOV 32H,#100
HD3: LCALL DISPLAY
DJNZ 32H,HD4
DJNZ 31H,HD2
DJNZ 30H,HD1
SETB 04H ;計滿標志位
JMP HDOUT
HD4: MOV P3,#0FEH
MOV A,P3
CJNE A,#0FEH,HD3
MOV 33H,#50
HD5: MOV 34H,#100
DJNZ 34H,$
DJNZ 33H,HD5
MOV P3,#0FEH
MOV A,P3
CJNE A,#0FEH,HD3
CLR 04H
HDOUT: RET
SOUND: MOV 30H,#10
SO1: MOV 31H,#100
SO2: MOV 32H,#3
MOV C,P2.7
CPL C
MOV P2.7,C
SO3: MOV 33H,#25
DJNZ 33H,$
DJNZ 32H,SO3
DJNZ 31H,SO2
DJNZ 30H,SO1
RET
T0: PUSH PSW
PUSH ACC
CLR RS1
CLR RS0
MOV A,TL0
ADD A,#0B5H
MOV TL0,A
MOV TH0,#3CH
INC R0
LCALL TIMES
MOV A,R2
CJNE A,50H,TO
SETB 03H
MOV A,R3
CJNE A,51H,TO
MOV A,R7
CJNE A,55H,TO
MOV A,R6
CJNE A,54H,TO
MOV A,R5
CJNE A,53H,TO
MOV A,R4
CJNE A,52H,TO
MOV A,R2
ADD A,R3
ADD A,R4
ADD A,R5
ADD A,R6
ADD A,R7
JZ TO
CLR 03H
TO: POP ACC
POP PSW
RETI
TAB: DB 0C0H 0F9H 0A4H 0B0H 099H
DB 092H 082H 0F8H 080H 090H
END

3. 用匯編怎麼寫51單片機的延時程序

DEL1S:MOV R7,#10
D1: MOV R6,#200
D2: MOV R5,#250
DJNZ R5,$
DJNZ R6,D2
DJNZ R7,D1
RET

說明:1、如果不使用R5、R6、R7可以用別的單元替換,比如換成30H、31H、32H等等
2、這個程序是12M時鍾,如果時鍾不同,要修改數值。如6M時鍾,要把MOV R7,#10 修改成:MOV R7,#5

4. 51單片機定時器的匯編語言程序編程,

LED BIT P1.0 ;定義LED的引腳
ORG 0000H

LJMP MAIN
ORG 000BH
LJMP T0ISR
ORG 0030H
MAIN:
MOV TMOD,#01H ;定時器0工作模式1
MOV TH0,#HIGH(65536-50000) ;初值,50毫秒中斷一次
MOV TL0,#LOW(65536-50000)
SETB TR0 ;啟動定時器
SETB ET0 ;啟動定時器中斷
SETB EA ;開總中斷
MOV R2,#40 ;中斷計數初始值
SJMP $
T0ISR:
CLR TR0
MOV TH0,#HIGH(65536-50000)
MOV TL0,#LOW(65536-50000)
SETB TR0
DJNZ R2,T0E ;R2減到0重新賦值,否則退出
MOV R2,#40
CPL LED ;LED亮滅轉換
T0E:
RETI
END

5. 51單片機 匯編語言 電子鍾設計

1.關鍵詞規范
關鍵詞是反映論文主題概念的詞或片語,通常以與正文不同的字體字型大小編排在摘要下方。一般每篇可選3~8個,多個關鍵詞之間用分號分隔,按詞條的外延(概念范圍)層次從大到小排列。
關鍵詞一般是名詞性的詞或片語,個別情況下也有動詞性的詞或片語。
應標注與中文關鍵詞對應的英文關鍵詞。編排上中文在前,外文在後。中文關鍵詞前以「關鍵詞:」或「[關鍵詞]」作為標識;英文關鍵詞前以「Key words:」作為標識。
關鍵詞應盡量從國家標准《漢語主題詞表》中選用;未被詞表收錄的新學科、新技術中的重要術語和地區、人物、文獻等名稱,也可作為關鍵詞標注。關鍵詞應採用能覆蓋論文主要內容的通用技術詞條。
2.選擇關鍵詞的方法
關鍵詞的一般選擇方法是:由作者在完成論文寫作後,從其題名、層次標題和正文(出現頻率較高且比較關鍵的詞)中選出來。
論文正文
要點
⑴引言:引言又稱前言、序言和導言,用在論文的開頭。引言一般要概括地寫出作者意圖,說明選題的目的和意義,並指出論文寫作的范圍。引言要短小精悍、緊扣主題。
〈2)論文正文:正文是論文的主體,正文應包括論點、論據、論證過程和結論。主體部分包括以下內容:
a.提出問題-論點;
b.分析問題-論據和論證;
c.解決問題-論證方法與步驟;
d.結論。
為了做到層次分明、脈絡清晰,常常將正文部分分成幾個大的段落。這些段落即所謂邏輯段,一個邏輯段可包含幾個小邏輯段,一個小邏輯段可包含一個或幾個自然段,使正文形成若干層次。論文的層次不宜過多,一般不超過五級。

6. 如何實用8255A在51單片機下編寫時鍾程序(匯編)

51中有時鍾中斷,
你在時鍾中斷中定時。比如,1ms。

然後,你在主程序中使用循環控制就可以了。

匯編的代碼貼出來比較麻煩,就不貼了。而且,我這也沒有模擬的,所以,也無法檢驗程序的正確性。
所以,主要思想就這樣了。

7. 怎樣利用51單片機實現時鍾功能程序

#define uchar unsigned char // (先定義一下方便使用)

#define uint unsigned int

#define ulong unsigned long

#include <reg52.h> //包括一個52標准內核的頭文件

uchar code zixing[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

uchar code ziwei[]={0x10,0x20,0x40,0x80};

uchar *h,*m;

uchar hour=12,min=0,sec=0,h_ding,m_ding,count=0,ms_50,ms_10,miaobiao_sec;

sbit dp=P0^7;

sbit k1=P3^2;

sbit k2=P3^3;

sbit k3=P3^4;

sbit sound=P2^3;

sfr ZIXING=0x80; //p0口輸出字形

sfr ZIWEI=0xa0; //P2口輸出字位

typedef enum //枚舉類型:4種狀態//

{

CLOCK,

SET_RING1,

SET_RING2,

MIAOBIAO_RUN,

}STATE;

STATE status;

typedef struct //定時時間的數據結構//

{

uchar hour;

uchar min;

}DINGSHI_TIME;

DINGSHI_TIME dingshi_time[2];

#define NO_KEY -1 //定義一下方便使用

#define KEY_1 1

#define KEY_2 2

#define KEY_3 3

bit show_on_flag;

//#######定時器T0中斷服務程序########//

Timer0() interrupt 1

{

TH0=0x3c;TL0=0xb4; //50ms

ms_50++;

if(ms_50==20) {sec++;ms_50=0;}

if(sec==60) {sec=0;min++;}

if(min==60) {min=0;hour++;}

if(hour==24) {hour=0;}

}

//#######定時器T1中斷服務程序########//

Timer1() interrupt 3

{

TH1=0xd8;TL1=0xf4; //10ms

ms_10++;

if(ms_10==100)

{

miaobiao_sec++;

ms_10=0;

}

if(miaobiao_sec==60)

miaobiao_sec=0;

}

//##############數碼管顯示#####################//

show(uchar time_high,uchar time_low)

{

uchar m;

uint n,k;

k=time_high*1000/10+time_low;

for(m=0;m<4;m++)

{

ZIXING=zixing[k%10];

if(ms_50<10)

dp=0;

ZIWEI=~ziwei[m];

for(n=0;n<500;n++);

ZIXING=0xff;

for(n=0;n<100;n++);

k=k/10;

}

}

//顯示 on 定時編號//

show_on(uchar id) //id:定時編號//

{

uchar m;

uint n;

for(m=0;m<2;m++)

{

ZIXING=zixing[id%10];

dp=0;

ZIWEI=~ziwei[m];

for(n=0;n<500;n++);

ZIXING=0xff;

for(n=0;n<80;n++);

id=id/10;

}

ZIXING=0xc8; //字母n//

ZIWEI=~ziwei[2];

for(n=0;n<500;n++);

ZIXING=0xff;

for(n=0;n<200;n++);

ZIXING=0xc0; //字母0//

ZIWEI=~ziwei[3];

for(n=0;n<500;n++);

ZIXING=0xff;

for(n=0;n<200;n++);

}

/*************啟動秒錶***************/

void run_miaobiao()

{

ms_10=0;

miaobiao_sec=0;

TH1=0xd8; //標準是0xd8e4

TL1=0xf4;

// TR1=1; //啟動定時器1

}

8. 求c51單片機電子鍾程序(c語言)

#include <reg51.h>
#define uchar unsigned char //定義unsigned int為uint
#define uint unsigned int //定義unsigned uchar為uchar

sbit LCD_RS = P2^0 ;
sbit LCD_RW = P2^1 ;
sbit LCD_EN = P2^2 ;
sbit D_SDA = P2^6; //定義74HC164數據線為P2.6埠
sbit D_SCL = P2^7; //定義74HC164數據線為P2.7埠
sbit CLK = P1^3; /*實時時鍾時鍾線引腳 */
sbit IO = P1^4; /*實時時鍾數據線引腳 */
sbit RST = P1^5; /*實時時鍾復位線引腳 */

sbit ACC0 = ACC^0;
sbit ACC7 = ACC^7;

uchar time[8] = {0x50,0x30,0x19,0x30,0x12,0x06,0x06};

//========= 延時函數 ============
//延時時間以1ms為單位
//s決定延時時間長短
void delay_ms(uint s)
{
uint x;
for(s;s>0;s--)
{
x = 200;
while(x--);
}
}

//========= 送出一個位元組給74HC164(實現串並轉換) ==========
void send_out(unsigned char out)//傳送一個位元組8位
{
uchar i;
D_SCL = 0;
for (i=8;i>=1;i--)
{
D_SDA = out&0x80; //送數據到數據口
D_SCL = 1; //時鍾線置1
D_SCL = 0; //送一時鍾
out<<=1; //左移
}
}

//========= 寫命令函數 ==========
void lcd_wcmd(uchar cmd)
{
LCD_RS = 0;
LCD_RW = 0;
LCD_EN = 0;
send_out(cmd);
LCD_EN = 1;
LCD_EN = 0 ;
}

//========= 寫數據函數 ==========
void lcd_wdat(uchar dat)
{
LCD_RS = 1;
LCD_RW = 0;
LCD_EN = 0;
send_out(dat);
LCD_EN = 1;
LCD_EN = 0;
}

//========= LCD初始化函數 ==========
void lcd_init()
{
lcd_wcmd(0x38);
delay_ms(1);
lcd_wcmd(0x0c); //顯示開,關游標
delay_ms(1);
lcd_wcmd(0x06); //向右移動游標
delay_ms(1);
lcd_wcmd(0x01); //清除LCD顯示屏
delay_ms(1);
}

//========== 往DS1302寫入1Byte數據 (內部函數) =============
void w_byte(uchar dat)
{
uchar i;
for(i=8; i>0; i--)
{
IO = dat & 0x01;
CLK = 1;
CLK = 0;
dat = dat >> 1;
}
}

//======== 從DS1302讀取1Byte數據 (內部函數) ===================
uchar r_byte(void)
{
uchar i;
for(i=8; i>0; i--)
{

ACC = ACC >> 1;
ACC7 = IO;
CLK = 1;
CLK = 0;

}
return(ACC);
}

//========== 指定地址往DS1302寫入1Byte數據 (內部函數) =============
void write_byte(uchar addr, uchar dat)
{
RST = 0;
CLK = 0;
RST = 1;
w_byte(addr);
w_byte(dat);
CLK = 1;
RST = 0;
}

//========== 指定地址往DS1302讀1Byte數據 (內部函數) =============
uchar read_byte(uchar addr)
{
uchar ucData;
RST = 0;
CLK = 0;
RST = 1;
w_byte(addr);
ucData = r_byte();
CLK = 1;
RST = 0;
return(ucData);
}

//============ 設置ds1302日期和時間 =============
void write_ds1302(uchar *p)
{
uchar i;
uchar addr = 0x80;
write_byte(0x8e,0x00); // 控制命令,WP=0,寫操作
for(i =7; i>0; i--)
{
write_byte(addr,*p); // 秒 分 時 日 月 星期 年
p++;
addr +=2;
}
write_byte(0x8e,0x80); // 控制命令,WP=1,防寫
}

//============ 讀ds1302當前日期和時間 =============
void read_ds1302(uchar *p)
{
uchar i;
uchar addr = 0x81;
for (i=0; i<7; i++)
{
*p = read_byte(addr); //格式為: 秒 分 時 日 月 星期 年
addr += 2;
p++;
}
}

//============ 顯示函數 ===================
void lcd_disp()
{
uchar addr = 4;
lcd_wcmd(0x80 + addr);
lcd_wdat(((time[2]>>4)&0x0f)+0x30); //顯示小時
addr++;
lcd_wcmd(0x80 + addr);
lcd_wdat((time[2]&0x0f)+0x30);
addr++;

lcd_wcmd(0x80 + addr);
lcd_wdat(':'); //顯示":"
addr++;

lcd_wcmd(0x80 + addr);
lcd_wdat(((time[1]>>4)&0x0f)+0x30); //顯示分
addr++;
lcd_wcmd(0x80 + addr);
lcd_wdat((time[1]&0x0f)+0x30);
addr++;

lcd_wcmd(0x80 + addr);
lcd_wdat(':'); //顯示":"
addr++;

lcd_wcmd(0x80 + addr);
lcd_wdat(((time[0]>>4)&0x0f)+0x30); //顯示秒
addr++;
lcd_wcmd(0x80 + addr);
lcd_wdat((time[0]&0x0f)+0x30);

addr = 2;
lcd_wcmd(0xc0 + addr); //在第二行顯示年月日和星期
lcd_wdat('2'); //顯示2
addr++;
lcd_wcmd(0xc0 + addr);
lcd_wdat('0'); //顯示0
addr++;

lcd_wdat(((time[6]>>4)&0x0f)+0x30); //年
addr++;
lcd_wcmd(0xc0 + addr);
lcd_wdat((time[6]&0x0f)+0x30);
addr++;

lcd_wcmd(0xc0 + addr);
lcd_wdat(' ');
addr++;

lcd_wcmd(0xc0 + addr);
lcd_wdat(((time[4]>>4)&0x0f)+0x30); //顯示月
addr++;
lcd_wcmd(0xc0 + addr);
lcd_wdat((time[4]&0x0f)+0x30);
addr++;

lcd_wcmd(0xc0 + addr);
lcd_wdat(' ');
addr++;

lcd_wcmd(0xc0 + addr);
lcd_wdat(((time[3]>>4)&0x0f)+0x30); //顯示日
addr++;
lcd_wcmd(0xc0 + addr);
lcd_wdat((time[3]&0x0f)+0x30);
addr++;

lcd_wcmd(0xc0 + addr);
lcd_wdat(' ');
addr++;

lcd_wcmd(0xc0 + addr);
lcd_wdat((time[5]&0x0f)+0x30); //顯示星期
}

//=========== 主函數 ===============
void main()
{
lcd_init(); // 初始化LCD
write_ds1302(time);
while(1)
{
read_ds1302(time); //讀DS1302數據
lcd_disp(); //LCD顯示
delay_ms(500); //延時0.5秒
}
}

這是一個電子時鍾,在LCD1602上顯示,時鍾晶元是DS1302

9. 51單片機時鍾匯編程序

TIMER0:
CLR TR0
PUSH ACC
MOV TH0,#3CH
MOV TL0,#0B0H
SETB TR0
INC 30H
MOV A,30H
CJNE A,#20,JIXU
MOV 30H,#0
INC MIAO
MOV A,MIAO
CJNE A,#60,JIXU
MOV MIAO,#0
INC FEN
MOV A,FEN
CJNE A,#60,JIXU
MOV FEN,#0
INC HOUR
MOV A,HOUR
CJNE A,#24,JIXU
MOV HOUR,#0
JIXU: POP ACC
RETI

10. 51單片機編程題,用匯編語言怎麼做

在8051單片機的時鍾頻率為6MHz,那麼定時器的計數脈沖周期就是 2uS;

sbit CP=P1^0;

void Timer0_init()

{

TMOD |=0x01; //T0定時器,方式1,採用16位定時器

TH0 = (65536-500)/256; //定時器裝初值500, 即 1000uS 中斷一次

TL0 = (65536-500)%256;

EA=1; ET0=1; TR0=1;

}


void timer0() interrupt 1

{

TH0 = (65536-500)/256; //定時器裝初值500, 1mS 中斷一次

TL0 = (65536-500)%256;

CP=~CP; //改變脈沖信號的輸出狀態

}


void main()

{

Timer0_init();

CP=0;

while(1) { }

}


匯編語言,才看到,算了,你別人的回答吧

閱讀全文

與51單片機時鍾匯編程序相關的資料

熱點內容
微信小程序源碼轉成抖音 瀏覽:654
優省油app怎麼沒法下載 瀏覽:72
pdf格式轉換excel 瀏覽:625
高爾夫6壓縮機響 瀏覽:310
優盤文件夾自動恢復 瀏覽:76
有伺服器怎麼製作小程序 瀏覽:132
程序員怎麼避開外包公司 瀏覽:604
刺激戰場國際服體驗伺服器滿了怎麼辦 瀏覽:487
python的number是什麼意思 瀏覽:539
剪映app怎麼把視頻鏡像 瀏覽:464
python長連接消息提醒 瀏覽:767
山西省美術演算法 瀏覽:95
華為手機怎麼不給別人刪app 瀏覽:814
c51單片機程序實例 瀏覽:112
騰訊幻核加密貓 瀏覽:782
雅思聽力真經pdf 瀏覽:442
甘肅戴爾伺服器虛擬化設計雲主機 瀏覽:236
怎麼購買蓋世童書APP 瀏覽:248
軍校的程序員 瀏覽:447
程序員被女警察追 瀏覽:455