導航:首頁 > 操作系統 > 單片機課程設計定時鬧鍾

單片機課程設計定時鬧鍾

發布時間:2022-08-16 04:03:36

『壹』 用51單片機定時器編寫一個定時鬧鍾

問題不是很清晰!
首先,定時器溢出時間較短,需要在定時器中斷外另設計數單元;

其次,什麼叫「檢驗對准時間」?我的理解是:使用一段程序來檢驗當前時間與設定時間(鬧鍾的定時值)的差值,差值為零時報時。基於該理解,有兩種方式(根據你自己的情況自選):
1)先設計出一個時鍾,然後將時鍾值與設定值比對,具體語句可以使用「異或」(兩時間相同時,異或值為零),或CJNE指令;本人傾向於後者(如:萬一出現干擾在兩值相同時沒有比較,前者就失效了,而後者還能繼續比較)。
2) 預置一個變數,每個固定時間間隔(使用定時中斷)減一,到零時報時;但要注意,直接在定時中斷程序中減一時一定要在中斷中判斷到零否,否可能則會出現不報時的問題。

『貳』 單片機控制定時鬧鍾

單片機輸出不同頻率的信號,驅動蜂鳴器發出不同音。你設置的初值TH1=0xd8;
TL1=0xef; 要改變的,7個音節的初值都是不同的。由於蜂鳴器電路太簡單,做成後音質較差。

『叄』 菜鳥要提問關於單片機定時鬧鍾的課程設計

程序參考

;---------------------------------------------------------------------

;文件名稱:nz.ASM

;程序功能:定時鬧鍾

;--------------------------------------------------------------------

;----------------------------程序初始化-----------------------

;定義存放計時單元地址

;....................

ALBEQU20H.0;鬧鈴設置標志

;....................

BUFEQU30H;30~33H連續4位元組存放顯示器數據

HOUREQU34H;存放小時變數

MINEQU35H;存放分鍾變數

SECEQU36H;存放秒鍾變數

DEDAEQU37H;存放5ms計數值

;....................

HHEQU38H;鬧鈴設置小時變數

MMEQU39H;鬧鈴設置分鍾變數

;....................

;按鍵輸入引腳定義

K1EQUP2.4;按鍵K1引腳定義

K2EQUP2.5;按鍵K2引腳定義

K3EQUP2.6;按鍵K3引腳定義

K4EQUP2.7;按鍵K4引腳定義

;蜂鳴器和指示燈引腳定義

SPKEQUP3.4;蜂鳴器控制信號引腳

WLEDEQUP1.0;工作指示燈引腳定義

;程序開始執行地址

ORG0H;程序代碼由地址0開始

AJMPMAIN

ORG0BH;定時器T0中斷地址設置

AJMPTO_SRV

;-------------------------------主程序-------------------------------

MAIN:;主程序標號

;...................

CLRALB;清除鬧鈴標志

;...................

ACALLBZ;蜂鳴器連續兩次鳴響一聲

ACALLBZ

ACALLLED_SD;LED閃動,表示程序開始執行

ACALLINIT;初始變化量

ACALLINIT_TIMER;設置定時器

;載入顯示器初值數據

MOVA,#0C0H

MOVP0,A

;無窮循環

LOOP:;無窮循環

ACALLCONV;轉換時時分分數據

;....................

ACALLTIME_PRO;檢查鬧鈴時間

;....................

ACALLDISP;掃描顯示

JBK1,M1;未按下K1鍵則繼續掃描

ACALLLED_SD;LED閃動

ACALLSET_TIME;設置目前時間

AJMPLOOP;跳轉到LOOP處執行

;設置鬧鈴時間

M1:JBK2,M2;未按下K2鍵則繼續掃描

;.....................

ACALLLED_SD

ACALLSET_ATIME;設置鬧鈴時間

;.....................

AJMPLOOP;跳轉到LOOP處執行

M2:JBK3,M3;未按下K3鍵則繼續掃描

AJMPLOOP;跳轉到LOOP處執行

M3:JBK4,M4;未按下K4鍵則繼續掃描

;...................

CPLALB

JNBALB,M31

;鬧鈴啟動連續3次發出響聲

ACALLBZ

ACALLBZ

ACALLBZ

;...................

AJMPLOOP;跳轉到LOOP處執行

;....................

M31:

ACALLBZ;鬧鈴停止,發出一聲響

AJMPLOOP;跳轉到LOOP處執行

;...................

M4:

AJMPLOOP;跳轉到LOOP處執行

;-------------------------定時中斷模塊-------------------

;定時器T0模式0計時

INIT_TIMER:;初始化定時器

MOVTMOD,#00000000B;設置定時器T0工作模式0

MOVIE,#10000010B;啟用定時器T0中斷產生

MOVTL0,#(8192-4900)MOD32;載入初始值

MOVTH0,#(8192-4900)/32

SETBTR0;啟動定時器T0開始計時

RET

;--------------------------

;中斷服務程序

TO_SRV:;定時器T0計時中斷程序每隔5ms中斷一次

