當前位置:編程學習大全網 - 行動軟體 - 51單片機實驗(關於定時器計數器)

51單片機實驗(關於定時器計數器)

;************* 電子定時器的設計******************;

;*MCU: AT892051 ;

;*MCU-crystal: 12M ;

;*Version: 01 ;

;*Last Updata: 2007-6-14 ;

;*Author: zhaojun ;

;*Description: ;

;定時器T0、T1溢出周期為50MS,T0為秒計數用 ;

;S2為功能鍵、S3為方式選擇鍵 ;

;P1口為字符輸出口,采用***陽顯示管 ;

;P3.2~P3.5為位選,P1.7為報警發音,P3.7為被控繼電器 ;

;************************************************;

;******************

; 偽定義 ;

;******************

SL EQU 30H ; SL存放秒的個位數

SH EQU 31H ; SH存放秒的十位數

ML EQU 32H ; ML存放分的個位數

MH EQU 33H ; MH存放分的十位數

HL EQU 34H ; HL存放時的個位數

HH EQU 35H ; HH存放時的十位數

L0 EQU 36H ; L0~L3:顯示數據存儲器

L1 EQU 37H

L2 EQU 38H

L3 EQU 39H

DSPLYP EQU 3AH ; 顯示數據指針(DISPLAY-POINT)

PLYTS EQU 3BH ; 顯示次數計數器(DISPLAY-TIMES)

LPLMOD BIT 39H ; 低兩位顯示方式(LOW-PLAY-MOD)

HPLMOD BIT 3AH ; 高兩位顯示方式(HIGH-PLAY-MOD)

BRIGHT BIT 3BH ; DISPLAY子程序參數:亮滅指示位

TCOUNT EQU 3CH ; 時間計數器(TIME-COUNT)

ADDRES EQU 3DH ; 加1子程序參數

MAX EQU 3EH ; 加1子程序參數

IFDEC BIT 20H ; BCD加法子程序參數

R_MOD EQU 3FH ; 響鈴方式參數

LED4 BIT 30H ; 發光管狀態位

BELL BIT P1.7 ; 蜂鳴器

SWITCH BIT P3.7 ; 繼電器

FKEY BIT P3.0 ; 功能鍵 (S1)

MKEY BIT P3.1 ; 修改鍵 (S2)

WORKIN BIT 38H ; 工作狀態指示位

;******************

; 中斷入口 ;

;******************

ORG 0000H

START: LJMP MAIN ; 0000H 引向主程序

LJMP ERR ; 0003H

NOP

NOP

LJMP ERR ; 引向出錯處理程序

LJMP PGT0 ; 000BH 引向中斷處理程序PGT0

NOP

NOP

LJMP ERR ; 引向出錯處理程序

LJMP ERR ; 0013H INT1

NOP

NOP

LJMP ERR

LJMP ERR ; 001BH T1

NOP

NOP

LJMP ERR

LJMP ERR ; 0023H

NOP

NOP

LJMP ERR

LJMP ERR ; 002BH

NOP

NOP

;************

; 主程序 ;

;************

MAIN: MOV IE,#00H ; 關中斷

MOV SP,#57H ; 設置堆棧指針

MOV PSW,#00H ; 選用寄存器組0

MOV TMOD,#11H ; 設定中斷工作方式為T0和T1

;

MOV A,56H

CJNE A,#0AAH,CSTART ; 判上電復位標誌,無標誌轉冷啟動

MOV A,57H

CJNE A,#55H,CSTART ; 無標誌轉冷啟動

AJMP HSTART ; 有上電復位標誌轉熱啟動

NOP

NOP

LJMP ERR ; 軟件陷阱,引向出錯處理程序

CSTART: MOV P1,#0FFH ; 冷啟動,全面初始化

MOV P3,#0FFH

MOV TCON,#00H ; 計時停止

MOV TL0,#0B0H ; 賦中斷T0初值

MOV TH0,#3CH

MOV TCOUNT,#0AH ; 賦定時器初值

MOV R5,#00H ; R5為壹空單元(備用)

MOV R4,#00H ; R4 為工作模式選擇寄存器

MOV SL,#00H ; 定時單元清零

MOV SH,#00H ; 秒

MOV ML,#00H ;

MOV MH,#00H ; 分

MOV HL,#00H ;

