『壹』 用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); } } }