PUSHACC;將A值壓入堆棧

MOVTL0,#(8192-4900)MOD32;重載入初始值

MOVTH0,#(8192-4900)/32

INCDEDA;加1

;秒輸出

MOVA,DEDA

CJNEA,#200,TT1;是否1s到了

MOVDEDA,#0;計數值清除為0

CPLWLED;LED燈亮滅變換

INCSEC;秒計數加1

MOVA,SEC

CJNEA,#60,TT1;是否1min到了

;分輸出

INCMIN;分計數加1

MOVSEC,#0;秒計數清除為0

MOVA,MIN

CJNEA,#60,TT1;是否1h到了

;時輸出

INCHOUR;小時計數加1

MOVMIN,#0;分計數清除為0

MOVA,HOUR

CJNEA,#24,TT1;是否24h到了

MOVSEC,#0;秒鍾變數清除為0

MOVMIN,#0;分鍾變數清除為0

MOVHOUR,#0;小時變數清除為0

TT1:

POPACC;將A值由堆棧取出

RETI

;----------------------------------------轉換十進制模塊---------------------------------

CONV:;轉換十進制子程序

;轉換小時數據

MOVDPTR,#TABLE;存表

MOVA,HOUR

MOVB,#10

DIVAB

MOVCA,@A+DPTR;查表轉換

MOVBUF,A

MOVA,B

MOVCA,@A+DPTR

MOVBUF+1,A

;轉換分鍾數據

MOVA,MIN

MOVB,#10

DIVAB

MOVCA,@A+DPTR;查表轉換

MOVBUF+2,A

MOVA,B

MOVCA,@A+DPTR;查表轉換

MOVBUF+3,A

RET

;字型數據編碼表

TABLE:

DB0C0H,0F9H,0A4H,0B0H

DB99H,92H,82H,0F8H

DB80H,90H,88H,83H

DB0C6H,0A1H,86H,8EH

;--------------------------------------掃描顯示模塊------------------------------------

DISP:;掃描顯示子程序

MOVR0,#BUF;指向顯示器顯示緩沖區起始地址

MOVR2,#4;執行4次循環

MOVACC,#11110111b;載入掃描信號初值11110111B

S1:

PUSHACC

MOVA,@R0;讀取出顯示器數據

MOVP0,A;由P0送出一位顯示器數據

POPACC

MOVP2,ACC;由P2送出掃描輸出信號

MOVR5,#2;延遲一段時間

ACALLDELAY1MS_R5

;改變掃描碼EX:XXXX1011

RRA;累加器A向右移動一位

INCR0;顯示器顯示緩沖區地址加1

DJNZR2,S1;判斷是否繼續執行循環

RET

;--------------------------------------調整時間模塊------------------------------------

SET_TIME:;設置目前時間子程序

CLRTR0;定時器工作暫停

MOVSEC,#0;秒鍾變數清除為0

L0:

ACALLDISP;掃描顯示

JBK2,L1;未按下K2鍵則繼續掃描

JNBK2,$;有按下則等待放開

;K2小時調整

INCHOUR;小時計數加1

MOVA,HOUR

CJNEA,#24,L11;是否24H到了

MOVHOUR,#0;小時變數清除為0

L11:

ACALLCONV;轉換顯示數據

ACALLDISP;掃描顯示

AJMPL0;繼續程序執行

L1:JBK3,L2;未按下K3鍵則繼續掃描

JNBK3,$;有按下則等待放開

;K3分鍾調整.

INCMIN;分鍾計數加1

MOVA,MIN

CJNEA,#60,L21;是否60min到了

MOVMIN,#0;分鍾變數清除為0

L21:

ACALLCONV;轉換顯示數據

ACALLDISP;掃描顯示

AJMPL0;跳轉到L0處執行

L2:JBK4,L0;未按下K4鍵則繼續掃描

JNBK4,$;有按下則等待放開

ACALLBZ;蜂鳴器鳴響一聲

;K4設置完成

ACALLLED_SD;LED閃動

SETBTR0;啟動定時器

RET

;-------------------------------------計時單元清零模塊-------------------------------

INIT:;計時單元清零子程序

MOVDEDA,#0;5ms計數值清除為0

MOVSEC,#0;秒鍾變數清除為0

MOVMIN,#0;分鍾變數清除為0

MOVHOUR,#0;小時變數清除為0

RET

;--------------------------------------蜂鳴器鳴響模塊--------------------------------------

BZ:;蜂鳴器鳴響一聲子程序

MOVR6,#250

B1:ACALLDEX

CPLSPK

DJNZR6,B1

MOVR5,#50

ACALLDELAY1MS_R5

RET

;-------------------------------------LED閃動模塊-------------------------------------

LED_SD:;工作指示燈閃爍子程序

MOVR4,#6

LE1:CPLWLED;位反向

MOVR5,#25

ACALLDELAY1MS_R5

DJNZR4,LE1;延遲50ms

RET

;------------------------------------------延時模塊--------------------------------------

