導航:首頁 > 操作系統 > 單片機數字鍾設計報告

單片機數字鍾設計報告

發布時間:2025-09-11 13:46:37

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

//我這里有一個定時的鬧鍾,你把蜂鳴器的中斷改為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;

}

}

}

}

『貳』 單片機數字時鍾設計

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

『叄』 基於單片機的數字時鍾設計方案

數字鍾〔★〕這里用了兩種編租肆寫方法(即匯編語言與C語言)
(1. 開機時,顯示12:00:00的時間開始計時;
(2. P0.0/AD0控制「秒」的調整,每按一次加1秒;
(3. P0.1/AD1控制「分」的調整,每按一次加1分;
(4. P0.2/AD2控制「時」的調整,每按一次加1個小時;
2. 電路原理圖

3. 系統板上硬體連線
(1. 把「單片機系統」區域中的P1.0-P1.7埠用8芯排線連接到「動態數碼顯示」區域中的A-H埠上;
(2. 把「單片機系統:區域中的P3.0-P3.7埠用8芯排線連接到「動態數碼顯示」區域中的S1-S8埠上;
(3. 把「單片陵型碧機系統」區域中的P0.0/AD0、P0.1/AD1、P0.2/AD2埠分別用導線連接到「獨立式鍵盤」區域中尺舉的SP3、SP2、SP1埠上;
4. 相關基本知識
(1. 動態數碼顯示的方法
(2. 獨立式按鍵識別過程
(3. 「時」,「分」,「秒」數據送出顯示處理方法
5. 程序框圖
6. 匯編源程序
SECOND EQU 30H
MINITE EQU 31H
HOUR EQU 32H
HOURK BIT P0.0
MINITEK BIT P0.1
SECONDK BIT P0.2
DISPBUF EQU 40H
DISPBIT EQU 48H
T2SCNTA EQU 49H
T2SCNTB EQU 4AH
TEMP EQU 4BH
ORG 00H
LJMP START
ORG 0BH
LJMP INT_T0
START: MOV SECOND,#00H
MOV MINITE,#00H
MOV HOUR,#12
MOV DISPBIT,#00H
MOV T2SCNTA,#00H
MOV T2SCNTB,#00H
MOV TEMP,#0FEH
LCALL DISP
MOV TMOD,#01H
MOV TH0,#(65536-2000) / 256
MOV TL0,#(65536-2000) MOD 256
SETB TR0
SETB ET0
SETB EA
WT: JB SECONDK,NK1
LCALL DELY10MS
JB SECONDK,NK1
INC SECOND
MOV A,SECOND
CJNE A,#60,NS60
MOV SECOND,#00H
NS60: LCALL DISP
JNB SECONDK,$
NK1: JB MINITEK,NK2
LCALL DELY10MS
JB MINITEK,NK2
INC MINITE
MOV A,MINITE
CJNE A,#60,NM60
MOV MINITE,#00H
NM60: LCALL DISP
JNB MINITEK,$
NK2: JB HOURK,NK3
LCALL DELY10MS
JB HOURK,NK3
INC HOUR
MOV A,HOUR
CJNE A,#24,NH24
MOV HOUR,#00H
NH24: LCALL DISP
JNB HOURK,$
NK3: LJMP WT
DELY10MS:
MOV R6,#10
D1: MOV R7,#248
DJNZ R7,$
DJNZ R6,D1
RET
DISP:
MOV A,#DISPBUF
ADD A,#8
DEC A
MOV R1,A
MOV A,HOUR
MOV B,#10
DIV AB
MOV @R1,A
DEC R1
MOV A,B
MOV @R1,A
DEC R1
MOV A,#10
MOV @R1,A
DEC R1
MOV A,MINITE
MOV B,#10
DIV AB
MOV @R1,A
DEC R1
MOV A,B
MOV @R1,A
DEC R1
MOV A,#10
MOV @R1,A
DEC R1
MOV A,SECOND
MOV B,#10
DIV AB
MOV @R1,A
DEC R1
MOV A,B
MOV @R1,A
DEC R1
RET
INT_T0:
MOV TH0,#(65536-2000) / 256
MOV TL0,#(65536-2000) MOD 256
MOV A,#DISPBUF
ADD A,DISPBIT
MOV R0,A
MOV A,@R0
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV P1,A
MOV A,DISPBIT
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV P3,A
INC DISPBIT
MOV A,DISPBIT
CJNE A,#08H,KNA
MOV DISPBIT,#00H
KNA: INC T2SCNTA
MOV A,T2SCNTA
CJNE A,#100,DONE
MOV T2SCNTA,#00H
INC T2SCNTB
MOV A,T2SCNTB
CJNE A,#05H,DONE
MOV T2SCNTB,#00H
INC SECOND
MOV A,SECOND
CJNE A,#60,NEXT
MOV SECOND,#00H
INC MINITE
MOV A,MINITE
CJNE A,#60,NEXT
MOV MINITE,#00H
INC HOUR
MOV A,HOUR
CJNE A,#24,NEXT
MOV HOUR,#00H
NEXT: LCALL DISP
DONE: RETI
TABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,40H
TAB: DB 0FEH,0FDH,0FBH,0F7H,0EFH,0DFH,0BFH,07FH
END

7. C語言源程序
#include <AT89X51.H>
unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,0x00};
unsigned char dispbitcode[]={0xfe,0xfd,0xfb,0xf7,
0xef,0xdf,0xbf,0x7f};
unsigned char dispbuf[8]={0,0,16,0,0,16,0,0};
unsigned char dispbitcnt;
unsigned char second;
unsigned char minite;
unsigned char hour;
unsigned int tcnt;
unsigned char mstcnt;
unsigned char i,j;
void main(void)
{
TMOD=0x02;
TH0=0x06;
TL0=0x06;
TR0=1;
ET0=1;
EA=1;
while(1)
{
if(P0_0==0)
{
for(i=5;i>0;i--)
for(j=248;j>0;j--);
if(P0_0==0)
{
second++;
if(second==60)
{
second=0;
}
dispbuf[0]=second%10;
dispbuf[1]=second/10;
while(P0_0==0);
}
}
if(P0_1==0)
{
for(i=5;i>0;i--)
for(j=248;j>0;j--);
if(P0_1==0)
{
minite++;
if(minite==60)
{
minite=0;
}
dispbuf[3]=minite%10;
dispbuf[4]=minite/10;
while(P0_1==0);
}
}
if(P0_2==0)
{
for(i=5;i>0;i--)
for(j=248;j>0;j--);
if(P0_2==0)
{
hour++;
if(hour==24)
{
hour=0;
}
dispbuf[6]=hour%10;
dispbuf[7]=hour/10;
while(P0_2==0);
}
}
}
}
void t0(void) interrupt 1 using 0
{
mstcnt++;
if(mstcnt==8)
{
mstcnt=0;
P1=dispcode[dispbuf[dispbitcnt]];
P3=dispbitcode[dispbitcnt];
dispbitcnt++;
if(dispbitcnt==8)
{
dispbitcnt=0;
}
}
tcnt++;
if(tcnt==4000)
{
tcnt=0;
second++;
if(second==60)
{
second=0;
minite++;
if(minite==60)
{
minite=0;
hour++;
if(hour==24)
{
hour=0;
}
}
}
dispbuf[0]=second%10;
dispbuf[1]=second/10;
dispbuf[3]=minite%10;
dispbuf[4]=minite/10;
dispbuf[6]=hour%10;
dispbuf[7]=hour/10;
}

閱讀全文

與單片機數字鍾設計報告相關的資料

熱點內容
穿越到大學前前世是普通程序員 瀏覽:114
電腦如何連接學校伺服器地址 瀏覽:935
乘11的簡便演算法 瀏覽:44
資料庫工程師pdf 瀏覽:136
程序員圍觀圖 瀏覽:423
如何升安卓110系統 瀏覽:592
python求文本的平均列數 瀏覽:309
烏鴉喝水app怎麼做 瀏覽:799
貝爾編程好吧6圖4 瀏覽:910
admobsdkandroid 瀏覽:208
雲電腦架設伺服器 瀏覽:856
android淘寶第三方登錄介面開發 瀏覽:536
國內低價雲伺服器申請注冊 瀏覽:927
電腦能直接解壓文件嗎 瀏覽:40
word轉pdf超鏈接 瀏覽:596
哪家公司做直播網站源碼比較好 瀏覽:246
python如何將列表中的數取出來 瀏覽:663
登陸谷歌的網路連接到伺服器地址 瀏覽:24
情人節程序員代碼表白 瀏覽:897
單片機數字鍾設計報告 瀏覽:526