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

定時鬧鍾單片機課程設計

發布時間:2025-07-03 18:39:42

① 基於單片機的數字時鍾設計開題報告

//我這里有一個定時的鬧鍾,你把蜂鳴器的中斷改為LED就行了,可以通過P2^0--P2^3實現秒錶的顯示和以及調時調分和調節鬧鍾以及鬧鍾的開關,有問題可以給我留言QQ834589429

#include<reg52.h>//包含頭文件,一般情況不需要改動,頭文件包含特殊功能寄存器的定義

codeunsignedchartab[]=

{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

//共陰數碼管0-9

sbitA1=P2^0;

sbitA2=P2^1;

sbitA3=P2^2;

sbitA4=P2^3;

sbitbeep=P1^4;

unsignedcharShiwan;

unsignedcharWanwei;

unsignedcharQianwei;

unsignedcharBaiwei;

unsignedcharShiwei;//定義十位

unsignedcharGewei,Naoling1,Naoling2,Naoling3,Naoling4;//定義個位

staticunsignedcharhour=12,minute=30,second=0,count=0;

staticunsignedcharalarmhour=12,alarmminute=29,i=0,j=0,k;

/******************************************************************/

/*延時函數*/

/******************************************************************/

voiddelay(unsignedintcnt)

{

while(--cnt);

}

voidxianshi(void)

{

Gewei=tab[second%10];//個位顯示處理

Shiwei=tab[second/10];//十位顯示值處理

if(second%2==0)

{

Baiwei=tab[minute%10];

Qianwei=tab[minute/10];//千位

}

else

{

Baiwei=(tab[minute%10]|0x80);//百位顯示處理:加點的字碼

Qianwei=(tab[minute/10]|0x80);

}

if(second%2!=0)

{

Wanwei=tab[hour%10];

Shiwan=tab[hour/10];

}

else

{

Wanwei=(tab[hour%10]|0x80);

Shiwan=(tab[hour/10]|0x80);

}

Naoling1=~tab[alarmhour%10];

Naoling2=~tab[alarmhour/10];

Naoling3=~tab[alarmminute%10];

Naoling4=~tab[alarmminute/10];

}

voidtimer0()interrupt3using1

{

TH1=0x3c;//中斷設置初始化

TL1=0xb0;

if(alarmhour==hour&&alarmminute==minute&&j==1)

{

beep=0;

}

}

/******************************************************************/

/*定時器中斷函數*/

/******************************************************************/

voidtimer1()interrupt1using0

{

TH0=0xd8;//重新賦值

TL0=0xf0;

count++;

xianshi();

if(count==99)//100x10ms=1S,大致延時時間

{

count=0;

second++;//秒加1

if(second==60)

minute++;

{

if(second==60)

second=0;

{

if(minute==60)

hour++;

{

if(minute==60)

minute=0;

{

if(hour==24)

hour=0;

}

}

}

}

}

}

/******************************************************************/

/*主函數*/

/******************************************************************/

voidmain()

{

TMOD|=0x01;//定時器設置10msin12Mcrystal,工作在模式1,16位定時

TH0=0xd8;

TL0=0xf0;

IE=0x82;//打開中斷

TR0=1;//打開定時開關

xianshi();

EA=1;ET0=1;TMOD|=0x21;TR0=1;//開中斷總開關,計數器0允許中斷,設置中斷模式,啟動計數器0

ET1=1;TR1=1;

while(1)

{

{

if(!A3)

{

delay(10000);

if(!A3)

{

i++;if(i==7)i=0;

xianshi();

}

}

}

{

if(!A4)

{

delay(10000);

if(!A4)

{

i--;if(i==255)i=6;

xianshi();

}

}

}

switch(i)

{

case0://正常顯示控制

{

P1=0x1e;//片選個位

P0=~Baiwei;//顯示個位

delay(300);//短暫延時

P1=0x1d;//片選十位

P0=~Qianwei;//顯示十位

delay(300);//短暫延時

P1=0x1b;//片選百位

P0=~Wanwei;//顯示百位

delay(300);//短暫延時

P1=0x17;//片選千位

P0=~Shiwan;//顯示千位

delay(300);//短暫延時

P1=0x1f;

P0=0xff;

delay(300);

};break;

case1://調分控制

{

if(second%2!=0)

{

P1=0x1e;//片選個位

P0=~Baiwei;//顯示個位

delay(300);//短暫延時

P1=0x1d;//片選十位

P0=~Qianwei;//顯示十位

delay(300);//短暫延時

P1=0x1f;

P0=0xff;

delay(300);

}

else

delay(300);

delay(300);

{

if(!A1)

{

delay(10000);//消抖

if(!A1)

{

minute++;if(minute==61)minute=0;

xianshi();

}

}//按鍵處理

}

{

if(!A2)

{

delay(10000);//消抖

if(!A2)

{

minute--;if(minute==255)minute=59;

xianshi();

}

}

}

};break;

case2://調時控制

{

if(second%2==0)

{

P1=0x1b;//片選百位

P0=~Wanwei;//顯示百位

delay(300);//短暫延時

P1=0x17;//片選千位

P0=~Shiwan;//顯示千位

delay(300);//短暫延時

P1=0x1f;

P0=0xff;

delay(300);

}

else

delay(300);

delay(300);

{

if(!A1)

{

delay(10000);//消抖

if(!A1)

{

hour++;if(hour==24)hour=0;

xianshi();

}

}//按鍵處理

}

{

if(!A2)

{

delay(10000);//消抖

if(!A2)

{

hour--;if(hour==255)hour=23;

xianshi();

}

}

}

};break;

case3://秒顯示控制

{

P1=0x1e;//片選個位

P0=~Gewei;//顯示個位

delay(300);//短暫延時

P1=0x1d;//片選十位

P0=~Shiwei;//顯示十位

delay(300);//短暫延時

P1=0x1f;

P0=0xff;

delay(300);

delay(300);

delay(300);

};break;

case4://鬧鍾控制

{

if((!A1)||(!A2))

{

delay(10000);

if((!A1)||(!A2))j++;

if(j==2)

j=0;

}

switch(j)

{

case0:{

P1=0x1e;//片選個位

P0=~0x71;//顯示個位

delay(300);//短暫延時

P1=0x1d;//片選十位

P0=~0x71;//顯示十位

delay(300);//短暫延時

P1=0x1b;//片選百位

P0=~0x3f;//顯示百位

delay(300);//短暫延時

P1=0x17;//片選千位

P0=~0x40;//顯示千位

delay(300);//短暫延時

delay(300);

};break;

case1:{

P1=0x1e;//片選個位

P0=~0x37;//顯示個位

delay(300);//短暫延時

P1=0x1d;//片選十位

P0=~0x3f;//顯示十位

delay(300);//短暫延時

P1=0x1b;//片選百位

P0=0xff;//顯示百位

delay(300);//短暫延時

P1=0x17;//片選千位

P0=~0x40;//顯示千位

delay(300);//短暫延時

delay(300);

}

}

};break;

case5://鬧鈴分鍾調整

{

{

P1=0x1e;

P0=Naoling3;

delay(300);

P1=0x1d;

P0=Naoling4;

delay(300);

P1=0x1f;

P0=0xff;

delay(300);

delay(300);

delay(300);

}

{

if(!A1)

{

delay(10000);//消抖

if(!A1)

{

alarmminute++;if(alarmminute==61)alarmminute=0;

}

}//按鍵處理

}

{

if(!A2)

{

delay(10000);//消抖

if(!A2)

{

alarmminute--;if(alarmminute==255)alarmminute=59;

}

}

}

};break;

case6://鬧鈴小時調整

{

{

P1=0x1b;

P0=Naoling1;

delay(300);

P1=0x17;

P0=Naoling2;

delay(300);

P1=0x1f;

P0=0xff;

delay(300);

delay(300);

delay(300);

}

{

if(!A1)

{

delay(10000);//消抖

if(!A1)

{

alarmhour++;if(alarmhour==24)alarmhour=0;

}

}//按鍵處理

}

{

if(!A2)

{

delay(10000);//消抖

if(!A2)

{

alarmhour--;if(alarmhour==255)alarmhour=23;

}

}

};break;

default:break;

}

}

}

}

② 求一個51單片機定時鬧鍾程序。要C語言。能夠調時間

我來發一個C語言51單片機時鍾程序,希望能幫到你

/*程序功能:帶定時鬧鈴時鍾*/

/*---------------------------------------------------------------*/

#include<AT89X51.H>/*包含器件配置文件*/

#defineucharunsignedchar

#defineuintunsignedint

charDATA_7SEG[10]={0xC0,0xF9,0xA4,0xB0,0x99,

0x92,0x82,0xF8,0x80,0x90,};/*0~9的數碼管段碼*/

ucharhour=0,min=0,sec=0;/*時、分、秒單元清零*/

uchardeda=0;/*5mS計數單元清零*/

bitd_05s=0;/*0.5秒標志*/

ucharset=0;/*模式設定標志*/

ucharm=0;

ucharflag=0;/*RAM掉電標志*/

voiddelay(uintk);/*延時?函數*/

voidconv();/*走時單元轉換*/

voiddisp();/*走時時間顯示?函數*/

/*------------------------走時?函數部分----------------------*/

/*定時器T05mS初始化*/

voidinit_timer()

{

TMOD=0x01;

TH0=-(4800/256);

TL0=-(4800%256);

IE=0x82;

TR0=1;

}

/*---------------------------------*/

/*5mS定時中斷服務?函數*/

voidT0_srv(void)interrupt1

{

TH0=-(4800/256);

TL0=-(4800%256);

deda++;

}

/*----------------------------------*/

/*時、分、秒單元及走時單元轉換*/

voidconv()

{

if(deda<=100)d_05s=0;

elsed_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;}

}