DELAY1MS_R5:;總延遲時間2ms×R5

MOVR6,#10

D1:MOVR7,#100

DJNZR7,$

DJNZR6,D1

DJNZR5,DELAY1MS_R5

RET

;------------------------------------------短暫延時模塊---------------------------------

DEX:;短暫延時子程序

MOVR7,#180

DE1:NOP

DJNZR7,DE1

RET

;*********************增加定時鬧鈴程序部分********************

;-----------------------------------------設置鬧鈴時間模塊--------------------------------

SET_ATIME:;設置鬧鈴時間子程序

MOVHH,#0

MOVMM,#0

ACALLCONVA;載入鬧鈴時間數據

N0:

ACALLDISP

;-----------

JBK2,N1;未按下K2鍵則繼續掃描

JNBK2,$;有按下則等待放開

;K2調整小時

INCHH;小時數加1

MOVA,HH

CJNEA,#24,N11;是否24h到了

MOVHH,#0;小時清為0

N11:

ACALLCONVA;載入鬧鈴時間數據

ACALLDISP;掃描顯示

AJMPN0;跳轉到N0處執行

;------------

N1:JBK3,N2;未按下K3鍵則繼續掃描

JNBK3,$;有按下則等待放開

;K3調整分鍾

INCMM;調整分鍾數

MOVA,MM;分鍾數加1

CJNEA,#60,N21;是否60min到了

MOVMM,#0;分鍾數清為0

N21:

ACALLCONVA;載入鬧鈴時間數據

ACALLDISP

『肆』 製作51單片機小鬧鍾

不用ds1302
#include
<reg52.h>
sbit
led=P1^0;
sbit
key=P1^1;
int
s=0;
int
n=0;
int
b=0;
int
a=1;
void
delay10ms(void)
{
unsigned
char
a,b,c;
for(c=1;c>0;c--)
for(b=38;b>0;b--)
for(a=130;a>0;a--);
}
void
timer(void)
interrupt
1
using
1
{
int
i;
if(i==20)
{
s++;
i=0;
}
if(s==60)
{
n++;
s=0;
}
if(n==a)
{
led=0;
s=0;
n=0;
b=0;
}
i++;
TH0=(65536-52800)/256;
TL0=(65536-52800)%256;
}
void
init(void)
{
EA=1;
TMOD=0x01;
ET0=1;
TH0=(65536-52800)/256;
TL0=(65536-52800)%256;
TR0=1;
}
void
main()
{
init();
while(1)
{
if(n==a)
{
led=0;
}
if(key==0)
{
delay10ms();
if(key==0)a++;
}
}
}
//用keil4通過編譯了默認定時1小時按一下key就加一最大定時24小時

『伍』 求單片機課程設計實驗 用匯編語言,基於51單片機的定時鬧鍾

MODE_RG EQU40H ;模式選擇

MODE2 EQU 60H ;MODE值

MODE3 EQU61H

MODE4 EQU62H

MODE5 EQU63H

MODE6 EQU64H

MODE1 EQU65H

HOUR EQU41H ;小時緩沖區

MIN EQU42H ;分鍾緩沖區

SEC EQU 43H ;秒緩沖區

TEMP EQU4AH

;*********鬧鍾緩沖區********************

H_ALARM EQU 6AH ;鬧鍾緩沖區

M_ALARM EQU6BH

S_ALARM EQU6CH

F_ALARM EQU6DH

;***********秒錶緩沖區******************

M_SEC EQU76H

S_SEC EQU77H

;*********LED送顯示臨時變數*************

LED0 EQU51H

LED1 EQU52H

LED2EQU53H

LED3 EQU54H

MODE_KEYEQUP3.4

UP_KEY EQUP3.3

DOWN_KEY EQUP3.5

BUF EQU49H

ORG0000H

LJMPMAIN

ORG000BH

LJMPINT_0

ORG001BH

LJMPINT_1

ORG0080H

MAIN: MOVSP,#2FH ;堆棧初始化

MOVMODE_RG,#0 ;MODE_RG寄存器值初始化

MOVLED0,#0FEH ;初始化LED

MOVLED1,#0FDH

MOVLED2,#0FBH

MOVLED3,#0F7H

MOVMODE1,#1

MOVMODE2,#2

MOVMODE3,#3

MOVMODE4,#4

MOVMODE5,#5

MOVMODE6,#6

MOVF_ALARM,#0 ;錯誤2:一開始用CLRF_ALARM,這導致在後面的時候JZF_ALARM運行錯誤,

MOVBUF,#0 ;在於JZ指令是對累加器A全為0或者全為1進行判斷,CLR只能對一位操作

MOVTMOD,#11H ;定時器初始化:定時器0,方式1,定時器1,方式1

MOVIP,#00001000B ;定時器1優先順序高

MOVTH0,#3CH ;定時50MS

MOVTL0,#0B1H

MOVTH1,#0D8H ;定時10MS

MOVTL1,#0F0H

SETBEA

SETBET0

