導航:首頁 > 操作系統 > 鬧鍾單片機

鬧鍾單片機

發布時間:2022-04-04 03:56:57

『壹』 stc c51單片機鬧鍾程序

用定時器中斷
#define HTime=0xf0
#define LTime=0x60
unsinged int time_i=0;
void time0(void);

void time0_init(void);
void time0_init(void)
{
TH0=HTime;
TL0=LTime;
TMOD=0x01;
TR0=1;
IE=0x82;
}

void time0(void) interrupt 1
{
TH0=0xF0;
TL0=0x60;
time_i++;
}
根據所用晶振調整HTime、LTime,得到1/100秒,然後計數就可以了。

『貳』 51單片機6位鬧鍾

用KEIL C51編譯通過

CODE_SEG SEGMENT CODE
DATA_SEG SEGMENT DATA
STACK_SEG SEGMENT IDATA

K1 BIT P1.4
K2 BIT P1.5

RSEG DATA_SEG
KEY_S: DS 1
KEY_V: DS 1
DIS_DIGIT: DS 1
SEC: DS 1
DIS_INDEX: DS 1
HOUR: DS 1
MIN: DS 1
SEC100: DS 1
DIS_BUF: DS 8

BUF_HOUR_H EQU DIS_BUF ; 小時十位
BUF_HOUR_L EQU DIS_BUF+1 ; 小時個位
BUF_MIN_H EQU DIS_BUF+3 ; 分十位
BUF_MIN_L EQU DIS_BUF+4 ; 分個位
BUF_SEC_H EQU DIS_BUF+6 ; 秒十位
BUF_SEC_L EQU DIS_BUF+7 ; 秒個位

RSEG STACK_SEG
STACK: DS 20

;===============================================================================

CSEG AT 0000H
JMP MAIN

CSEG AT 0000BH
LJMP TIMER0

CSEG AT 0001BH
LJMP TIMER1

;===============================================================================

RSEG CODE_SEG
MAIN:
USING 0

MOV SP, #(STACK-1) ;

MOV P0,#0FFH
MOV P2,#0FFH
MOV TMOD,#011H ; 定時器0, 1工作模式1, 16位定時方式
MOV TH0,#0FCH
MOV TL0,#017H
MOV TH1,#0DCH
CLR A
MOV TL1,A

MOV HOUR,#12 ;
CLR A ;
MOV MIN,A
MOV SEC,A
MOV SEC100,A

MOV A,HOUR
MOV B,#10
DIV AB
MOV DPTR,#DIS_CODE
MOVC A,@A+DPTR
MOV BUF_HOUR_H,A ; 時十位
MOV A,HOUR
MOV B,#10
DIV AB
MOV A,B
MOVC A,@A+DPTR
MOV BUF_HOUR_L,A ; 時個位
MOV A,MIN
MOV B,#10
DIV AB
MOVC A,@A+DPTR
MOV BUF_MIN_H,A ; 分十位
MOV A,MIN
MOV B,#10
DIV AB
MOV A,B
MOVC A,@A+DPTR
MOV BUF_MIN_L,A ; 分個位
MOV A,SEC
MOV B,#10
DIV AB
MOVC A,@A+DPTR
MOV BUF_SEC_H,A ; 秒十位
MOV A,SEC
MOV B,#10
DIV AB
MOV A,B
MOVC A,@A+DPTR
MOV BUF_SEC_L,A ; 秒個位

MOV BUF_HOUR_H+02H,#0BFH
MOV BUF_HOUR_H+05H,#0BFH

MOV DIS_DIGIT,#0FEH
CLR A
MOV DIS_INDEX,A

MOV IE,#08AH ; 使能timer0,1 中斷

SETB TR0
SETB TR1

MOV KEY_V,#03H

MAIN_LP:
LCALL SCAN_KEY ; 鍵掃描
JZ MAIN_LP ; 無鍵返回

MOV R7,#10 ; 延時10ms
LCALL DELAYMS ; 延時去抖動
LCALL SCAN_KEY ; 再次掃描
JZ MAIN_LP ; 無鍵返回

MOV KEY_V,KEY_S ; 保存鍵值
LCALL PROC_KEY ; 鍵處理
SJMP MAIN_LP ; 調回主循環