/*------------------------顯示?函數部分----------------------*/

/*走時時間顯示?函數*/

voiddisp()

{

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;elseP0_7=1;}

delay(1);

P0=DATA_7SEG[min/10];P2=0xfd;delay(1);

P0=DATA_7SEG[min%10];P2=0xfe;delay(1);

}

/*----------------------調整時間?函數部分-------------------*/

/*調整走時時間*/

voidset_time()

{ucharm;

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;

elseP0_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;

elseP0_7=1;

delay(1);

}

}

/*------------------按鍵掃描、延時等?函數部分-------------------*/

/*走時時間程序?函數*/

voidtime()

{

conv();/*走時單元轉換?函數*/

disp();/*走時時間顯示?函數*/

}

/*------------------------------------*/

/*掃描按鍵?函數*/

voidscan_key()

{

delay(1);

if(P2_4==0)set++;

if(set>=2)set=0;

if(set==1)flag=0x55;

F0:if(P2_4==0)gotoF0;/*按鍵未釋放,在此等候*/

}

/*------------------------------*/

/*延時?函數*/

voiddelay(uintk)

{

uinti,j;

for(i=0;i<k;i++){

for(j=0;j<121;j++)

{;}}

}

/*-----------------------主函數-------------------------*/

/*主函數*/