SETBET1

SETBTR0;啟動定時器

MOVHOUR,#0 ;fortest

MOVMIN,#0

MOVSEC,#0 ;定時器計數器,50MS中斷一次,200次則剛好1S

MOVM_SEC,#0

MOVS_SEC,#0

MOVH_ALARM,#0

MOVM_ALARM,#0

MAIN1: LCALLDISPLAY12

LCALLDISPLAY34

;CLRP1.4 TEST

JNBMODE_KEY,KEY_SCAN

MOVA,MODE_RG

CJNEA,MODE6,Y1 ;MODE6秒錶

JNBDOWN_KEY,DEALDOWN ;判斷秒錶開關

JNBUP_KEY,DEALUP

Y1: MOVA,F_ALARM ;判斷鬧鍾

JNZALARM

LJMPMAIN1

;-----------------------------------秒錶開關程序---------------------------

DEALDOWN: LCALLDELY10MS

JBDOWN_KEY,MAIN1

H1: JNBDOWN_KEY,H1

CPLTR1

LJMPMAIN1

DEALUP: LCALLDELY10MS

JBUP_KEY,MAIN1

H2: JNBUP_KEY,H2

MOVM_SEC,#0

MOVS_SEC,#0

CLRTR1

LJMPMAIN1

;-----------------------------------鬧鍾掃描程序---------------------------

ALARM: MOVA,H_ALARM

CPLP1.2

CJNEA,HOUR,EXIT3

MOVA,M_ALARM

CJNEA,MIN,EXIT3

LJMPSTARTALARM

EXIT3: SETBP3.6

LJMPMAIN1

STARTALARM:CPLP3.6

JNBDOWN_KEY,OFFALARM

LJMPS1

OFFALARM: LCALLDELY10MS

JBDOWN_KEY,MAIN1

S2: JNBDOWN_KEY,S2

MOVF_ALARM,#0

SETBP3.6

LJMPMAIN1

S1: LCALLDELAY

LJMPMAIN1

;-----------------------------------鍵盤掃描程序---------------------------

KEY_SCAN: LCALLDELY10MS

JBMODE_KEY,MAIN1

INCMODE_RG

;SETBP1.4 測試

K1: JNBMODE_KEY,K1 ;按鍵直到用戶松開按鍵

K2: MOVA,MODE_RG

CJNEA,#0,DEALMODE;不是在正常顯示模式下則跳轉到模式處理程序

LJMPMAIN1 ;返回主程序

;*******************模式處理程序部分

DEALMODE: MOVTEMP,#0 ;凡轉入MODE處理,則首先清除TEMP

MOVA,MODE_RG ;有MODE_RG值不為5、0

CJNEA,MODE2,M0 ;判斷MODE_RG值,不為1跳轉

LJMPH_GLINT ;模式1,小時位閃爍

M0: CJNEA,MODE3,M1 ;不是模式2,跳轉

LJMPM_GLINT ;模式2,分鍾位閃爍

M1: CJNEA,MODE4,M2 ;不是模式3,跳轉

LJMPH_GLINT

M2: CJNEA,MODE5,M3

LJMPM_GLINT

M3: CJNEA,MODE6,M4

MOVM_SEC,#0

MOVS_SEC,#0

LJMPMAIN1

M4: CJNEA,MODE1,M5

;CLRTR1

LJMPMAIN1

M5: MOVMODE_RG,#0

LJMPMAIN1

;*****************************MODE為1,3,小時位閃爍

//MOVTEMP,HOUR ;將TEMP賦值,防止在加的時候是在隨機值的基礎上增加

H_GLINT: ;CPLP1.0

MOVR0,#28

MOVR1,#28

K4: LCALLDISPLAY12 ;分開顯示

LCALLDISPLAY34

E1: JNBMODE_KEY,K21 ;檢測是否有按鍵按下,有按下則跳轉到分鍾位閃爍

JBUP_KEY,E9 ;判斷加位有無按鍵按下

LJMPUP

E9: DJNZR0,K4

K6: LCALLDISPLAY34

JNBMODE_KEY,K21 ;檢測是否有按鍵按下,有按下則跳轉延時後進行模式判斷

LJMPG1

K21: LCALLDELY10MS ;延時後確定有MODE按鍵按下,將

JBMODE_KEY,H_GLINT

W: JNBMODE_KEY,W

INCMODE_RG

CPLP1.4

LJMPDEALMODE ;確定有按下,MODE+1後返回MODE處理程序

JNBUP_KEY,UP ;判斷加位有無按鍵按下

G1: DJNZR1,K6

LJMPH_GLINT ;調用完畢返回,實現閃爍

K3: LJMPMAIN1 ;可省略

;******************************MODE為2,4,分鍾位閃爍

M_GLINT: MOVR0,#28

MOVR1,#28

K23: CPLP1.7

LCALLDISPLAY12

LCALLDISPLAY34

JNBMODE_KEY,KK ;跳轉,確定是否有按鍵按下

JNBUP_KEY,UP ;判斷加位有無按鍵按下