;===============================================================================
SCAN_KEY:
; 掃鍵掃描子程序
; 保存按鍵狀態到key_s
; 返回: A --- 按鍵是否按下(BOOL)

CLR A

MOV C,K1 ; 讀按鍵K1
MOV ACC.0,C
MOV C,K2 ; 讀按鍵K2
MOV ACC.1,C

MOV KEY_S,A ; 保存按鍵狀態到key_s
XRL A,KEY_V
RET

;===============================================================================
PROC_KEY:
; 鍵處理子程序
; 傳入參數: KEY_V --- 按鍵值
; 返回值: 無

CLR EA

MOV A,KEY_V
JNB ACC.0,PROC_K1
JNB ACC.1,PROC_K2
SJMP END_PROC_KEY

PROC_K1: ; 按鍵k1處理
LCALL INC_HOUR ; 小時加1
SJMP END_PROC_KEY

PROC_K2: ; 按鍵K2處理
INC MIN ; 分鍾加1

MOV A,MIN ;
SETB C
SUBB A,#59
JC K2_UPDATE_MIN ; 如果分鍾等於60,則分清0,小時加1

CLR A ;
MOV MIN,A

K2_UPDATE_MIN: ; 更新分顯示緩沖區
MOV A,MIN
MOV B,#10
DIV AB ; A = MIN / 10
MOV DPTR,#DIS_CODE
MOVC A,@A+DPTR
MOV BUF_MIN_H,A ; 更新分十位

MOV A,MIN
MOV B,#10
DIV AB
MOV A,B ; A = MIN % 10
MOVC A,@A+DPTR
MOV BUF_MIN_L,A ; 更新分個位

END_PROC_KEY:
SETB EA
RET

;===============================================================================

USING 0
TIMER0:
; 定時器0中斷服程序, 用於數碼管的動態掃描
; DIS_INDEX --- 顯示索引, 用於標識當前顯示的數碼管和緩沖區的偏移量
; DIS_DIGIT --- 位選通值, 傳送到P2口用於選通當前數碼管的數值, 如等於0xfe時,
; 選通P2.0口數碼管
; DIS_BUF --- 顯於緩沖區基地址

PUSH ACC
PUSH PSW
PUSH AR0

MOV TH0,#0FCH
MOV TL0,#017H

MOV P2,#0FFH ; 先關閉所有數碼管

MOV A,#DIS_BUF ; 獲得顯示緩沖區基地址
ADD A,DIS_INDEX ; 獲得偏移量
MOV R0,A ; R0 = 基地址 + 偏移量
MOV A,@R0 ; 獲得顯示代碼
MOV P0,A ; 顯示代碼傳送到P0口

MOV P2,DIS_DIGIT

MOV A,DIS_DIGIT ; 位選通值左移, 下次中斷時選通下一位數碼管
RL A
MOV DIS_DIGIT,A

INC DIS_INDEX ; DIS_INDEX加1, 下次中斷時顯示下一位
ANL DIS_INDEX,#0x07 ; 當DIS_INDEX等於8(0000 1000)時, 清0

POP AR0
POP PSW
POP ACC

RETI

;===============================================================================
USING 0
TIMER1:
; 定時器1中斷服務程序, 產生時基信號10ms
;
;
PUSH PSW
PUSH ACC
PUSH B
PUSH DPH
PUSH DPL

MOV TH1,#0DCH

INC SEC100

MOV A,SEC100
CLR C
SUBB A,#100 ; 是否中斷100次(達到1s)
JC END_TIMER1 ; < 1S

MOV SEC100,#00H ; 達到1s
LCALL INC_SEC ; 秒加1

END_TIMER1:
POP DPL
POP DPH
POP B
POP ACC
POP PSW

RETI ;

;===============================================================================
INC_SEC:
INC SEC

MOV A,SEC
SETB C
SUBB A,#59 ;
JC UPDATE_SEC

CLR A
MOV SEC,A
LCALL INC_MIN

UPDATE_SEC:
MOV A,SEC
MOV B,#10
DIV AB ; A = SEC / 10
MOV DPTR,#DIS_CODE
MOVC A,@A+DPTR ;
MOV BUF_SEC_H,A ;

MOV A,SEC
MOV B,#10
DIV AB
MOV A,B ; A = SEC % 10
MOVC A,@A+DPTR
MOV BUF_SEC_L,A
RET

;===============================================================================