voidmain()

{

init_timer();/*定時器T0初始化*/

while(1)/*無限循環*/

{

if(P2_4==0)scan_key();/*有按鍵,調用按鍵掃描?函數*/

switch(set)/*根據set鍵值散轉*/

{

case0:time();break;/*走時時間程序*/

case1:set_time();break;/*走時時間調整*/

default:break;/*其它退出*/

}

if(flag!=0x55)/*判斷掉電標志*/

{

P0=0xc0;P2=0xc0;delay(100);

P2=0xff;delay(400);

}

}

}

③ 基於51單片機簡易時鍾鬧鍾八位數碼管顯示Proteus模擬

設計目的

本設計旨在實現一個基於51單片機的多功能數字時鍾鬧鍾,其主要功能包括顯示時、分、秒,並能設置時間和鬧鍾。該設計採用單片機內部定時器實現計時功能,通過八位數碼管顯示當前時間。用戶可以對時、分、秒進行獨立設置,設置時數碼管將閃爍。此外,鬧鍾功能可讓用戶設置特定時間,當時間到達,蜂鳴器將每秒鳴響一次,持續6秒。用戶可以通過按鍵手動消除鬧鍾。

模擬過程

開始模擬後,數碼管顯示時間00:00:00,時間逐秒遞增。按下設置鍵進入設置模式,時鍾、分鍾、秒鍾分別閃爍以表示當前正在設置相應參數。設置完畢後,按下設置鍵退出設置模式,數碼管恢復正常顯示。用戶可以通過功能切換按鍵顯示鬧鍾時間,並通過類似步驟設置鬧鍾時間。鬧鍾時間到時,蜂鳴器將鳴響,每隔1秒響一次,持續6秒,可通過按鍵停止鬧鍾。