MOVA,MODE_RG

CJNEA,MODE3,E2 ;在MODE5的情況下要判斷鬧鍾確認鍵有沒按下

LJMPE5

E2: JNBDOWN_KEY,F2

LJMPE5

F2: LJMPONALARM2

E5: DJNZR0,K23

K24: LCALLDISPLAY12

JNBMODE_KEY,KK ;檢測是否有按鍵按下,有按下則跳轉

JNBUP_KEY,UP ;判斷加位有無按鍵按下

MOVA,MODE_RG ;掃描鬧鍾確認鍵

CJNEA,MODE3,E7 ;在MODE5的情況下要判斷鬧鍾確認鍵有沒按下

LJMPG2

E7: JBDOWN_KEY,E8

CPLP1.3

LJMPONALARM2

E8: LJMPG2

KK: LCALLDELY10MS ;去抖

JBMODE_KEY,M_GLINT

W1: JNBMODE_KEY,W1

INCMODE_RG

CPLP1.4

LJMPDEALMODE ;確定有按下,MODE+1後返回MODE處理程序

G2: DJNZR1,K24

LJMPM_GLINT

;*************************位加,處理程序

;***************小時調整

UP: MOVR1,#20

UP11: INCTEMP

UP12: MOVA,MODE_RG ;判斷此時的MODE,根據MODE將臨時變數給對應的賦值

CJNEA,MODE2,AA0 ;不是在MODE2的情況下跳轉

MOVA,TEMP

CJNEA,#24,A_UP1

MOVTEMP,#0

A_UP1: MOVHOUR,TEMP ;為MODE2,將臨時變數賦給小時位

LJMPUP15

AA0: CJNEA,MODE4,UP13//UP13為分鍾調整入口

MOVA,TEMP

CJNEA,#24,A_UP

MOVTEMP,#0

A_UP: MOVH_ALARM,TEMP ;模式3,將臨時變數賦給鬧鍾的小時位

LJMPUP15 ;UP15為顯示入口

;****************分鍾調整入口

UP13: MOVA,MODE_RG

CJNEA,MODE3,UP14 ;不是模式2,跳轉

MOVA,TEMP

CJNEA,#60,DISOVER2

MOVTEMP,#0

DISOVER2: MOVMIN,TEMP

LJMPUP15

UP14: MOVA,TEMP ;上面判斷不是模式2,則必然是模式4

CJNEA,#60,DISOVER3

MOVTEMP,#0

DISOVER3: MOVM_ALARM,TEMP

LJMPUP15

UP15: LCALLDISPLAY12

LCALLDISPLAY34

DJNZR1,UP01

MOVR1,#1 ;

JNBUP_KEY,UP11

UP01: JNBUP_KEY,UP12

UP16: MOVA,MODE_RG ;松開鍵以後按照模式判斷該返回哪種狀態,不能返回DEALMODE函數

CJNEA,MODE2,UP17

LJMPH_GLINT

UP17: CJNEA,MODE3,UP18

MOVSEC,#0 ;每次設置完時間後將秒鍾位置零保證時間准確

LJMPM_GLINT

UP18: CJNEA,MODE4,UP19

LJMPH_GLINT

UP19: CJNEA,MODE5,UP20

LJMPM_GLINT

UP20: LJMPMAIN1

ONALARM2: LCALLDELY10MS ;延時10MS,去抖

JBDOWN_KEY,B2 ;抖動所致,返回分鍾位閃爍

LJMPK42

B2: LJMPM_GLINT

K42: JNBDOWN_KEY,K42

MOVF_ALARM,#0FFH

MOVMODE_RG,#0

LJMPMAIN1

;---------------------------------------中斷程序入口---------------------

;*******************時間中斷0*********************

;錯誤1:中斷程序EXIT處用了MAIN1,導致一直處於中斷狀態

INT_0: PUSHACC

PUSHPSW

MOVTH0,#3CH

MOVTL0,#0B1H

INCBUF

MOVA,BUF

CJNEA,#20,EXIT

TIME: MOVBUF,#0

INCSEC

MOVA,SEC

CJNEA,#60,EXIT

MOVSEC,#00H

INCMIN

MOVA,MIN

CJNEA,#60,EXIT

MOVMIN,#00H

INCHOUR

MOVA,HOUR

CJNEA,#24,EXIT

MOVHOUR,#0

RETI

EXIT: POPPSW

POPACC

RETI

;******************時間中斷1***********************

INT_1: MOVTH1,#0D8H ;定時10MS

MOVTL1,#0F0H

INCS_SEC

MOVA,S_SEC

CJNEA,#100,EXIT4

MOVS_SEC,#0

INCM_SEC

MOVA,M_SEC

CJNEA,#100,EXIT4

MOVM_SEC,#0

EXIT4: RETI

;---------------------------------------顯示-----------------------------

DISPLAY12: MOVA,MODE_RG ;判斷模式,決定是顯示鬧鍾時間還是顯示當前時間