INC_MIN:
INC MIN ; 分鍾加1

MOV A,MIN ;
SETB C
SUBB A,#59
JC UPDATE_MIN ; 如果分鍾等於60,則分清0,小時加1

CLR A ;
MOV MIN,A
LCALL INC_HOUR ; 小時加1

UPDATE_MIN: ; 更新分顯示緩沖區
MOV A,MIN
MOV B,#10
DIV AB ; A = MIN / 10
MOV DPTR,#DIS_CODE
MOVC A,@A+DPTR
MOV BUF_MIN_H,A ; 更新分十位

MOV A,MIN
MOV B,#10
DIV AB
MOV A,B ; A = MIN % 10
MOVC A,@A+DPTR
MOV BUF_MIN_L,A ; 更新分個位

RET

;===============================================================================

INC_HOUR:
INC HOUR ; 小時加1
MOV A,HOUR
SETB C
SUBB A,#24
JC UPDATE_HOUR ; 如果小時等於24,則小時清0

CLR A
MOV HOUR,A ; 小時清0

UPDATE_HOUR:
MOV A,HOUR
SETB C
SUBB A,#9
JC UPDATE_HOUR1 ; 如果小時小於10,則十位0不顯示

MOV A,HOUR
MOV B,#10
DIV AB
MOV DPTR,#DIS_CODE
MOVC A,@A+DPTR ;
MOV BUF_HOUR_H,A
SJMP UPDATE_HOUR2

UPDATE_HOUR1:
MOV BUF_HOUR_H,#0FFH

UPDATE_HOUR2:
MOV A,HOUR
MOV B,#10
DIV AB
MOV A,B
MOV DPTR,#DIS_CODE
MOVC A,@A+DPTR
MOV BUF_HOUR_L,A
RET

;===============================================================================

DELAYMS:
; 延時子程序
; 傳入參數:R7 --- 延時值(MS)
; 返回值:無

MOV A,R7
JZ END_DLYMS
DLY_LP1:
MOV R6,#185
DLY_LP2:
NOP
NOP
NOP
DJNZ R6,DLY_LP2
DJNZ R7,DLY_LP1

END_DLYMS:
RET

; END OF DELAYMS

;===============================================================================

DIS_CODE:
DB 0C0H
DB 0F9H
DB 0A4H
DB 0B0H
DB 099H
DB 092H
DB 082H
DB 0F8H
DB 080H
DB 090H
DB 0FFH

END

『叄』 高分!單片機鬧鍾程序

看不見圖。

『肆』 單片機設置多個鬧鍾C程序

建立一個鬧鍾結構體
struct ALARM
{
unsigned char hour;
unsigned char min;
unsigned char onoff;
};
struct ALARM alarms[6]; 就有6個鬧鍾了,而其中的下標就是鬧鍾序號。
然後就根據時鍾(一般分鍾就夠了)進位信號,逐個查詢各鬧鍾是否開啟,若開啟則進行時鍾與鬧鍾的時間比較,如果時間相符則鬧鍾給出定時時間到的信號,以驅動鬧鈴響起等。

『伍』 單片機 鬧鍾

不知道你原來的系統有哪些資源。
至少需要有設置時鍾與鬧鍾的按鍵,遙控鍵也算,以及時間顯示。

傳統的方法,一般是加時鍾晶元,最主要的是時鍾晶元要加電池,一般是加鈕扣電池,這樣停電或關機的時候,時鍾繼續跑,不會停。
當然,如果你的系統是一直加電的,不用時鍾晶元和電池也沒問題,直接用CPU跑時鍾,就是費點電。但注意,一旦斷電,時鍾歸零,鬧鍾就沒法用了。如果只是偶爾繼電,加超級電容的方法也很不錯。
還有一種比較新的辦法是用電波鍾模塊,每次開機的時候,自動獲取國家天文台的標准授時。這個方法特別適合自己動手的玩家,淘寶上有BPC模塊買。但是這個拋開專利的問題不談,據說接收的時候白天與晚上差別是很大的,白天開機,可能很長時間收不到信號。實際做鍾表,裡面除了每天定點對時,其餘時間都是自己用時鍾晶元跑表的。

『陸』 51單片機鬧鍾