程序代碼

使用KEIL4或KEIL5編譯程序代碼,代碼配有注釋,以便理解代碼功能。

原理圖與電路

原理圖使用AD軟體繪制,可供實物參考。Proteus模擬與實物有差異,包括運行環境、調試方式、電路連接方式和運行速度,以及功能實現等。

設計報告

設計報告包含設計框圖、引言、硬體設計、軟體設計、模擬調試、總結和參考文獻,總計超過6600字。

設計資料清單

設計資料包括模擬、程序源碼、開題報告、原理圖、功能要求、元器件清單、設計報告、軟硬體流程框圖、講解視頻、設計相關軟體資料、答辯技巧、設計報告常用描述等內容。

常見問題及解決方法

提供解決常見使用問題的指南,包括模擬圖、程序源碼、開題報告、原理圖、功能要求、元器件清單、設計報告、軟硬體流程框圖、講解視頻等內容的說明和鏈接。

④ 單片機數字時鍾設計

ORG 0X00
LJMP START
ORG 0X30
#30H ; 設置堆棧
MOV P1, #0XFE ; 設置在數碼管的第0位顯示
MOV A, #0X01 ; A置初值為0000 0001
LOOP: MOV P0, A ; 在數碼管上顯示寄存器A中的二進制數
MOV R3, #0X5C ; 延時1S
ACALL EXTDELAY ; 延時觀察和記錄對應的顯示結果
RL A ; 將A寄存器的值循環左移一位
SJMP LOOP ; 循環顯示
DELAY: MOV R1, #0XC8 ; 延時20MS
DL2: MOV R2, #0X18
DL1: NOP
NOP
DJNZ R2, DL1
DJNZ R1, DL2
RET
EXTDELAY:ACALL DELAY
DJNZ R3,EXTDELAY
RET
END

ORG 0X00
SJMP START
ORG 0X30
START: MOV SP, #30H ; 設置堆棧
MOV P1, #0XFE ; 位選信號,選中第0個數碼管
MOV P0, #0X6F ; 在數碼管上顯示"9"
LOOP: SJMP LOOP ; 循環執行程序
END