CJNEA,MODE4,DIS0 ;模式四,顯示鬧鍾

LJMPDIS01 ;MODE4

DIS0: CJNEA,MODE5,DIS20

DIS01: MOVR7,H_ALARM ;鬧鍾模式

LJMPDIS2

DIS20: CJNEA,MODE6,DIS21

MOVR7,M_SEC ;秒錶模式,顯示秒錶高位

LJMPDIS2

DIS21: CJNEA,MODE1,DIS1

LJMPDIS22

DIS22: MOVR7,MIN

LJMPDIS2

DIS1: MOVR7,HOUR ;DISPLAY12顯示高位

DIS2: LCALLBCTD ;判斷完畢,調用顯示

;將秒、分分別轉碼,放到R4,R3

MOVA,R4

MOVR3,A

LCALLDIVIDE

MOVDPTR,#NUMTAB

MOVP2,#0FH

MOVP2,LED0

MOVA,45H ;從拆字的出口獲取值

MOVCA,@A+DPTR

MOVP0,A

LCALLDELY10MS

MOVP2,LED1

MOVA,46H

MOVCA,@A+DPTR

MOVP0,A

LCALLDELY10MS

RET

DISPLAY34: MOVA,MODE_RG ;判斷模式,決定是顯示鬧鍾時間還是顯示當前時間

CJNEA,MODE4,DIS31

LJMPDIS32

DIS31: CJNEA,MODE5,DIS35

DIS32: MOVR7,M_ALARM

LJMPDIS34

DIS35: CJNEA,MODE6,DIS41

MOVR7,S_SEC ;秒錶模式,顯示秒錶低位

LJMPDIS34

DIS41: CJNEA,MODE1,DIS33

MOVR7,SEC

LJMPDIS34

DIS33: MOVR7,MIN ;DISPLAY34顯示低位

DIS34: LCALLBCTD

MOVA,R4

MOVR3,A

LCALLDIVIDE

MOVP2,LED2

MOVA,47H

MOVCA,@A+DPTR

MOVP0,A

LCALLDELY10MS

MOVP2,LED3

MOVA,48H

MOVCA,@A+DPTR

MOVP0,A

LCALLDELY10MS

SETBP2.3

RET

;--------------------二翻十:入口:R6R7出口:R2R3R4----------------------

BCTD: MOVR5,#16

CLRA

MOVR2,A

MOVR3,A

MOVR4,A

LOOP: CLRC

MOVA,R7

RLCA

MOVR7,A

MOVA,R6

RLCA

MOVR6,A

MOVA,R4

ADDCA,R4

DAA

MOVR4,A

MOVA,R3

ADDCA,R3

DAA

MOVR3,A

MOVA,R2

ADDCA,R2

DAA

MOVR2,A

DJNZR5,LOOP

RET

;-----------------------拆字:入口:R3R4出口:45H46H47H48H------------------

DIVIDE: MOVA,R3

ANLA,#0FH

MOV46H,A

MOVA,R3

ANLA,#0F0H

SWAPA

MOV45H,A;時拆字45H放時高位,46H放十低位

MOVA,R4

ANLA,#0FH

MOV48H,A

MOVA,R4

ANLA,#0F0H

SWAPA

MOV47H,A;分拆字47H放分高位,48H放分低位

RET

;------------------------------------延時----------------------------------

DELY10MS:MOVR6,#10

D1:MOVR7,#248

DJNZR7,$

DJNZR6,D1

RET

DELAY: MOV74H,#2;延時子程序,12M晶振延時1.002秒

L3: MOV72H,#10

L1: MOV73H,#249

L2: DJNZ73H,L2

LCALLDISPLAY12

LCALLDISPLAY34

JNBDOWN_KEY,OFFALARM1

LJMPS3

OFFALARM1: LCALLDELY10MS

JBDOWN_KEY,S3

S4: JNBDOWN_KEY,S4

MOVF_ALARM,#0

SETBP3.6

LJMPMAIN1

S3: DJNZ72H,L1

DJNZ74H,L3

RET

NUMTAB:DB0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,88H,83H,0C6H,0A1H,86H,8EH;碼表

END

『陸』 單片機定時鬧鍾程序分布解釋

//頭文件
#include<reg51.h>
//數據類型定義
#define ui unsigned int
#define uc unsigned char
//定義蜂鳴器管腳是BEEP
//數碼管顯示查表
uc code tab[]=
{0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,
0xc6,0xa1,0x86,0x8e,0xbf,0x89,0xc7,0xff};
uc t0,a,b,c,d,e,f,miao,fen,xs,n;
void display(uc,uc,uc);
//延時1ms函數
void delay(ui z)//延時1毫秒
{
ui a,b;
for(a=z;a>0;a--)
for(b=100;b>0;b--);
}
void init();
void keyscan();