一般而言,中斷裡面不允許處理太多數據,更別說在中斷裡面故意延時了。暫且不追究這個問題。
單片機裡面,死循出現的最可能的原因是你的變數定義有問題,比如說你這里定義的g是什麼?是char,是int,還是long?記住它們的范圍。char是0~255,int是0~65535。long太長了,我也記不往。通常為了節省空間,我們將計數器i定義為unsigned char,但如果計數值可能大於255時,那你一定錯了。
兄弟你先看一下,delay函數裡面的計數變數是不是定義為char。如果是,就將它改為int,如果你還不放心,就將它改為long。還有中斷裡面的g變數,最好定義成int,因為你很有可能寫個:
for(g=0;g<300;g++)
{
……
}
你先檢查了看。

『柒』 如何拿單片機用C語言編程做一個鬧鍾

下面的程序就是用AT89C2051做的數字式時鍾,數碼管顯示,具有鬧鍾功能,整點報時,幾點蜂鳴器響幾下,晚上九點到第二天早上六點整點不報時。給你參考一下吧。

#include<AT89X051.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char

sbit sda=P3^1;
sbit scl=P3^0;
sbit key1=P1^7;
sbit key2=P1^6;
sbit key3=P1^5;
sbit kz=P3^5;
sbit bs=P3^4;
char shi=12,fen=12,ke1,mm,mi,nh,nf,mn,mms,baos,a;
bit ms,nt,b;
uchar code SEG8[]={ 0x50,0x5F,0x94,0x15,0x1B,
0x31,0x30,0x57,0x10,0x11,
0x40,0x4F,0x84,0x05,0x0B,
0x21,0x20,0x47,0x00,0x01,
0x21,0xa2,0x52,0xff};
//0-9,0.-9.;s.,f.,n 暗
void delay1ms(uchar ms)
{
uchar i;
while(ms--)
{
for(i = 0; i< 250; i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
void display(char numh,char numf)
{
uchar qian,,sh,ge;
if(ke1==1)
qian=20;
else if(ke1==2)
qian=21;
else if((ke1==3)||(ke1==4))
qian=22;
else if(ke1==0)
qian=numh/10;
if((ke1==1)||(ke1==2))
=23;
else if(ke1==3)
=20;
else if(ke1==4)
=21;
else if(ke1==0)
{
=numh%10;
if(ms)
=+10;
}
if((ke1==1)||(ke1==3))
{sh=numh/10;ge=numh%10;}
else if((ke1==2)||(ke1==4)||(ke1==0))
{sh=numf/10;ge=numf%10;}
P1=SEG8[qian];
P3_3=0;delay1ms(2);P3_3=1;
P1=SEG8[];
P3_7=0;delay1ms(2);P3_7=1;
P1=SEG8[sh];
P3_2=0;delay1ms(2);P3_2=1;
P1=SEG8[ge];
P3_0=0;delay1ms(2);P3_0=1;
}
///////////x24c02//////////////////
void delay24()
{ ;; }

void init24c02() //初始化
{
sda=1;
delay24();
scl=1;
delay24();
}

void start2() //開始信號
{
sda=1;
delay24();
scl=1;
delay24();
sda=0;
delay24();
}

void stop() //停止
{
sda=0;
delay24();
scl=1;
delay24();
sda=1;
delay24();
}

void respons() //應答
{
uchar i;
scl=1;
delay24();
while((sda==1)&&(i<250))i++;
scl=0;
delay24();
}

void write_byte(char date) // 寫數據子函數
{
uchar i,temp;
temp=date;

for(i=0;i<8;i++)
{
temp=temp<<1;
scl=0;
delay24();
sda=CY;
delay24();
scl=1;
delay24();
}
scl=0;
delay24();
sda=1;
delay24();
}

uchar read_byte() // 讀數據子函數
{
uchar i,k;
scl=0;
delay24();
sda=1;
delay24();
for(i=0;i<8;i++)
{
scl=1;
delay24();
k=(k<<1)|sda;
scl=0;
delay24();
}
return k;
}
///////寫數據函數///////////////////
void write_add(uchar address,char date)
{
start2();
write_byte(0xa0);
respons();
write_byte(address);
respons();
write_byte(date);
respons();
stop();
}
char read_add(uchar address) //讀數據函數
{
uchar date;
start2();
write_byte(0xa0);
respons();
write_byte(address);
respons();
start2();
write_byte(0xa1);
respons();
date=read_byte();
stop();
return date;
}

void keyf(char *con,char up,char don)
{
uint i;
for(i=0;i<800;i++)
{
if((ke1==1)||(ke1==2))
display(shi,fen);
else if((ke1==3)||(ke1==4))
display(nh,nf);
P1=0xff;
if(key1==0)
{
delay1ms(10);
if(key1==0)
{
ke1++;
if(ke1>=5)
ke1=0;
while(!key1);
break;
}
}
if(key2==0)
{
delay1ms(10);
if(key2==0)
{
i=0;
*con+=1;
if(*con>up)
*con=0;
while(!key2);
}
}

if(key3==0)
{
delay1ms(10);
if(key3==0)
{
i=0;
*con-=1;
if(*con<don)
*con=up;
while(!key3);
}
}

}
}
void key()
{
P1=0xff;
if(key1==0)
{
EA=0;
delay1ms(20);
if(key1==0)
{
ke1++;
if(ke1>=5)
ke1=0;
while(!key1);
}
if(ke1==1)
{
keyf(&shi,23,0);
}
if(ke1==2)
{
keyf(&fen,59,0);
}
if(ke1==3)
{
keyf(&nh,23,0);
}
if(ke1==4)
{
keyf(&nf,59,0);
}
P1=0xff;P3=0xff;
write_add(0x01,nh);
delay1ms(5);
write_add(0x03,nf);
ke1=0;
EA=1;
}

}
void Timer0Init(void)
{
TMOD |= 0x01;
TL0 = 0xB0;
TH0 = 0x3C;
TF0 = 0;
TR0 = 1;
EA=1;
ET0=1;
}

void main()
{
P1=0xff;
P3=0xff;
init24c02();
nh=read_add(0x01);
delay1ms(50);
nf=read_add(0x03);
delay1ms(50);
Timer0Init();
while(1)
{
key();
display(shi,fen);
}
}
void tim0 ()interrupt 1
{
TH0=0X3C;
TL0=0XB0;
if(++mms>=10)
{
mms=0;
ms=!ms;
}
if(++mm>=20)
{
mm=0;
if(++mi>=60)
{
mi=0;
if(++fen>=60)
{
fen=0;
if(++shi>=24)
shi=0;
}
}
}
if(fen==0)
{
if((shi>=7)&&(shi<=20))
{
if((baos==0)&&(b==0))
{
baos=shi;
baos=baos*2;
b=1;
}
if(++a==10)
{
a=0;
if(--baos!=0)
{
bs=!bs;
}
else
{
bs=1;
}
}
}
}
else
b=0;
if(nh==shi)
{
if(nf==fen)
{
if(nt==0)
{
P1=0xff;
if(++mn==10)
{
mn=0;
kz=!kz;
}
if(key3==0)
{
nt=1;
kz=1;
}
}
}
else
{
nt=0;
kz=1;
}
}
}

『捌』 51單片機電子鬧鍾

網頁鏈接

可以看下這個例子

『玖』 單片機,定時鬧鍾

這個函數只是檢查時間是否到了,而時間的增加應該用中斷函數完成

『拾』 如何製作單片機鬧鍾

這個你可以直接使用一個大面積的晶元,然後將它插在鬧鍾上面,這樣的話就就可以製作一個簡單的鬧鍾了,特別的簡單。

閱讀全文

與鬧鍾單片機相關的資料

熱點內容
php會員注冊代碼 瀏覽:511
csgo如何用128tick伺服器 瀏覽:571
百度網度怎麼解壓 瀏覽:946
windowsopencv源碼 瀏覽:945
origin平滑演算法 瀏覽:875
unity程序員簡歷 瀏覽:63
單片機ifelse 瀏覽:695
如何理解php面向對象 瀏覽:96
macword轉pdf 瀏覽:848
python列表求交集 瀏覽:874
解壓包如何轉音頻 瀏覽:447
機明自動編程軟體源碼 瀏覽:326
php埠號設置 瀏覽:541
phperegreplace 瀏覽:320
androidgridview翻頁 瀏覽:537
ssh協議編程 瀏覽:635
如何開我的世界電腦伺服器地址 瀏覽:861
玄關pdf 瀏覽:609
程序員學習論壇 瀏覽:940
程序員的毒雞湯怎麼做 瀏覽:548