MOV HH,#00H ; 時

MOV PLYTS,#64H ; 賦顯示次數初值為100次

MOV DSPLYP,#L0 ; 顯示指針指向顯存單元

MOV L0,#0AH ; 送顯示數據"-----"

MOV L1,#0AH

MOV L2,#0AH

MOV L3,#04H

SETB LED4 ; LED4為數碼管之間的發光二極管

SETB LPLMOD ; 設定顯示方式為閃爍

SETB HPLMOD ;

SETB BRIGHT ; 允許顯示

CLR WORKIN ; 清工作標誌 , 待命

AJMP SETUP ; 轉開始工作

NOP

NOP

LJMP ERR ; 軟件陷阱

HSTART: MOV SCON,#00H ; 有上電標誌,熱啟動,清串行口控制寄存器

MOV IP,#00H ; 清中斷優先控制寄存器

SETB FKEY ; 重設按鍵

SETB MKEY

SETB EA ; 開中斷

AJMP BEGIN ; 轉向繼續工作

NOP

NOP

LJMP ERR ; 軟件陷阱

SETUP: SETB EA ; 開中斷

MAIN1: ACALL DISPLY ; 調用顯示

JB FKEY,JUDGE ; 按鍵掃描

ACALL KEYDLY ; 延時消抖動

JB FKEY,JUDGE ; 無鍵按下轉向判斷是否到點

CLR ET0 ; 功能鍵被按下,則

CLR TR0 ; 暫停計時

ACALL MENU ; 調用菜單設置程序

BEGIN: SETB WORKIN ; 置工作標誌位,開始工作

SETB ET0 ; 開中斷

SETB TR0 ; 開始計時

MOV A,R4 ; 移入工作模式選擇

RL A ; 指針放大

MOV DPTR,#M_TAB

JMP @A+DPTR ; 根據工作模式跳轉到相應程序段

M_TAB: AJMP WORK1

AJMP WORK2

AJMP WORK3

AJMP WORK4

NOP

NOP

LJMP ERR ; 軟件陷阱

WORK1: ;

WORK2: CLR SWITCH ; 工作方式1和2:開繼電器

AJMP MAIN2

NOP

NOP

LJMP ERR ; 軟件陷阱

WORK3: ;

WORK4: SETB SWITCH ; 工作方式3和4:不開繼電器

MAIN2: CLR BELL ; 蜂鳴器短鳴壹聲,以示開始工作

ACALL DL05S

SETB BELL

JUDGE: JNB WORKIN,MAIN1 ; 判斷是否在定時之中

MOV A,SL ; 判斷秒是否為零

JNZ MAIN1

MOV A,SH ; 判斷秒是否為零

JNZ MAIN1

MOV A,ML ; 判斷分是否為零

JNZ MAIN1

MOV A,MH ; 判斷分是否為零

JNZ MAIN1

MOV A,HL ; 判斷時是否為零

JNZ MAIN1

MOV A,HH ; 判斷時是否為零

JNZ MAIN1 ; 若時分秒全為零則

CLR ET0 ; 停止計時

CLR TR0 ;

ACALL ACTION ; 調用到點工作子程序

AJMP MAIN ; 返回

NOP

NOP

LJMP ERR ; 軟件陷阱

;

;******************

; 倒計時程序 ;

;******************

PGT0: CLR EA ; 關中斷

PUSH ACC ; 保護現場

PUSH PSW

PUSH DPL

PUSH DPH

MOV PSW,#08H ; 選用寄存器組1

CLR TR0 ; 暫停計時

MOV A,#0B7H ; 中斷同步修正

ADD A,TL0

MOV TL0,A

MOV A,#3CH

ADD A,TH0

MOV TH0,A

SETB TR0 ; 恢復計時

DEC TCOUNT ; 定時器T0每50 000毫秒溢出壹次,則

MOV A,TCOUNT ; 溢出10次為0.5秒

JNZ OUTT0 ; 判斷是否到半秒

MOV TCOUNT,#0AH ;

CPL LED4 ; 若到半秒LED取反

JNB LED4,OUTT0 ; LED每閃爍壹次是壹秒

MOV R0,#SH ; 移入秒位的地址

SETB IFDEC ; BCD子程序參數,使其做減法

ACALL ADDBCD ; 調用BCD子程序, 秒減1