void main() //主函數,在主函數中設置定時的時間,當時間到達預定值時,蜂鳴器響起
{
BEEP=1;
init();
while(1)
{
keyscan();
display(xs,fen,miao);
if(xs==7&&fen==0&&miao==0)
{
n=5;
while(n--)
{
BEEP=0;
delay(500);
BEEP=1;
delay(500);
}
}
}
}
void keyscan() //鍵盤掃描子函數,通過按鍵來實現相應的動作
{
P3=0x7f;
while(P3!=0x7f)
{
delay(10);
while(P3!=0x7f)
{
switch(P3)//按鍵檢測程序段 可以一同按鍵來更改秒分時的數值
{
case 0x7e:{miao++;if(miao==60)miao=0;}//如果加到頭了 就變0
break;
case 0x7d:{miao--;if(miao==0xff)miao=59;}//如果減到頭了 就變59
break;
case 0x7b:{fen++;if(fen==60)fen=0;}//同上
break;
case 0x77:{fen--;if(fen==0xff)fen=59;}//同上
break;
}
while(P3!=0x7f);
delay(10);
while(P3!=0x7f);
}
}

P3=0xbf;
while(P3!=0xbf)
{
delay(10);
while(P3!=0xbf)
{
switch(P3)
{
case 0xbe:{xs++;if(xs==24)xs=0;}//如果加到頭了 就變0
break;
case 0xbd:{xs--;if(xs==0xff)xs=23;}//如果減到頭 就變23 因為小時最大為24 其實24:00=0:00
break;
}
while(P3!=0xbf);
delay(10);
while(P3!=0xbf);
}

}
}
void init() //系統初始化開啟定時器0中斷
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;ET0=1;TR0=1;
}
//秒 分 時 變數的實時計數 運用tmer1中斷來實現 50ms中斷一次 中斷20次就是1s
void timer0() interrupt 1 //定時器1中斷子程序,實現正常的走秒
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
t0++;
if(t0==20)
{
t0=0;
miao++;
if(miao==60)
{
miao=0;
fen++;
if(fen==60)
{
fen=0;
xs++;
if(xs==24)
xs=0;
}
}
}
}
//運用數碼管的動態掃描方式,來驅動數碼管
void display(uc xs,uc fen,uc miao) //顯示函數,把數送到數碼管顯示
{
P2=0xfe;//選擇該位
P0=tab[miao%10];// 顯示段碼
delay(1);//延時
P0=0xff;//斷碼關掉 防止掃描出現幻影 後面的同上 以此類推

P2=0xfd;
P0=tab[miao/10];
delay(1);
P0=0xff;

P2=0xfb;
P0=tab[16];
delay(1);
P0=0xff;

P2=0xf7;
P0=tab[fen%10];
delay(1);
P0=0xff;

P2=0xef;
P0=tab[fen/10];
delay(1);
P0=0xff;

P2=0xdf;
P0=tab[16];
delay(1);
P0=0xff;

P2=0xbf;
P0=tab[xs%10];
delay(1);
P0=0xff;

P2=0x7f;
P0=tab[xs/10];
delay(1);
P0=0xff;

}

『柒』 單片機鬧鍾課程設計

1.單片機在計時控制方面的應用設計。
如:時鍾、頻率計、彩燈、交通燈
2.單片機在計數控制方面的應用設計。
如:計數器、計分器、搶答器、報警器
(1)時鍾能計時,可校準時間,至少有一種附帶功能(如秒錶、定時器或鬧鍾功能);(2)頻率計能測試並顯示1HZ—10KHZ頻率、5V的方波,可附帶方波發生器功能;(3)彩燈要求控制16個LED有兩種以上閃爍方式;(4)交通燈要求模擬控制十字路口交通信號,有倒計時顯示。
2. 單片機在計數控制方面應用的設計功能要求:
(1)計數器利用外中斷通過對感測器送來的方波計數的方法實現對產品線上的產品計數,用數碼管顯示計數結果;(2)計分器設計一個用於競技比賽的計分牌,通過按鈕設定對雙方的比分加減,可附加定時功能;(3)搶答器要求有4路以上,可以設定限時等功能;(4)報警器要求能對8路以上的通道進行巡檢,進行聲光報警和顯示通道號。
設計報告題目(三號宋體加粗居中)
XXX,C06(x)班,學號:xxxxxxx(小四號宋體居中)
1. 系統功能的確定(小四號宋體加粗)
正文(小四號宋體)
2. 方案論證
2.1方案一
2.2方案二
2.3方案三
系統方案的選定並給出總體框圖
3. 系統硬體的設計
3.1主控制器的設計(電路圖及設計說明)
3.2介面電路的設計
3.3等等
4. 系統軟體的設計
4.1主程序的設計(程序流程圖及說明)
4.2鍵掃描程序的設計
4.3等等
5. 系統調試
5.1硬體調試
5.2軟體調試
5.3綜合調試
6. 指標測試
6.1測試儀器
6.2指標測試
7. 結論
對課程設計的結果進行總結。
急用啊

『捌』 51單片機定時鬧鈴(c語言)