ORG 0X00
LJMP START
ORG 0X30
START: MOV SP, #30H ; 設置堆棧
MOV P1, #0XFE ; 設置在數碼管的第0位顯示
MOV DPTR, #TABLE ; 送TABLE地址到DPTR指針
MOV R7, #0X00 ; 標志變數,限制指針在TABLE區
LOOP: CLR A
MOVC A, @A+DPTR ; 取TABLE區的字形碼
MOV P0, A ; 在數碼管上顯示寄存器A中的二進制數
INC R7 ; 指針控制加一
MOV R3, #0X5C ; 延時
ACALL EXTDELAY ; 延時觀察和記錄對應的顯示結果
CJNE R7, #0X10, NEXT ; 如果TABLE中數未取到最後一個,繼續取下一個
MOV R7, #0X00 ; 如果已經取過所有數,則重新開始去第一個數
MOV DPTR, #TABLE
SJMP LOOP
NEXT: INC DPTR ; 指針寄存器加1
SJMP LOOP ; 循環顯示
DELAY: MOV R1, #0XC8 ; 延時20MS
DL2: MOV R2, #0X18
DL1: NOP
NOP
DJNZ R2, DL1
DJNZ R1, DL2
RET
EXTDELAY: ACALL DELAY
DJNZ R3 ,EXTDELAY
RET
TABLE: ; 相對地址
DB 0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F ;十六進制字形數據
0 1 2 3 4 5 6 7 8 9 (十六進制數)
DB 0X77,0X7C,0X39,0X5E,0X79,0X71 ; 十六進制字形數據
A B C D E F (十六進制數)
END

ORG 0X00
LJMP START
ORG 0X30
START: MOV SP, #30H
MOV A, #0XFE ; 置A寄存器為0XFE
MOV DPTR, #TABLE
MOV R7, #0X00
LOOP: MOV P1, A ; 在數碼管的第0位顯示
MOV R4,A ; 保存A寄存器的制
CLR A
MOVC A, @A+DPTR
MOV P0, A
MOV A, R4 ; 還原A寄存器的值
CJNE A, #0XBF, SKIP ; 如果已在第五位顯示,那麼下一次
MOV A, #0XFE ; 從第0位開始顯示
SJMP LOOP ; 跳回執行下一次顯示
SKIP: RL A ; A左移一位,下一次在數碼管的下一位顯示數字
INC R7
MOV R3, #0X5C
ACALL EXTDELAY
CJNE R7, #0X10, NEXT ; 如果TABLE中數未取到最後一個,繼續取下一個
MOV R7, #0X00 ; 如果已經取過所有數,則重新開始去第一個數
MOV DPTR, #TABLE
SJMP LOOP
NEXT: INC DPTR ; 指針寄存器加1
SJMP LOOP ; 循環顯示
DELAY: MOV R1, #0XC8 ; 延時20MS
DL2: MOV R2, #0X18
DL1: NOP
NOP
DJNZ R2, DL1
DJNZ R1, DL2
RET
EXTDELAY: ACALL DELAY
DJNZ R3, EXTDELAY
RET
TABLE: ; 相對地址
DB 0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F ;十六進制字形數據
0 1 2 3 4 5 6 7 8 9 (十六進制數)
DB 0X77,0X7C,0X39,0X5E,0X79,0X71 ; 十六進制字形數據
A B C D E F (十六進制數)
END

閱讀全文

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

熱點內容
cf蘋果區打安卓區有延遲怎麼辦 瀏覽:754
數據和演算法的區別 瀏覽:459
單片機實現無線通信 瀏覽:556
往復壓縮機氣閥工作原理 瀏覽:264
怎麼把安卓微信記錄轉移到ios 瀏覽:790
程序員編程用電腦 瀏覽:545
ios點開文件夾背景不透明了 瀏覽:667
python中如何創建一個文件夾 瀏覽:317
android打開scheme 瀏覽:333
單片機如何撤銷中斷請求指標 瀏覽:666
滴滴加油怎麼在ApP打發票 瀏覽:21
資料庫文件夾許可權設置 瀏覽:782
保定哪裡能辦理車輛解壓 瀏覽:358
怎麼打開解壓圖片文件 瀏覽:140
語聲直播源碼大全 瀏覽:226
程序員第一次做蛋炒飯 瀏覽:635
伺服器雲路由 瀏覽:148
開發什麼app最好 瀏覽:483
linux調用c靜態庫 瀏覽:719
公司核心程序員離職 瀏覽:194