CJNE R3,#99H,OUTT0 ; 判斷秒要否借位

MOV SH,#05H ; 要借位則

MOV SL,#09H ; 送數據59(否則顯示99)

MOV R0,#MH ; 移入分位的地址

ACALL ADDBCD ; 分減1

CJNE R3,#99H,OUTT0 ; 判斷分要否借位

MOV MH,#05H

MOV ML,#09H

MOV R0,#HH

ACALL ADDBCD

OUTT0: POP DPH ; 恢復現場

POP DPL

POP PSW

POP ACC

SETB EA

RETI ; 中斷返回

NOP

NOP

LJMP ERR ; 軟件陷阱

;

;**************************

; BCD子程序(加1或減1 ) ;

;**************************

ADDBCD: MOV A,@R0 ; 移入被操作數的高位

DEC R0 ; 指針減壹

SWAP A

ORL A,@R0 ; 移入被操作數的低位

MOV B,#01H ; B寄存器送立即數#01H

MOV C,IFDEC ; 若減法標誌位為1,則

MOV B.3,C ;

MOV B.4,C ; B寄存器的值被改為#99H

MOV B.7,C ;

ADD A,B ; 對壹個壓縮的BCD碼加#99H等於對其減壹

DA A ; BCD碼調整

MOV R3,A ; 暫存結果

ANL A,#0FH ; 取低位碼

MOV @R0,A ; 存數

MOV A,R3 ; 取回結果

INC R0 ; 指針加壹

SWAP A ; 交換

ANL A,#0FH ; 取結果數的高位

MOV @R0,A ; 存數

RET

NOP

NOP

LJMP ERR ; 軟件陷阱

;**************

; 加1程序 ;

;**************

ADDONE: MOV R0,ADDRES ; 移入被加數單元的地址

CLR IFDEC ; 設定BCD子程序做加法

ACALL ADDBCD ; 調用BCD子程序

CLR C ; 判斷被加數是否大於

MOV A,R3 ; 最大值"MAX"

CJNE A,MAX,JGOVER

JGOVER: JC ENDADO

CLR A ; 若大於"MAX",則清零

MOV @R0,A

DEC R0

MOV @R0,A

ENDADO: RET

NOP

NOP

LJMP ERR ; 軟件陷阱

;******************

; 調時快進程序 ;

;******************

QUICK: CLR LPLMOD ; 設定顯示方式不閃爍

CLR HPLMOD

ACALL ADDONE ; 調用加1子程序

MOV L0,R4 ; 將工作模式選擇數移入顯存

INC L0 ; 加1轉化成顯示值

ACALL KEYDLY ; 延時

ACALL DL100

JNB MKEY,QUICK ; 判斷鍵是否松開

SETB LPLMOD ; 若松開則恢復閃爍顯示方式

CJNE R6,#02H,ENDQUK

SETB HPLMOD

CLR LPLMOD

ENDQUK: RET

NOP

NOP

LJMP ERR ; 軟件陷阱

;******************

; 功能菜單程序 ;

;******************

MENU: MOV R6,#00H ; 初始化; R6 計功能鍵按鍵次數

MOV ADDRES,#05H ; 將 R5 的地址送入,以便於改變 R4 的值

MOV MAX, #04H ; 定義工作模式選擇寄存器R4 的最大值

MOV DSPLYP,#L0 ; 定義顯示指針指向顯存

SETB LPLMOD ; 設定低兩位數閃爍

CLR HPLMOD

MOV L0,R4 ; 送顯示數據"F-0X"

INC L0

MOV L1,#00H

MOV L2,#0BH

MOV L3,#00H

SETB LED4

WAITFK: ACALL DISPLY ; 等待F鍵釋放

JNB FKEY,WAITFK

MENU1: ACALL DISPLY

JB MKEY,JGFKEY ; M鍵掃描

ACALL KEYDLY ; 延時消抖動

JB MKEY,JGFKEY ; 未按下則轉F鍵掃描

CJNE R6,#00H,NEXT1 ;

MOV SL,#00H ; 若中途改變定時方式,則清除原計時數據

MOV SH,#00H

MOV ML,#00H

MOV MH,#00H

MOV HL,#00H

MOV HH,#00H

