導航:首頁 > 操作系統 > 基於單片機的數字鍾畢業設計

基於單片機的數字鍾畢業設計

發布時間:2023-05-13 21:52:22

『壹』 51單片機做數字電子鍾

這么復雜的東西給這么少分 暈死了 你也太小氣了吧,分多的話還可能幫你動動腦

『貳』 51單片機控制的電子時鍾系統 畢業設計

可以用1302做
我有現成的
LCD1602
顯示的,51做的
基本思路是用單片機讀取1302裡面的信息,處理,然後送LCD1602顯示。
有興趣可以去我博客看,裡面還上傳了之前我做的實物圖片和PCB,可以照著做。

『叄』 單片機電子時鍾設計

#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>#define INT8U unsigned char
#define INT16U unsigned int
#define k1() ((PIND & (1<<PD0))==0x00)
#define k2() ((PIND & (1<<PD1))==0x00)
#define k3() ((PIND & (1<<PD2))==0x00)
#define k4() ((PIND & (1<<PD3))==0x00)
#define k5() ((PIND & (1<<PD4))==0x00)
#define k6() ((PIND & (1<<PD5))==0x00)
#define k7() ((PIND & (1<<PD6))==0x00)
#define k8() ((PIND & (1<<PD7))==0x00)const INT8U seg[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00};
INT8U seg11[]={0,0,0x40,0,0,0x40,0,0};
INT8U ja;
INT8U key=0xff;
INT8U h,m,s,m1,d;
INT16U y; void hour1()
{
if (++h>23) {h=0;day();}
seg11[0]=seg[h/10];
seg11[1]=seg[h%10];
} void minute1()
{
if (++m>59)
{m=0;<br> hour1();<br> }
seg11[3]=seg[m/10];
seg11[4]=seg[m%10];
} void second1() {
if (++s>59)
{ s=0;
minute1();
}
seg11[6]=seg[s/10];
seg11[7]=seg[s%10];
} const INT8U Days1[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
const INT8U Days2[]={0,31,29,31,30,31,30,31,31,30,31,30,31};
void year()
{if (++y>9999) y=0;<br> <br> seg11[0]=seg[y/1000];<br> seg11[1]=seg[y%1000/100];<br> seg11[2]=seg[y%100/10];<br> seg11[3]=seg[y%10];<br> } void month1()
{
if (++m1>12)
{m1=0;<br> year();<br> }
seg11[4]=seg[m1/10];
seg11[5]=seg[m1%10];
} void day()
{ INT8U DAY;
DAY=(( y%4==0 && y%100!=0 )||( y%400==0 ) ) ? Days1[m1]:Days2[m1];//判斷閏年
if(++d>DAY)

{ d=0;
month1();

}
seg11[6]=seg[d/10];
seg11[7]=seg[d%10];
} //時間函數
void time()
{
seg11[0]=seg[h/10];
seg11[1]=seg[h%10];
seg11[3]=seg[m/10];
seg11[4]=seg[m%10];
seg11[6]=seg[s/10];
seg11[7]=seg[s%10];
PORTA=0x00;
PORTA=seg11[ja]; PORTB=~(1<<ja);
ja=(ja+1)&0x07;
_delay_ms(5); }
//日期
void date()
{ seg11[0]=seg[y/1000];
seg11[1]=seg[y%1000/100];
seg11[2]=seg[y%100/10];
seg11[3]=seg[y%10];

seg11[4]=seg[m1/10];
seg11[5]=seg[m1%10];
seg11[6]=seg[d/10];
seg11[7]=seg[d%10];
//seg11[2]=seg11[5]=0x00;
PORTA=0x00;
PORTA=seg11[ja];
PORTB=~(1<<ja);
ja=(ja+1)&0x07;
_delay_ms(3);
}
int main()
{ INT8U ja=0;
DDRA=0xff; PORTA=0xff;
DDRB=0xff; PORTB=0xff;
DDRD=0x00; PORTD=0xff;PIND=0x00;

MCUCR=0X0A;//MCU 控制寄存器- MCUCR
GICR=0XC0; //通用中斷控制寄存器- GICR ASSR=0x08;
TCCR2=0x04;
TCNT2=0;
TIMSK=_BV(TOIE2)|_BV(TOIE0); d=26;y=2000;m1=2;
h=m=s=12;
sei();
while(1)
{ time();

if(k1())
/{ while(k1()); hour1(); }

if(k8())
{ while(k8());

while(2)//日期循環
{

date();
if(k8())
{while(k8());break;} }
}
}}
ISR(TIMER2_OVF_vect) {
if( seg11[2]==0x40)
{
seg11[2]=seg11[5]=0x00;
}

else
{ seg11[2]=seg11[5]=0x40;
second1();
}
}

『肆』 單片機實現電子鍾設計

你的分數給的太低了,沒有人願意為幫忙,這也從側面看出你根本就沒有學習過單片機,那麼這畢業設計就沒有多大意義,還不如去看看某些關於單片機應用設計的教材,那上面的例子都是很詳細的,並且有源代碼。

如果要簡單,DS12C887+AT89S52+LCD1602就足夠了,匯編代碼的長度不會超過200行。

『伍』 基於單片機的電子時鍾

首先,硬體的選取:
1,單片機,其控制系統不算復雜,使用簡單的8位機即可,然後就是時鍾的選擇,本設計基於其實時性要求不高,所以時鍾盡量選擇低一點,可以用3M、6M的時鍾,因為時鍾選擇越高其單片機的功耗就越大,甚至出現超頻現象(不過現在的單片機時鍾一般都能達到50M了)!
2,顯示部分,根據本常式的要求,可以選用6個8位數碼管進行顯示。
3,驅動電路,數碼管驅動晶元有很多,常見的有串列通信的如74LS164、74HC595、SM1617等常用LED串列驅動晶元。
4,時鍾晶元的選擇,單片機上面有定時器,但是實現長時間的定時必定不準確,誤差很大,還得經常對時,所以建議你選用一款時鍾晶元,常用的DS1302等。
5,用戶界面,你就用幾個按鍵實現用戶操作就行了。
軟體:首先顯示部分的變成,在網上有很多常式,你只需要簡單的移植就可以使用了,時鍾晶元DS1302典型的IIC匯流排驅動模式,你可以使用單片機中IIC外設來訪問,按鍵部分使用掃描和外部中斷都可!
自己動手豐衣足食,寫了這么多,希望對你有用,加油

『陸』 基於單片機的數字鍾 論文設計

ORG 0000H ;程序入口地址
LJMP START
ORG 000BH ;定時器0中斷入口地址
LJMP TIMER_0
ORG 0300H
/*****程序開始,初始化*****/
START:
SETB 48H ;使用一個bit位用於調時閃爍標志
SETB 47H ;使用一個bit位用於產生脈沖用於調時快進時基
MOV R1,#0 ;調整選擇鍵功能標志:0正常走時、1調時、2調分、3調秒
MOV 20H,#00H ;用於控制秒基準時鍾源的產生
MOV 21H,#00H ;清零秒寄存器
MOV 22H,#00H ;清零分寄存器
MOV 23H,#00H ;清零時寄存器
MOV 24H,#00H ;用於控制調時閃爍的基準時鍾的產生

MOV IP,#02H ;IP,IE初始化
MOV IE,#82H
MOV TMOD,#01H ;設定定時器0工作方式1
MOV TH0,#3CH
MOV TL0,#0B0H ;賦定時初值,定時50ms
SETB TR0 ;啟動定時器0
MOV SP,#40H ;重設堆棧指針
/*****主程序*****/
MAIN:
LCALL DISPLAY ;調用顯示子程序
LCALL KEY_SCAN ;調用按鍵檢測子程序
JZ MAIN ;無鍵按下則返回重新循環
LCALL SET_KEY ;調用選擇鍵處理子程序
JB 46H,MAIN ;如果已進行長按調整(調時快進),則不再執行下面的單步調整
LCALL ADD_KEY ;調用增加鍵處理子程序,加一
LCALL DEC_KEY ;調用減少鍵處理子程序,減一
LJMP MAIN ;重新循環

/*****定時器中斷服務程序*****/
TIMER_0:
PUSH ACC
PUSH PSW ;保護現場
MOV TH0,#3CH
MOV TL0,#0B0H ;重新賦定時初值
CPL 47H ;產生脈沖用於調時快進時基
INC 24H
MOV A,24H
CJNE A,#10,ADD_TIME ;產生0.5秒基準時鍾,用於調時閃爍
CPL 48H ;取反調時閃爍標志位
MOV 24H,#00H
ADD_TIME: ;走時
INC 20H
MOV A,20H
CJNE A,#20,RETI1 ;產生1秒基準時鍾
MOV 20H,#00H ;一秒鍾時間到,清零20H
MOV A,21H
ADD A,#01H
DA A ;作十進制調整
MOV 21H,A
CJNE A,#60H,RETI1
MOV 21H,#00H ;一分鍾到
MOV A,22H
ADD A,#01H
DA A
MOV 22H,A
CJNE A,#60H,RETI1
MOV 22H,#00H ;一小時到
MOV A,23H
ADD A,#01H
DA A
MOV 23H,A
CJNE A,#24H,RETI1
MOV 23H,#00H ;到24點,清零小時

RETI1:
POP PSW
POP ACC ;恢復現場
RETI ;中斷返回
/*****顯示處理*****/
DISPLAY:
MOV A,21H ;秒
ANL A,#0FH
MOV 2FH,A ;轉換出秒個位,存入2FH
MOV A,21H
ANL A,#0F0H
SWAP A
MOV 2EH,A ;轉換出秒十位,存入2EH
JB 46H,MIN ;如果長按按鍵(調時快進),則跳過閃爍處理程序
CJNE R1,#3,MIN ;如果R1為3,閃爍秒位待調整
JB 48H,MIN
MOV 2FH,#0AH ;使該位為10,查表得到使該位不顯示的輸出
MOV 2EH,#0AH
MIN:
MOV A,22H ;分
ANL A,#0FH
MOV 2DH,A ;轉換出分個位,存入2DH
MOV A,22H
ANL A,#0F0H
SWAP A
MOV 2CH,A ;轉換出分十位,存入2CH
JB 46H,HOUR ;如果長按按鍵(調時快進),則跳過閃爍處理程序
CJNE R1,#2,HOUR ;如果R1為2,閃爍分位待調整
JB 48H,HOUR
MOV 2DH,#0AH ;使該位為10,查表得到使該位不顯示的輸出
MOV 2CH,#0AH
HOUR:
MOV A,23H ;時
ANL A,#0FH
MOV 2BH,A ;轉換出時個位,存入2BH
MOV A,23H
ANL A,#0F0H
SWAP A
MOV 2AH,A ;轉換出時十位,存入2AH
JB 46H,DISP ;如果長按按鍵(調時快進),則跳過閃爍處理程序
CJNE R1,#1,DISP ;如果R1為1,閃爍時位待調整
JB 48H,DISP
MOV 2BH,#0AH ;使該位為10,查表得到使該位不顯示的輸出
MOV 2AH,#0AH
/*****數碼管動態掃描顯示*****/
DISP:
MOV DPTR,#TABLE
MOV A,2FH
MOVC A,@A+DPTR
MOV P0,A
setb P2.7
LCALL DELAY
clr P2.7 ;顯示秒個位
MOV A,2EH
MOVC A,@A+DPTR
MOV P0,A
setb P2.6
LCALL DELAY
clr P2.6 ;顯示秒十位
MOV A,#0BFH
MOV P0,A
setb P2.5
LCALL DELAY
clr P2.5 ;顯示"-"
MOV A,2DH
MOVC A,@A+DPTR
MOV P0,A
setb P2.4
LCALL DELAY
clr P2.4 ;顯示分個位
MOV A,2CH
MOVC A,@A+DPTR
MOV P0,A
setb P2.3
LCALL DELAY
clr P2.3 ;顯示分十位
MOV A,#0BFH
MOV P0,A
setb P2.2
LCALL DELAY
clr P2.2 ;顯示"-"
MOV A,2BH
MOVC A,@A+DPTR
MOV P0,A
setb P2.1
LCALL DELAY
clr P2.1 ;顯示時個位
MOV DPTR,#TABLE1 ;該位使用TABLE1以消除前置0
MOV A,2AH
MOVC A,@A+DPTR
MOV P0,A
setb P2.0
LCALL DELAY
clr P2.0 ;顯示時十位
RET

/*****按鍵檢測子程序*****/
KEY_SCAN:
CLR 46H ;關閉長按調整(調時快進)標志
MOV P1,#0FFH ;將P1口設置成輸入狀態
MOV A,P1
CPL A
ANL A,#07H ;P1口低3位連接3個按鍵,只判斷該3位
JZ EXIT_KEY ;無鍵按下則返回
LCALL DELAY ;延時去抖動
MOV A,P1 ;重新判斷
CPL A
ANL A,#07H
JZ EXIT_KEY ;鍵盤去抖動
MOV R5,A ;臨時將鍵值存入R5
MOV R4,#00H ;用於控制調時快進速度
;設置為00H是為了在進入長按處理前加長延時區分用戶的長按與短按,防止誤快進

LOOP: ;進入長按處理
LCALL DISPLAY ;使長按時顯示正常
MOV A,P1
CPL A
ANL A,#07H
JB 47H,LOOP1
INC R4 ;調時快進間隔時間基準加1
LOOP1:
CJNE R1,#03H,LOOP2 ;如果調秒時長按,則不處理
LJMP LOOP3
LOOP2:
CJNE R4,#99H,LOOP3
MOV R4,#70H ;確認用戶長按後,重新設定起始值,加快調時快進速度
SETB 46H ;長按調整(調時快進)標志
LCALL ADD_KEY
LCALL DEC_KEY
LOOP3:
JNZ LOOP ;等待鍵釋放
MOV A,R5 ;輸出鍵值
RET
EXIT_KEY:
RET
/*****延時子程序*****/
DELAY:
MOV R7,#150
DJNZ R7,$
RET

/*****選擇鍵處理子程序*****/
SET_KEY:
CJNE R5,#01H,EXIT ;選擇鍵鍵值
INC R1 ;調整選擇功能標志加一
CJNE R1,#4,EXIT
MOV R1,#0
MOV 24H,#00H ;調時閃爍基準清零
RET
/*****增加鍵處理子程序*****/
ADD_KEY:
CJNE R5,#02H,EXIT ;增加鍵鍵值
CJNE R1,#01H,NEXT1 ;選擇鍵功能標志為1,調時,否則跳出
MOV A,23H
ADD A,#01H
DA A
MOV 23H,A
CJNE A,#24H,EXIT
MOV 23H,#00H
NEXT1:
CJNE R1,#02H,NEXT2 ;選擇鍵功能標志為2,調分,否則跳出
MOV A,22H
ADD A,#01H
DA A
MOV 22H,A
CJNE A,#60H,EXIT
MOV 22H,#00H
NEXT2:
CJNE R1,#03H,EXIT ;選擇鍵功能標志為3,調秒,否則跳出
MOV 21H,#00H ;如增加鍵按下直接清零秒
RET
/*****減少鍵處理子程序*****/
DEC_KEY:
CJNE R5,#04H,EXIT ;減少鍵鍵值
CJNE R1,#01H,NEXT3 ;選擇鍵功能標志為1,調時,否則跳出
MOV A,23H
ADD A,#99H
DA A
MOV 23H,A
CJNE A,#99H,EXIT
MOV 23H,#23H

NEXT3:
CJNE R1,#02H,NEXT4 ;選擇鍵功能標志為2,調分,否則跳出
MOV A,22H
ADD A,#99H
DA A
MOV 22H,A
CJNE A,#99H,EXIT
MOV 22H,#59H
NEXT4:
CJNE R1,#03H,EXIT ;選擇鍵功能標志為3,調秒,否則跳出
MOV 21H,#00H ;如較少鍵按下直接清零秒
RET
/*****萬用返回子程序*****/
EXIT:
RET
/*****數碼管字形編碼表*****/
TABLE:
DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH ;字形顯示編碼
TABLE1:
DB 0FFH,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH ;小時位的十位數編碼,該位如果為0則不顯示
END ;程序結束

『柒』 單片機數字鍾設計畢業設計論文

^_^,你找錯地方了

要思路大家可以給

但要擾棗猜原原本本的論文,程序,你給10000分大家都不願意

畢業設計是一個學習總緩型結的過程
之前也許很多東西沒有學好,那不要悔恨了,不過現在就再也
不要錯過這個好的學習機會岩簡了

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

數字鍾〔★〕這里用了兩種編租肆寫方法(即匯編語言與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;
}

『玖』 用單片機設計一個數字時鍾

#include <REG51.H>#include <intrins.h> #define uint unsigned int#define uchar unsigned charsbit DS1302_CLK = P1^7; //實時時鍾時鍾線引腳 sbit DS1302_IO = P1^6; //實時時鍾數據線引腳 sbit DS1302_RST = P1^5; //實時時鍾復位線引腳sbit wireless_1 = P3^0;sbit wireless_2 = P3^1;sbit wireless_3 = P3^2;sbit wireless_4 = P3^3; //無線控制sbit ACC0 = ACC^0;sbit ACC7 = ACC^7;char hide_sec,hide_min,hide_hour,hide_day,hide_week,hide_month,hide_year; //秒,分,時到日,月,年位閃的計數sbit Set = P2^0; //模式切換鍵sbit Up = P2^1; //加法按鈕sbit Down = P2^2; //減法按鈕sbit out = P2^3; //立刻跳出調整模式按鈕sbit DQ = P1^0; //溫度傳送數據IO口char done,count,temp,flag,up_flag,down_flag;uchar temp_value; //溫度值uchar TempBuffer[5],week_value[2]; void show_time(); //液晶顯示程序/***********1602液晶顯示部分子程序****************///Port Definitions**********************************************************sbit LcdRs = P2^5;sbit LcdRw = P2^6;sbit LcdEn = P2^7;sfr DBPort = 0x80; //P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.數據埠 //內部等待函數**************************************************************************unsigned char LCD_Wait(void){ LcdRs=0; LcdRw=1; _nop_(); LcdEn=1; _nop_(); LcdEn=0; return DBPort; }//向LCD寫入命令或數據************************************************************#define LCD_COMMAND 0 // Command#define LCD_DATA 1 // Data#define LCD_CLEAR_SCREEN 0x01 // 清屏#define LCD_HOMING 0x02 // 游標返回原點void LCD_Write(bit style, unsigned char input){ LcdEn=0; LcdRs=style; LcdRw=0; _nop_(); DBPort=input; _nop_();//注意順序 LcdEn=1; _nop_();//注意順序 LcdEn=0; _nop_(); LCD_Wait(); } //設置顯示模式************************************************************#define LCD_SHOW 0x04 //顯示開#define LCD_HIDE 0x00 //顯示關 #define LCD_CURSOR 0x02 //顯示游標#define LCD_NO_CURSOR 0x00 //無游標 #define LCD_FLASH 0x01 //游標閃動#define LCD_NO_FLASH 0x00 //游標不閃動 void LCD_SetDisplay(unsigned char DisplayMode){ LCD_Write(LCD_COMMAND, 0x08|DisplayMode); } //設置輸入模式************************************************************#define LCD_AC_UP 0x02#define LCD_AC_DOWN 0x00 // default #define LCD_MOVE 0x01 // 畫面可平移#define LCD_NO_MOVE 0x00 //default void LCD_SetInput(unsigned char InputMode){ LCD_Write(LCD_COMMAND, 0x04|InputMode);} //初始化LCD************************************void LCD_Initial(){ LcdEn=0; LCD_Write(LCD_COMMAND,0x38); //8位數據埠,2行顯示,5*7點陣 LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR); //開啟顯示, 無游標 LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); //清屏 LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE); //AC遞增, 畫面不動} //液晶字元輸入的位置************************void GotoXY(unsigned char x, unsigned char y){ if(y==0) LCD_Write(LCD_COMMAND,0x80|x); if(y==1) LCD_Write(LCD_COMMAND,0x80|(x-0x40));} //將字元輸出到液晶顯示void Print(unsigned char *str){ while(*str!='\0') { LCD_Write(LCD_DATA,*str); str++; }} /***********DS1302時鍾部分子程序******************/typedef struct __SYSTEMTIME__{ unsigned char Second; unsigned char Minute; unsigned char Hour; unsigned char Week; unsigned char Day; unsigned char Month; unsigned char Year; unsigned char DateString[11]; unsigned char TimeString[9];}SYSTEMTIME; //定義的時間類型SYSTEMTIME CurrentTime; #define AM(X) X#define PM(X) (X+12) // 轉成24小時制#define DS1302_SECOND 0x80 //時鍾晶元的寄存器位置,存放時間#define DS1302_MINUTE 0x82#define DS1302_HOUR 0x84 #define DS1302_WEEK 0x8A#define DS1302_DAY 0x86#define DS1302_MONTH 0x88#define DS1302_YEAR 0x8C void DS1302InputByte(unsigned char d) //實時時鍾寫入一位元組(內部函數){ unsigned char i; ACC = d; for(i=8; i>0; i--) { DS1302_IO = ACC0; //相當於匯編中的 RRC DS1302_CLK = 1; DS1302_CLK = 0; ACC = ACC >> 1; } } unsigned char DS1302OutputByte(void) //實時時鍾讀取一位元組(內部函數){ unsigned char i; for(i=8; i>0; i--) { ACC = ACC >>1; //相當於匯編中的 RRC ACC7 = DS1302_IO; DS1302_CLK = 1; DS1302_CLK = 0; } return(ACC); } void Write1302(unsigned char ucAddr, unsigned char ucDa) //ucAddr: DS1302地址, ucData: 要寫的數據{ DS1302_RST = 0; DS1302_CLK = 0; DS1302_RST = 1; DS1302InputByte(ucAddr); // 地址,命令 DS1302InputByte(ucDa); // 寫1Byte數據 DS1302_CLK = 1; DS1302_RST = 0;} unsigned char Read1302(unsigned char ucAddr) //讀取DS1302某地址的數據{ unsigned char ucData; DS1302_RST = 0; DS1302_CLK = 0; DS1302_RST = 1; DS1302InputByte(ucAddr|0x01); // 地址,命令 ucData = DS1302OutputByte(); // 讀1Byte數據 DS1302_CLK = 1; DS1302_RST = 0; return(ucData);} void DS1302_GetTime(SYSTEMTIME *Time) //獲取時鍾晶元的時鍾數據到自定義的結構型數組{ unsigned char ReadValue; ReadValue = Read1302(DS1302_SECOND); Time->Second = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); ReadValue = Read1302(DS1302_MINUTE); Time->Minute = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); ReadValue = Read1302(DS1302_HOUR); Time->Hour = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); ReadValue = Read1302(DS1302_DAY); Time->Day = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); ReadValue = Read1302(DS1302_WEEK); Time->Week = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); ReadValue = Read1302(DS1302_MONTH); Time->Month = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); ReadValue = Read1302(DS1302_YEAR); Time->Year = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); } void DateToStr(SYSTEMTIME *Time) //將時間年,月,日,星期數據轉換成液晶顯示字元串,放到數組里DateString[]{ if(hide_year<2) //這里的if,else語句都是判斷位閃爍,<2顯示數據,>2就不顯示,輸出字元串為 2007/07/22 { Time->DateString[0] = '2'; Time->DateString[1] = '0'; Time->DateString[2] = Time->Year/10 + '0'; Time->DateString[3] = Time->Year%10 + '0'; } else { Time->DateString[0] = ' '; Time->DateString[1] = ' '; Time->DateString[2] = ' '; Time->DateString[3] = ' '; } Time->DateString[4] = '/'; if(hide_month<2) { Time->DateString[5] = Time->Month/10 + '0'; Time->DateString[6] = Time->Month%10 + '0'; } else { Time->DateString[5] = ' '; Time->DateString[6] = ' '; } Time->DateString[7] = '/'; if(hide_day<2) { Time->DateString[8] = Time->Day/10 + '0'; Time->DateString[9] = Time->Day%10 + '0'; } else { Time->DateString[8] = ' '; Time->DateString[9] = ' '; } if(hide_week<2) { week_value[0] = Time->Week%10 + '0'; //星期的數據另外放到 week_value[]數組里,跟年,月,日的分開存放,因為等一下要在最後顯示 } else { week_value[0] = ' '; } week_value[1] = '\0'; Time->DateString[10] = '\0'; //字元串末尾加 '\0' ,判斷結束字元} void TimeToStr(SYSTEMTIME *Time) //將時,分,秒數據轉換成液晶顯示字元放到數組 TimeString[];{ if(hide_hour<2) { Time->TimeString[0] = Time->Hour/10 + '0'; Time->TimeString[1] = Time->Hour%10 + '0'; } else { Time->TimeString[0] = ' '; Time->TimeString[1] = ' '; } Time->TimeString[2] = ':'; if(hide_min<2) { Time->TimeString[3] = Time->Minute/10 + '0'; Time->TimeString[4] = Time->Minute%10 + '0'; } else { Time->TimeString[3] = ' '; Time->TimeString[4] = ' '; } Time->TimeString[5] = ':'; if(hide_sec<2) { Time->TimeString[6] = Time->Second/10 + '0'; Time->TimeString[7] = Time->Second%10 + '0'; } else { Time->TimeString[6] = ' '; Time->TimeString[7] = ' '; } Time->DateString[8] = '\0';} void Initial_DS1302(void) //時鍾晶元初始化{ unsigned char Second=Read1302(DS1302_SECOND); if(Second&0x80) //判斷時鍾晶元是否關閉 { Write1302(0x8e,0x00); //寫入允許 Write1302(0x8c,0x07); //以下寫入初始化時間 日期:07/07/25.星期: 3. 時間: 23:59:55 Write1302(0x88,0x07); Write1302(0x86,0x25); Write1302(0x8a,0x07); Write1302(0x84,0x23); Write1302(0x82,0x59); Write1302(0x80,0x55); Write1302(0x8e,0x80); //禁止寫入 } } /***********ds18b20子程序*************************/ /***********ds18b20延遲子函數(晶振12MHz )*******/ void delay_18B20(unsigned int i){ while(i--);} /**********ds18b20初始化函數**********************/ void Init_DS18B20(void) { unsigned char x=0; DQ = 1; //DQ復位 delay_18B20(8); //稍做延時 DQ = 0; //單片機將DQ拉低 delay_18B20(80); //精確延時 大於 480us DQ = 1; //拉高匯流排 delay_18B20(14); x=DQ; //稍做延時後 如果x=0則初始化成功 x=1則初始化失敗 delay_18B20(20);} /***********ds18b20讀一個位元組**************/ unsigned char ReadOneChar(void){ uchar i=0; uchar dat = 0; for (i=8;i>0;i--) { DQ = 0; // 給脈沖信號 dat>>=1; DQ = 1; // 給脈沖信號 if(DQ) dat|=0x80; delay_18B20(4); } return(dat);} /*************ds18b20寫一個位元組****************/ void WriteOneChar(uchar dat){ unsigned char i=0; for (i=8; i>0; i--) { DQ = 0; DQ = dat&0x01; delay_18B20(5); DQ = 1; dat>>=1; }} /**************讀取ds18b20當前溫度************/ void ReadTemp(void){ unsigned char a=0; unsigned char b=0; unsigned char t=0; Init_DS18B20(); WriteOneChar(0xCC); // 跳過讀序號列號的操作 WriteOneChar(0x44); // 啟動溫度轉換 delay_18B20(100); // this message is wery important Init_DS18B20(); WriteOneChar(0xCC); //跳過讀序號列號的操作 WriteOneChar(0xBE); //讀取溫度寄存器等(共可讀9個寄存器) 前兩個就是溫度 delay_18B20(100); a=ReadOneChar(); //讀取溫度值低位 b=ReadOneChar(); //讀取溫度值高位 temp_value=b<<4; temp_value+=(a&0xf0)>>4; }void temp_to_str() //溫度數據轉換成液晶字元顯示{ TempBuffer[0]=temp_value/10+'0'; //十位 TempBuffer[1]=temp_value%10+'0'; //個位 TempBuffer[2]=0xdf; //溫度符號 TempBuffer[3]='C'; TempBuffer[4]='\0';}void Delay1ms(unsigned int count){ unsigned int i,j; for(i=0;i<count;i++) for(j=0;j<120;j++);} /*延時子程序*/void mdelay(uint delay){ uint i; for(;delay>0;delay--) {for(i=0;i<62;i++) //1ms延時. {;} }}

『拾』 數字鍾的畢業設計論文

"幸福校園"有不少形式的論文範文,參考一下吧,希望對你可以有所幫助。
引言
隨著科技的進步和社會的發展,單片機技術以迅猛的速度向前發展,它的應用已經滲透到社會的各個領域,本人設計的數字敏神悄鍾是利用單片機做核心元件配合周邊電路橋渣實現數字鍾的功能。
下面分別介紹我們的硬體與軟體,因為硬體是基礎,所以我們先介紹硬體,然後再介紹軟體。由於硬體比較實在,所以介紹的就少點了,軟體介紹的比較多。
然後由於是第一次編瞎碧這么大的程序,肯定會有很讀錯誤和不足之處,還望老師多多指正修改。
第一章 系統分析
數字電子鍾的設計方法有多種,可用中小規模集成電路組成電子鍾;也可以利用專用的電子鍾晶元配以顯示電路及其所需要的外圍電路組成電子鍾;還可以利用單片機來實現電子鍾等等。這些方法都各有優點。利用單片機實現的電子鍾具有編程靈活,便於電子鍾功能的隨時擴充,即可用該電子鍾發出各種控制信號,精確度高等特點。

閱讀全文

與基於單片機的數字鍾畢業設計相關的資料

熱點內容
linuxtrace工具源碼 瀏覽:178
源碼第二次開發 瀏覽:784
如何獲取網頁php源碼 瀏覽:729
還用飛那麼源碼 瀏覽:204
雲伺服器鏡像可以隨時更換嗎 瀏覽:92
r600a壓縮機多少錢 瀏覽:237
程序員那麼可愛第幾集在重慶相遇 瀏覽:673
上班兩公里源碼 瀏覽:817
南寧溯源碼燕窩訂制 瀏覽:933
在個人文件夾中新建文件 瀏覽:445
中國國家地理pdf下載 瀏覽:107
幾套房子抵押可以解壓其中一套嗎 瀏覽:569
微愛app室外地板怎麼裝飾 瀏覽:231
遼寧省醫保如何用app轉 瀏覽:311
鍾表cNc編程招聘 瀏覽:546
均線pdf 瀏覽:921
手機破解加密的壓縮包 瀏覽:429
dnf程序員分析 瀏覽:365
外星人適合編程嗎 瀏覽:205
phpcurl302跳轉 瀏覽:843