我來發一個C語言51單片機時鍾程序,希望能幫到你 /* 程序功能:帶定時鬧鈴時鍾 */ /*---------------------------------------------------------------*/ #include <AT89X51.H> /*包含器件配置文件*/ #define uchar unsigned char #define uint unsigned int char DATA_7SEG[10]={0xC0,0xF9,0xA4,0xB0,0x99, 0x92,0x82,0xF8,0x80,0x90,};/*0~9的數碼管段碼*/ uchar hour=0,min=0,sec=0; /*時、分、秒單元清零*/ uchar deda=0; /*5mS計數單元清零*/ bit d_05s=0; /*0.5秒標志*/ uchar set=0; /*模式設定標志*/ uchar m=0; uchar flag=0; /*RAM掉電標志*/ void delay(uint k); /*延時?函數*/ void conv(); /*走時單元轉換*/ void disp(); /*走時時間顯示?函數*/ /*------------------------走時?函數部分 ----------------------*/ /*定時器T0 5mS初始化*/ void init_timer() { TMOD=0x01; TH0=-(4800/256); TL0=-(4800%256); IE=0x82; TR0=1; } /*---------------------------------*/ /*5mS定時中斷服務?函數*/ void T0_srv(void) interrupt 1 { TH0=-(4800/256); TL0=-(4800%256); deda++; } /*----------------------------------*/ /*時、分、秒單元及走時單元轉換*/ void conv() { if(deda<=100)d_05s=0; else d_05s=1; if(deda>=200){sec++;deda=0;} if(sec==60){min++;sec=0;} if(min==60){hour++;min=0;} if(hour==24){hour=0;} } /*------------------------ 顯示?函數部分 ----------------------*/ /*走時時間顯示?函數*/ void disp() { P0=DATA_7SEG[hour/10];P2=0xf7;delay(1); P0=DATA_7SEG[hour%10];P2=0xfb;delay(1); if(d_05s==1){if(P2_2==0)P0_7=0;else P0_7=1;} delay(1); P0=DATA_7SEG[min/10];P2=0xfd;delay(1); P0=DATA_7SEG[min%10];P2=0xfe;delay(1); } /*---------------------- 調整時間?函數部分 -------------------*/ /*調整走時時間*/ void set_time() {uchar m; if(P2_5==0)delay(1); if(P2_5==0)hour++; if(hour==24)hour=0; for(m=0;m<30;m++) { disp(); if(P2_2==0)P0_7=0; else P0_7=1; delay(1); } if(P2_6==0)delay(1); if(P2_6==0)min++; if(min==60)min=0; for(m=0;m<30;m++) { disp(); if(P2_2==0)P0_7=0; else P0_7=1; delay(1); } } /*------------------ 按鍵掃描、延時等?函數部分-------------------*/ /*走時時間程序?函數*/ void time() { conv(); /* 走時單元轉換?函數 */ disp(); /* 走時時間顯示?函數 */ } /*------------------------------------*/ /*掃描按鍵?函數*/ void scan_key() { delay(1); if(P2_4==0)set++; if(set>=2)set=0; if(set==1)flag=0x55; F0:if(P2_4==0)goto F0; /*按鍵未釋放,在此等候*/ } /*------------------------------*/ /*延時?函數*/ void delay(uint k) { uint i,j; for(i=0;i<k;i++){ for(j=0;j<121;j++) {;}} } /*----------------------- 主函數 ------------------------- */ /*主函數*/ void main() { init_timer(); /*定時器T0初始化*/ while(1) /*無限循環*/ { if(P2_4==0)scan_key(); /*有按鍵,調用按鍵掃描?函數*/ switch(set) /*根據set鍵值散轉*/ { case 0:time(); break; /*走時時間程序*/ case 1:set_time();break; /*走時時間調整*/ default:break; /*其它退出*/ } if(flag!=0x55) /*判斷掉電標志*/ { P0=0xc0; P2=0xc0; delay(100); P2=0xff; delay(400); } } }

閱讀全文

與單片機課程設計定時鬧鍾相關的資料

熱點內容
如何從伺服器中查詢表是否存在 瀏覽:323
android首頁布局源碼 瀏覽:45
虎牙主播是怎麼安卓投屏的 瀏覽:782
redmonk編程語言排行榜 瀏覽:110
android嵌入html5 瀏覽:676
雲伺服器能永久使用嗎 瀏覽:904
linux安裝openresty 瀏覽:386
ubunt配置php 瀏覽:975
達達取貨碼在app哪裡 瀏覽:49
精靈寶可夢伺服器有什麼好玩的 瀏覽:261
開源java工作流 瀏覽:845
如何正確的刪除應用app 瀏覽:971
如何在雲伺服器上安裝用友軟體 瀏覽:983
單片機里wp是什麼意思 瀏覽:718
程序員重要的英文 瀏覽:625
加密照片密碼忘了怎麼辦 瀏覽:942
adb命令覆蓋安裝低版本 瀏覽:523
listcontainsjava 瀏覽:365
長單夾a4文件夾 瀏覽:397
doc命令查看當前所有進程 瀏覽:732