NEXT1: MOV R2,#00H ; R2用於判斷按鍵時間是否超過0.5秒

NEXT2: ACALL ADDONE ; 調用加1程序

MOV L0,R4 ; 移入工作方式選擇數

INC L0

;

WAITMK: ACALL DISPLY ; 等待M鍵釋放

INC R2 ; R2自增壹

CLR C

CJNE R2,#0C8H,JGQUIC ; 若R2大於等於200則調用快進子程序

JGQUIC: JC WATMK1

ACALL QUICK

WATMK1: JNB MKEY,WAITMK ; R2小於200則等待M鍵釋放

JGFKEY: JB FKEY,MENU1 ; 功能(F)鍵掃描

ACALL KEYDLY ; 延時消抖動

JB FKEY,MENU1 ; 鍵未按下則轉修改(M)鍵掃描

INC R6 ; F鍵按鍵次數加1

MOV A,R6 ; 移入按鍵次數

RL A ; 指針放大

MOV DPTR,#FUNTAB

JMP @A+DPTR ; 根據按鍵次數跳轉到相應的程序段

FUNTAB: AJMP WAITFK

AJMP SETLOW

AJMP SETHI

AJMP ENDMEN

NOP

NOP

AJMP ENDMEN

;STWKMD: ; 工作模式設定,不需另外改變菜單

SETLOW: MOV MAX,#60H ; 設置低位(秒位或分位)

MOV A,R4 ; 移入工作模式選擇數

RL A ; 指針放大

MOV DPTR,#FTAB1

JMP @A+DPTR ; 根據工作模式選擇數跳轉到相應的程序段

FTAB1: AJMP SETSS

AJMP SETM60

AJMP SETSS

AJMP SETM60

NOP

NOP

AJMP WAITFK

SETSS: MOV DSPLYP,#SL ; 設定顯示區域為MM:SS

MOV ADDRES,#SH

AJMP WAITFK

SETM60: MOV DSPLYP,#ML ; 設定顯示區域為HH:MM

MOV ADDRES,#MH

AJMP WAITFK

SETHI: CLR LPLMOD ; 設置高位(分位或時位)

SETB HPLMOD ; 高兩位數碼管閃爍

MOV MAX,#31H ; 最大數為30

MOV A,R4 ; 移入工作模式選擇數

RL A ; 指針放大

MOV DPTR,#FTAB2 ; 移入表首地址

JMP @A+DPTR ; 根據工作模式選擇數跳轉到相應的程序段

FTAB2: AJMP SETM30

AJMP SETHH

AJMP SETM30

AJMP SETHH

NOP

NOP

AJMP WAITFK ; 返回等待鍵釋放

SETM30: MOV ADDRES,#MH ; 移入分位的地址

AJMP WAITFK ; 轉向等待鍵釋放

SETHH: MOV ADDRES,#HH ; 移入時位的地址

AJMP WAITFK ; 轉向等待鍵釋放

ENDMEN: CLR HPLMOD ; 恢復不閃爍顯示方式

RET

NOP

NOP

LJMP ERR ; 軟件陷阱

;****************

; 到點工作程序 ;

;****************

ACTION: MOV L0,R4 ; 移入工作模式選擇數

INC L0 ; 送顯示數"F-0X"

MOV L1,#00H

MOV L2,#0BH

MOV L3,#00H

SETB LED4

MOV DSPLYP,#L0 ; 指針指向顯存

SETB LPLMOD ; 設定顯示方式不閃爍

SETB HPLMOD

MOV A,R4 ; 移入工作模式選擇數

RL A ;

MOV DPTR,#A_TAB

JMP @A+DPTR ; 根據工作模式選擇數跳轉

A_TAB: AJMP ACTF1 ; 工作模式壹

AJMP ACTF1 ; 工作模式二

AJMP ACTF3 ; 工作模式三

AJMP ACTF3 ; 工作模式四

NOP

NOP

LJMP ERR ; 軟件陷阱

ACTF1: SETB SWITCH ; 工作模式壹(或二): 關繼電器

MOV R_MOD,#82H ; 響鈴模式參數#82H

MOV R2,#96H ; 響鈴次數參數#96H

ACTF11: ACALL RING ; 調用響鈴子程序

JNB MKEY,ENDACT ; 等待鍵按下

JNB FKEY,ENDACT ; 有鍵按下則結束響鈴

