① 基於單片機的數字時鍾設計開題報告
//我這里有一個定時的鬧鍾,你把蜂鳴器的中斷改為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