DJNZ R2, ACTF11 ; 次數未滿繼續響鈴

MOV R_MOD,#0FFH ; 參數#0FF使響鈴無效

AJMP ACTF11 ; 無鍵按下返回

NOP

NOP

LJMP ERR ; 軟件陷阱

ACTF3: CLR SWITCH ; 工作模式三(或四): 開繼電器

CLR BELL ; 蜂鳴器短鳴壹聲

ACALL DL1S

SETB BELL

MOV R_MOD,#0FFH ; 響鈴模式參數#0FFH

MOV R2,#96H ; 響鈴時間參數#96H

ACTF31: ACALL RING ; 調用響鈴子程序

JNB MKEY,ENDACT ; 等待鍵按下

JNB FKEY,ENDACT ; 有鍵按下則結束

DJNZ R2,ACTF31 ; 次數未滿繼續

MOV R2,#96H ; 重新賦值

CLR BELL ; 短鳴壹聲(說明: 響鈴模式參數#0FFH使

ACALL DL100 ; 響鈴程序無效,僅起延時作用,

SETB BELL ; 每延時壹段時間短鳴壹聲,以

AJMP ACTF31 ; 提醒使用者繼電器仍在工作)

NOP

NOP

LJMP ERR ; 軟件陷阱

ENDACT: SETB SWITCH ; 關繼電器

AWAITF: ACALL DISPLY ; 調用顯示

JNB FKEY,AWAITF ; 等待鍵釋放

AWAITM: ACALL DISPLY ; 調用顯示

JNB MKEY,AWAITM ; 等待鍵釋放

RET

NOP

NOP

LJMP ERR ; 軟件陷阱

;

;**************

; 響鈴程序 ;

;**************

RING: MOV R5,#18H ; R5為循環控制變量

RING1: JNB MKEY,R_EXIT ; 鍵掃描

JNB FKEY,R_EXIT ; 有鍵按下則退出

MOV A,R_MOD ; 移入響鈴模式參數

MOV C,ACC.7 ; 根據響鈴模式參數改變響鈴

MOV BELL,C

RL A

MOV R_MOD,A

ACALL DL100 ; 延時

DJNZ R5,RING1 ; 循環次數控制

R_EXIT: SETB BELL ; 關閉響鈴

RET

NOP

NOP

LJMP ERR ; 軟件陷阱

;**************

; 顯示程序 ;

;**************

DISPLY: PUSH ACC ; 數據壓棧保護

PUSH PSW

MOV PSW,#10H ; 選用寄存器組2

MOV R0,DSPLYP ; 移入顯示指針

MOV R2,#0FDH ; R2寄存的是數碼管選通數

MOV A,PLYTS ; 移入顯示循環控制量

JNZ PLAY ; 不為0則轉PLAY

MOV PLYTS,#64H ; 否則從新賦值

CPL BRIGHT ; 亮滅指示位取反

PLAY: DEC PLYTS ; 顯示循環控制量減1

JNB LPLMOD,PLAYL ; 低兩位數碼管不閃則"PLAYL"

JB BRIGHT,PLAYL ; 亮滅指示為1也"PLAYL"

ACALL NOPLAY ; 否則滅燈延時

AJMP PLAY1 ; 轉顯示高位數碼管

NOP

NOP

LJMP ERR ; 軟件陷阱

;用來顯示低位

PLAYL: ORL P1,#7FH ; 清原顯示數據

ORL P3,#3CH ; 清原選通數據

MOV A,R2 ; 移入數碼管位選數

RL A ; 換壹位

ANL P3,A ; 選通低位的個位數碼管

MOV R2,A ; 暫存位選數

MOV A,@R0 ; 移入顯示數值

MOV DPTR,#TABLE1 ; 移入表首地址

MOVC A,@A+DPTR ; 查表

ANL P1,A ; 送顯示數據

ACALL DL1MS ; 延時

INC R0 ; 指向低位的十位數

JB P3.3,PLAYL ; 顯示低位的十位數

PLAY1: JNB HPLMOD,PLAYH ; 高兩位數碼管不閃則"PLAYH"

JB BRIGHT,PLAYH ; 亮滅指示為1也"PLAYH"

ACALL NOPLAY ; 否則滅燈延時

AJMP OUTPLY ; 轉結束

NOP

NOP

LJMP ERR ; 軟件陷阱

;用來顯示高位

PLAYH: ORL P1,#7FH ; 清原顯示數據

ORL P3,#3CH ; 清原選通數據

ANL P3,#0EFH ; 選通高位的個位數數碼管

MOV A,@R0 ; 移入顯示數值

MOV DPTR,#TABLE1 ; 移入表首地址

MOVC A,@A+DPTR ; 查表

ANL P1,A ; 送顯示數據

ACALL DL1MS ; 延時

INC R0 ; 指向高位的十位數

; ; 顯示高位的十位數

ORL P1,#7FH ; 清原顯示數據

ORL P3,#3CH ; 清原選通數據

ANL P3,#0DFH ; 選通高位的十位數

MOV A,@R0 ; 移入顯示數值

MOV C,LED4 ; 指針放大+小燈狀態

RLC A ;

MOV DPTR,#TABLE2 ; 移入表首地址

MOVC A,@A+DPTR ; 查表

ANL P1,A ; 送顯示數據

ACALL DL1MS ; 延時

OUTPLY: POP PSW ; 恢復數據

POP ACC

RET

NOP

NOP

LJMP ERR ; 軟件陷阱

TABLE1: DB 0C0H,0F9H,0A4H,0B0H, 99H, 92H, 82H,0F8H, 80H, 90H,0BFH, 8EH,0FFH

; "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "-", "F", " "

TABLE2: DB 0FFH, 0DFH, 0F9H, 0D9H, 0A4H, 84H, 0B0H, 90H, 0BFH, 09FH

; " ", " :", "1 ", "1:", "2 ", "2:", "3 ", "3:", "- ", "-:"

;**********************

; 無顯示(滅燈)程序 ;

;**********************

NOPLAY: ORL P1,#7FH ; 清顯示數據

ORL P3,#3CH ; 清選通數據

INC R0 ; 指針自增2

INC R0

ACALL DL1MS ; 延時

RET

NOP

NOP

LJMP ERR ; 軟件陷阱

;

;******************

; 延時程序 ;

;******************

DL1MS: MOV R3,#0F9H ; 延時 1250US 只為DISPLY所調用

DL1MS1: NOP

NOP

NOP

DJNZ R3,DL1MS1

RET

NOP

NOP

LJMP ERR ; 軟件陷阱

;

KEYDLY: CLR BELL ; 按鍵消抖動專用延時程序,

ACALL DISPLY ; 在消除抖動的同時發出按鍵提示音

SETB BELL

RET

NOP

NOP

LJMP ERR ; 軟件陷阱

DL50MS: MOV R7,#0AH ; 50毫秒延時程序

DL50M1: ACALL DISPLY ; 每調用壹次顯示程序5MS

DJNZ R7,DL50M1 ; 調用10次

RET

NOP

NOP

LJMP ERR ; 軟件陷阱

DL100: ACALL DL50MS ; 延時100毫秒

ACALL DL50MS

RET

NOP

NOP

LJMP ERR ; 軟件陷阱

DL05S: ACALL DL100 ; 延時0.5秒

ACALL DL100

ACALL DL100

ACALL DL100

ACALL DL100

RET

NOP

NOP

LJMP ERR ; 軟件陷阱

;

DL1S: ACALL DL05S ; 延時1秒

ACALL DL05S

RET

NOP

NOP

LJMP ERR ; 軟件陷阱

;

;****************************

; ERR(出錯處理) 程序 ;

;****************************

ERR: CLR EA ; 關中斷

MOV DPTR,#ERR1 ; 準備返回地址

PUSH DPL ; 壓棧

PUSH DPH ;

RETI ; 中斷返回

ERR1: MOV 56H,#0AAH ; 建立上電標誌(出錯標誌)

MOV 57H,#55H

MOV A,#00H ; 準備返回地址

PUSH ACC ; 壓棧

PUSH ACC

RETI ; 中斷返回

NOP

NOP

LJMP ERR ; 軟件陷阱

ORG 07FAH

NOP

NOP

NOP

LJMP ERR ; 軟件陷阱

END ; 程序結束

  • 上一篇:l聯想y430怎樣搜索無線網絡
  • 下一篇:物博會的組織機構
  • copyright 2024編程學習大全網