導航:首頁 > 編程語言 > 數字電子鍾編程

數字電子鍾編程

發布時間:2022-08-01 20:26:49

1. 51單片機做數字電子鍾

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

2. 用匯編語言編寫一個數字電子鍾程序代碼

data segment
;*****定義please等提示信息*****
str db 20
db 50h,7,0,0
db 6ch,7,0,1
db 65h,7,0,1
db 61h,7,0,1
db 73h,7,0,1
db 65h, 7,0,1
db 70h,7,1,-10
db 72h,7,0,1
db 65h,7,0,1
db 73h,7,0,1
db 73h,7,0,1
db 53h,7,0,2
db 6bh,7,0,2
db 65h,7,0,1
db 79h,7,0,1
db 65h,7,0,2
db 78h,7,0,1
db 69h,7,0,1
db 74h,7,0,1
db 21h,7,0,1
;*****定義0-9十個圖形數字*****
s0 db 6
db 5fh,7,0,0
db 7ch,7,1,-1
db 7ch,7,1,0
db 5fh,7,0,1
db 7ch,7,0,1
db 7ch,7,-1,0
sy db 2
db 7ch,7,1,0
db 7ch,7,1,0
s2 db 5
db 5fh,7,0,0
db 7ch,7,1,1
db 5fh,7,0,-1
db 7ch,7,1,-1
db 5fh,7,0,1
s3 db 5
db 5fh,7,0,0
db 7ch,7,1,1
db 5fh,7,0,-1
db 7ch,7,1,1
db 5fh,7,0,-1
s4 db 4
db 7ch,7,1,0
db 5fh,7,0,1
db 7ch,7,1,1
db 7ch,7,-1,0
s5 db 5
db 5fh,7,0,0
db 7ch,7,1,-1
db 5fh,7,0,1
db 7ch,7,1,1
db 5fh,7,0,-1
s6 db 6
db 5fh,7,0,0
db 7ch,7,1,-1
db 5fh,7,0,1
db 7ch,7,1,1
db 5fh,7,0,-1
db 7ch,7,0,-1
s7 db 3
db 5fh,7,0,0
db 7ch,7,1,1
db 7ch,7,1,0
s8 db 7
db 7ch,7,1,0
db 5fh,7,-1,1
db 7ch,7,1,1
db 5fh,7,0,-1
db 7ch,7,1,1
db 5fh,7,0,-1
db 7ch,7,0,-1
s9 db 6
db 7ch,7,1,0
db 5fh,7,-1,1
db 7ch,7,1,1
db 5fh,7,0,-1
db 7ch,7,1,1
db 5fh,7,0,-1
s11 db 2
db 03h,7,1,0
db 03h,7,1,0

data ends
stack segment
db 200 p (0)
stack ends
code segment
assume cs:code,ss:stack,ds:data

start:
mov ax,data
mov ds,ax
mov ah,0 ;設置顯示方式
mov al,4
int 10h
mov ah,0bh ;置彩色調板
mov bh,0
mov bl,1
int 10h
mov ah,0bh ;置彩色調板
mov bh,1
mov bl,4
int 10h

mov ah,2 ;取系統時間
int 1ah
mov ax,0
mov bx,0
mov ah,ch ;取系統時間
mov al,cl ;保存分鍾
mov bh,dh ;保存秒
mov bl,dl ;保存百分之一秒

tt:
push ax
push bx
mov ah,0
mov al,4
int 10h
mov ah,0bh
mov bh,0
mov bl,1
int 10h
mov ah,0bh
mov bh,1
mov bl,4
int 10h

MOV AH,1 ;讀鍵盤緩沖區字元
INT 16h
JZ ww
MOV AH,8 ;從鍵盤輸入字元
INT 21h
CMP AL,'s' ;輸入s,結束程序
JE tu
ww: pop bx
pop ax

call xian ;調用顯示子程序
push ax

qu: mov ah,2 ;取系統時間
int 1ah
cmp bh,dh
je qu
pop ax
inc bh ;對時間進行加1
cmp bh,100
jl tt
mov bh,0
inc al
call beep
cmp al,100

jl tt
mov al,0
inc ah
cmp ah,24
jl tt
mov ah,0

jmp tt
tu: mov ah,4ch
int 21h
ret
xian proc ;對時間值進行處理並顯示的子程序
push si
push di
push dx
push cx
push bx
push ax
pop ax
push ax
mov bx,ax
mov ax,0
mov al,bh

mov cl,4
shr al,cl
mov bl,al
mov dh,10
mov dl,2
call ff
pop ax
push ax
mov bx,ax
mov ax,0
mov al, bh
and al,0fh
mov bl,al
mov dh,10
mov dl,6
call ff
mov dh,10
mov dl,10
mov bl,10
call ff
pop ax
push ax
mov cl,4
shr al,cl
mov bl,al
mov dh,10
mov dl,14
call ff
pop ax
push ax
and al ,0fh

mov bl,al
mov dh,10
mov dl,18
call ff
mov dh,10
mov dl,22
mov bl,10
call ff
pop ax
pop bx
push bx
push ax

mov ax,0
mov al,bh
mov cl,4
shr al,cl

mov bl,al
mov dh,10
mov dl,26
call ff
pop ax
pop bx
push bx
push ax
mov al,bh
and al,0fh

mov bl,al
mov dh,10
mov dl,30
call ff
mov dh,0
mov dl,15
mov bl,22
call ff
pop ax
pop bx
pop cx
pop dx
pop di
pop si
ret
xian endp
ff proc ;顯示具體數值
push ax
push bx
push cx
push dx

cmp bl,0
je l0
cmp bl,1
je l1
cmp bl,2
je l2
cmp bl,3
je l3
cmp bl,4
je l4
cmp bl,5
je l5
cmp bl,6
je l6
cmp bl,7
je l7
cmp bl,8
je l8
cmp bl,9
je l9
cmp bl,10
je l10
cmp bl,22
je ld
l0: lea di,s0
jmp ty
l1 : lea di,sy
jmp ty
l2: lea di,s2
jmp ty
l3: lea di,s3
jmp ty
l4: lea di,s4
jmp ty
l5: lea di,s5
jmp ty
l6: lea di,s6
jmp ty
l7: lea di,s7
jmp ty
l8: lea di,s8
jmp ty
l9: lea di,s9
jmp ty
l10: lea di,s11
jmp ty
ld : lea di,str
ty: mov ah,0fh ;示方式
int 10h
sub cx,cx
mov cl,[di]
inc di
plot_next: add dh,[di+2]
add dl,[di+3]
mov ah,2
int 10h
mov al,[di]
mov bl,[di+1]
push cx
mov cx,1
mov ah,09
int 10h
pop cx
add di,4
loop plot_next

pop dx
pop cx
pop bx
pop ax
mov cx,100
gg: dec cx
loop gg

ret
ff endp
clear proc
push ax
push bx
push cx
push dx
mov ah,6
mov al,0
mov bh,1
int 10h
pop dx
pop cx
pop bx
pop ax
ret
clear endp
beep proc
push ax
push bx
push cx
push dx
mov al ,10110110b
out 43h,al
mov ax,533h
out 42h,al
mov al,ah
out 42h,al
in al,61h
mov ah,al
or al,03
out 61h,al
sub cx,cx
mov bl,28h
g7: loop g7
dec bl
jnz g7
mov al,ah
out 61h,al
pop dx
pop cx
pop bx
pop ax

ret
beep endp

code ends
end start

3. 簡易數字電子鍾的設計

數字電子鍾的設計
數字電子鍾的設計方法有多種,例如,可用中小規模集成電路組成電子鍾;也可以利用專用的電子鍾晶元配以顯示電路及其所需要的外圍電路組成電子鍾;還可以利用單片機來實現電子鍾等等。這些方法都各有特點,其中,利用單片機實現的電子鍾具有編程靈活,便於電子鍾功能的擴充,即可用該電子鍾發出各種控制信號,精確度高等特點。
所設計的電子鍾有以下功能:
1. 24小時制時間顯示。
2. 可隨時進行時間校對。
3. 整點報時。
4. 鬧鍾功能。
為了節約製作硬體的開支,我們利用單片機開發機上的硬體資源,開發了電腦數字鍾的軟體。該數字鍾由8031單片機控制,採用24小時制計時,利用開發機上的六個LED顯示器來顯示時、分和秒,使用P1埠中的P1.0埠線實現整點報時功能;使用P3埠的P3.0實現鬧鍾功能。其硬體原理圖如圖一所示。
圖中的開關K4用於鬧鍾控制,當K4=1時(開關處於ON的位置),打開鬧鍾,使之在預定時間起鬧;當K1=0時(開關處於OFF的位置),則關閉鬧鍾,使之不鬧。另外,在鬧鍾響起時,K4也可作為止鬧開關使用,若不止鬧,則鬧一分鍾。鬧鍾信號用發光二極體來模擬。
整點報時信號也是用發光二極體來模擬的。當整點時,P1.0口所接的發光二極體點亮一分鍾。
電腦數字鍾的秒信號是利用8031單片機定時器T0產生的。由於開發機的晶振頻率為6MHz,使得T0的最大定時時間遠遠小於1秒,因此,在設計時採用了硬體計數與軟體計數相結合的方式,即通過T0產生一定的定時時間,然後再利用軟體進行計數,從而產生1秒鍾的時間信號。在設計中,定時器T0採用了中斷方式。
數字電子鍾的設計方法有多種,例如,可用中小規模集成電路組成電子鍾;也可以利用專用的電子鍾晶元配以顯示電路及其所需要的外圍電路組成電子鍾;還可以利用單片機來實現電子鍾等等。這些方法都各有特點,其中,利用單片機實現的電子鍾具有編程靈活,便於電子鍾功能的擴充,即可用該電子鍾發出各種控制信號,精確度高等特點。
所設計的電子鍾有以下功能:
1. 24小時制時間顯示。
2. 可隨時進行時間校對。
3. 整點報時。
4. 鬧鍾功能。
為了節約製作硬體的開支,我們利用單片機開發機上的硬體資源,開發了電腦數字鍾的軟體。該數字鍾由8031單片機控制,採用24小時制計時,利用開發機上的六個LED顯示器來顯示時、分和秒,使用P1埠中的P1.0埠線實現整點報時功能;使用P3埠的P3.0實現鬧鍾功能。其硬體原理圖如圖一所示。
圖中的開關K4用於鬧鍾控制,當K4=1時(開關處於ON的位置),打開鬧鍾,使之在預定時間起鬧;當K1=0時(開關處於OFF的位置),則關閉鬧鍾,使之不鬧。另外,在鬧鍾響起時,K4也可作為止鬧開關使用,若不止鬧,則鬧一分鍾。鬧鍾信號用發光二極體來模擬。
整點報時信號也是用發光二極體來模擬的。當整點時,P1.0口所接的發光二極體點亮一分鍾。
電腦數字鍾的秒信號是利用8031單片機定時器T0產生的。由於開發機的晶振頻率為6MHz,使得T0的最大定時時間遠遠小於1秒,因此,在設計時採用了硬體計數與軟體計數相結合的方式,即通過T0產生一定的定時時間,然後再利用軟體進行計數,從而產生1秒鍾的時間信號。在設計中,定時器T0採用了中斷方式。

4. 單片機C語言編程簡易數字電子時鍾

#include <AT89X52.h>
unsigned char X=10,sec,flag;
unsigned char key[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};// 數碼管顯示數字表
unsigned char key2[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
unsigned char key1[]={0,0,0,0};//key1[0]=9 key1[1]=1 key1[2]=2 key1[3]=3
void delay02s(void);
void dislplay(void);
void dislplay1(void);
void tim1(void);
void main()
{

tim1();
while(1)
{
if(flag==0) dislplay();
else dislplay1();
}
}

void time1(void) interrupt 3
{
TR1=0;
X=X-1;
if(X==0)
{
flag=flag+1;
if(flag==2)
{
flag=0;
sec=sec+1;

if(sec==60)
{
sec=0;
key1[3]=key1[3]+1;
if(key1[3]==10);
{
key1[3]=0;
key1[2]=key1[2]+1;
if(key1[2]==6)
{
key1[2]=0;
key1[1]=key1[1]+1;
if(key[0]!=2)
{
if(key1[1]==10)
{
key1[1]=0;
key1[0]=key1[0]+1;
}
}
if(key[0]==2)
{
if(key[1]==4)
{
key1[1]=0;
key1[0]=0;
}
}
}
}
}
}
X=10;
}

TL1=0xb0;
TH1=0x3c;
TF1=0;
TR1=1;
}

void tim1(void)
{
TMOD =0X10;
TL1=0xb0;
TH1=0x3c;
EA=1;
ET1=1;
TR1=1;
}

void dislplay(void)
{
P2=0xfe;
P0=key[key1[0]];
delay02s();
P2=0xfd;
P0=key[key1[1]];
delay02s();
P2=0xfb;
P0=key[key1[2]];
delay02s();
P2=0xf7;
P0=key[key1[3]];
delay02s();
}
void dislplay1(void)
{
P2=0xfe;
P0=key[key1[0]];
delay02s();
P2=0xfd;
P0=key2[key1[1]];
delay02s();
P2=0xfb;
P0=key[key1[2]];
delay02s();
P2=0xf7;
P0=key[key1[3]];
delay02s();
}
void delay02s(void)
{
unsigned char i,j,k;
for(i=2;i>0;i--)
{
for(j=15;j>0;j--) //198
{
for(k=25;k>0;k--)//248
{
;
}
}

}
}
我空間還有其他的 http://user.qzone.qq.com/615543707/infocenter?ptlang=2052&ADUIN=615543707&ADSESSION=1276219802&ADTAG=CLIENT.QQ.2653_Mysrv.0

5. 急需一個電子時鍾的程序, 哪位高手請幫幫忙!!!,

一功能模、設計指標:
1. 顯示時、分、秒。
2. 可以24小時制或12小時制。
3. 具有校時功能,可以對小時和分單獨校時,對分校時的時候,停止分向小時進位。校時時鍾源可以手動輸入或借用電路中的時鍾。
4. 具有正點報時功能,正點前10秒開始,蜂鳴器1秒響1秒停地響5次。
5. 為了保證計時准確、穩定,由晶體振盪器提供標准時間的基準信號。
二、設計要求:
1. 畫出總體設計框圖,以說明數字鍾由哪些相對獨立的塊組成,標出各個模塊之間互相聯系,時鍾信號傳輸路徑、方向和頻率變化。並以文字對原理作輔助說明。
2. 設計各個功能模塊的電路圖,加上原理說明。
3. 選擇合適的元器件,在麵包上接線驗證、調試各個功能模塊的電路,在接線驗證時設計、選擇合適的輸入信號和輸出方式,在充分電路正確性同時,輸入信號和輸出方式要便於電路的測試和故障排除。
4. 在驗證各個功能模塊基礎上,對整個電路的元器件和布線,進行合理布局,進行整個數字鍾電路的接線調試。

三、製作要求:
自行裝配、接線和調試,並能檢查和發現問題,根據原理、現象和測量的數據分析問題所在,加以解決。學生要解決的問題包括元器件和麵包板故障引起的問題。
四、設計報告內容要求:
1. 目的。
2. 設計指標。
3. 畫出設計的原理框圖,並要求說明該框圖的工作過程及每個模塊的功能。
4. 元器件清單。
5. 設計製作的進程,考慮時鍾及控制信號的關系、測試、驗證的順序,寫出自己的工作進程。
6. 畫出各功能模塊的電路圖,加上原理說明(如2、5進制到10進制轉換,10進制到6進制轉換的原理,個位到十位的進位信號選擇和變換等)。
7. 畫出總布局接線圖(集成塊按實際布局位置畫,關鍵的連接單獨應畫出,計數器到解碼器的數據線、解碼器到數碼管的數據線可以簡化畫法,但集成塊的引腳須按實際位置畫,並註明名稱。)
8. 描述設計製作的數字鍾的運行結果和操作。
9. 總結。
  設計過程中遇到的問題及解決辦法
  課程設計過程體會
對課程設計內容、方式、要求等各方面的建議。

五、實驗儀器、工具:
1. 5V電源(或實驗箱)4個人合用1個。
2. 四連麵包板1塊。
3. 示波器2個(每班)
4. 萬用表5個(每班)。
5. 鑷子1把。
6. 剪刀1把。

六、實驗器件

1. 網路線2米/人。
2. 共陰八段數碼管6個。
3. CD4511集成塊6塊。
4. CD4060集成塊1塊。
5. 74HC390集成塊3塊。
6. 74HC51集成塊1塊。
7. 74HC00集成塊4塊。
8. 74HC30集成塊1塊。
9. 10MΩ電阻5個。
10. 500Ω電阻14個。
11. 30p電容2個。
12. 32.768k時鍾晶體1個。
13. 蜂鳴器10個(每班)

七、設計過程的日程安排

6月28日
1. 分發儀器、工具、器件
2. 講解總體設計的過程,明確數字鍾實現的功能,由哪些相對獨立的功能模塊組成,各個模塊之間互相聯系,時鍾信號傳輸路徑、方向和頻率變化。
3. 講解麵包板的結構和使用方法,連接導線的要點,包括導線剝線頭、插線方法、要求,檢查麵包板,如麵包板中的導電銅片變形或移位,更換導電銅片。
4. 七段數碼引腳排列測試,驗證每段顯示為一個發光二極體,同時完成對每個數碼管的檢查。
6月29日~7月2日
分功能講解各個模塊功能實現原理、實現,搭建實際電路一個個驗證。在接線時注意合理布線和接線的可靠性。

6月29日

a) 數碼管的解碼驅動電路接線、測試、解碼器控制功能測試(手工輸入測試電平)。
除了進一步熟悉原理外,主要練習接線合理布局,走線整齊、美觀,用手指觸動導線時也能正常工作。可以靜態顯示學號的後幾位。然選一個可正常工作的解碼、顯示電路,分別測試解碼器的3個控制引腳的作用。

6月30日
b) 晶體震盪電路接線、測試(用示波器測量4060輸入時鍾,每一路分頻輸出的頻率)。
c) 5進制計數器接線,輸入用4060的2Hz,輸出用數碼管顯示。

7月1日
d) 10進制計數器接線、測試。
e) 6進制計數器接線、測試(在10進制基礎上改)。

7月2日
f) 60進制計數器接線、測試。
g) 24進制計數器、測試(在60進制基礎上改)。
h) 校時電路接線(用RS觸發器實現鎖定、防抖動功能),用示波器觀察電路的信號選擇功能。

7月5~7日
5. 在熟悉各個功能模塊基礎上,結合對總體框圖的理解,設計總接線圖。
6. 根據總接線圖中各種元器件數量、連線,確定所有元器件布局。
7. 按以下順序接線:晶體震盪、秒電路、分電路、時電路。
8. 如時間允許加接校時電路和報時電路(整點報時)。

7月8~9日

9. 寫課程設計報告。
a) 設計的目的、要求。
b) 總體框圖設計。
c) 功能模塊設計(對所用元器件使用作一些說明)。
d) 總電路圖設計。
e) 總結:遇到的問題和解決辦法、體會、意見、建議等。

八、Multisim2001軟體部分集成塊引腳圖
集成塊引腳圖
九、部分原理模擬模塊電路

4511構成解碼驅動電路

4060構成脈沖發生及分頻電路

74390 構成十進制計數器

74390構成六進制計數器

74390構成六十進制計數器

校時電路(分校時時,不會進位到小時)
十、數字鍾的設計與製作原理
具體參照:
數字電子技術課程設計講義-數字鍾的設計與製作
(電子信息學院,2004年6月)
十一、Multisim2001軟體及其參考模擬電路
自己在對應位置下載。

十二、設計經驗總結:
1. 要求學生根據原理和晶元引腳圖,分功能設計原理圖,並根據接線順序分步驟驗證。
2. 容易出現故障為接觸不良。
a) 集成塊引腳方向預先彎好對准麵包板的金屬孔,再小心插入。
b) 導線的剝線長度與麵包板的厚度相適應(比板的厚度稍短)。
c) 導線的裸線部分不要露在板的上面,以防短路。
d) d) 導線要插入金屬孔中央。
3. 按照原理圖接線時首先確保可靠的電源和接地。
4. 注意晶元的控制引腳必須正確接好。
5. 檢查故障時除測試輸入、輸出信號外,要注意電源、接地和控制引腳。
6. 要注意晶元引腳上的信號與麵包板上插座上信號是否一致(集成塊引腳與麵包板常接觸不良)。
7. 為了便於測試,可將2Hz信號直接輸入到各級計數器。
8. 接校時電路時可接模擬信號輸入(如1Hz和2Hz)測試輸出信號的切換正確後,再將秒進位和分進位信號接到校時電路,再接校時電路輸出到分計數器和時計數器。
從較時電路接入信號時,必須將原進位信號拔掉。

6. 單片機電子時鍾編程

設計兩個按鍵,一個選定時鍾數字一個改變時鍾數字,選擇一個中斷定時掃描按鍵,通過讀入鍵值給DS1307初始化校時,再選擇一個中斷定時掃描DS1307可以讀出時,分,秒的BCD碼,將BCD碼解碼後點亮數碼管,數碼管的顯示可以通過對比當前時間與上一次掃描讀出時間確定時,分,秒哪位發生了改變,分別選通對應的數碼管,刷新顯示。

7. 用51單片機編程:電子時鍾(設計電子時鍾,用51單片機編程)

如果有問題歡迎到我空間相關文章下留言 樂於回答~~
程序如下:
; 定義管腳
S_SET BIT P1.0 ;數字鍾秒控制位
M_SET BIT P1.1 ;分鍾控制位
H_SET BIT P1.2 ;小時控制位
SECOND EQU 30H
MINUTE EQU 31H
HOUR EQU 32H
ORG 00H
SJMP MAIN
ORG 0BH
LJMP INT_T0
MAIN: MOV DPTR,#TABLE
MOV HOUR,#0 ;初始化
MOV MINUTE,#0
MOV SECOND,#0
MOV R0,#0
MOV TMOD,#01H
MOV TH0,#3CH ; 設置初值(定時50毫秒)
MOV TL0,#0B0H
SETB TR0 ;啟動定時
SETB ET0
SETB EA
;*******************************************************************************
;判斷是否有控制鍵按下
A1: LCALL DISPLAY
JNB S_SET,S1
JNB M_SET,S2
JNB H_SET,S3
LJMP A1
S1: LCALL DELAY ;去抖動
JB S_SET,A1

INC SECOND ;秒值加1
MOV A,SECOND
CJNE A,#60,J0 ;判斷是否加到60秒
MOV SECOND,#0
LJMP K1
S2: LCALL DELAY
JB M_SET,A1

K1: INC MINUTE ;分鍾值加1
MOV A,MINUTE
CJNE A,#60,J1 ;判斷是否加到60分
MOV MINUTE,#0
LJMP K2
S3: LCALL DELAY
JB H_SET,A1

K2: INC HOUR ;小時值加1
MOV A,HOUR
CJNE A,#24,J2 ;判斷是否加到24小時
MOV HOUR,#0
MOV MINUTE,#0
MOV SECOND,#0
LJMP A1
;****************************************************
;等待按鍵抬起
J0: JB S_SET,A1
LCALL DISPLAY
SJMP J0
J1: JB M_SET,A1
LCALL DISPLAY
SJMP J1
J2: JB H_SET,A1
LCALL DISPLAY
SJMP J2
;***********************************************
;定時器中斷服務程序,對秒,分鍾和小時的計數
INT_T0: MOV TH0,#3CH
MOV TL0,#0B0H
INC R0
MOV A,TCNT
CJNE A,#20,RETUNE ;計時1秒
INC SECOND
MOV R0,#0
MOV A,SECOND
CJNE A,#60,RETUNE
INC MINUTE
MOV SECOND,#0
MOV A,MINUTE
CJNE A,#60,RETUNE
INC HOUR
MOV MINUTE,#0
MOV A,HOUR
CJNE A,#24,RETUNE
MOV HOUR,#0
MOV MINUTE,#0
MOV SECOND,#0
MOV R0,#0
RETUNE: RETI
;******************************************
;顯示控制子程序
DISPLAY: MOV A,SECOND ;顯示秒
MOV B,#10
DIV AB
CLR P3.6
MOVC A,@A+DPTR
MOV P0,A
LCALL DELAY
SETB P3.6
MOV A,B
CLR P3.7
MOVC A,@A+DPTR
MOV P0,A
LCALL DELAY
SETB P3.7
CLR P3.5
MOV P0,#40H ;顯示分隔符
LCALL DELAY
SETB P3.5
MOV A,MINUTE ;顯示分鍾
MOV B,#10
DIV AB
CLR P3.3
MOVC A,@A+DPTR
MOV P0,A
LCALL DELAY
SETB P3.3
MOV A,B
CLR P3.4
MOVC A,@A+DPTR
MOV P0,A
LCALL DELAY
SETB P3.4
CLR P3.2
MOV P0,#40H ;顯示分隔符
LCALL DELAY
SETB P3.2
MOV A,HOUR ;顯示小時
MOV B,#10
DIV AB
CLR P3.0
MOVC A,@A+DPTR
MOV P0,A
LCALL DELAY
SETB P3.0
MOV A,B
CLR P3.1
MOVC A,@A+DPTR
MOV P0,A
LCALL DELAY
SETB P3.1
RET
TABLE: DB 3FH,06H,5BH,4FH,66H
DB 6DH,7DH,07H,7FH,6FH
DELAY: MOV R6,#5
D1: MOV R7,#250
DJNZ R7,$
DJNZ R6,D1
RET
END
這里的程序沒用38解碼器,若要用則顯示子程序要改
如 要顯示秒,程序如下

DISPLAY: MOV A,SECOND ;顯示秒
MOV B,#10
DIV AB
MOV R7,#60H
ORG A,R7
MOV P0,A
LCALL DELAY
MOV A,B
MOV R7,#70H
ORL A,R7
MOV P0,A
LCALL DELAY
其他的一樣這樣改

8. 用C語言編一個數字電子時鍾的程序

1.這是用windows api寫的程序。所以要求是純c的話就沒有辦法了
2.其中定時用了兩種方法。一種是用取消息。另一種是延時隊列。這里只使用了取消息的方法。延時隊列由於我機器上是vc6.0,CreateTimerQueue在本人機器上無法使用,需要新的sdk,所以沒有加以驗證,但取消息的方式是可行的。
3.稍稍驗證了下,基本滿足要求。
-------------------------------------------
程序如下:
// DigitalClock.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <windows.h>
#include <winbase.h>

typedef struct _st_time{
int hour;
int min;
int sec;
}ST_TIME;

ST_TIME g_Time; // The struct contain the hour,min and sec.
HANDLE g_hStdout; //
WORD g_cxCenter, g_cyCenter; // Center of the screen.
HANDLE g_DoneEvent; // The program could be over.
BOOL g_ThreadTerminated; // The Thread should be terminated.

#define SECOND_CIRCLE 60
#define MINUTE_CIRCLE 60
#define HOUR_CIRCLE 24

void TimeIncreaseSecond(ST_TIME & st)
{
st.sec ++;
if (st.sec >= SECOND_CIRCLE)
{
st.sec -= SECOND_CIRCLE;
st.min++;
if (st.min >= MINUTE_CIRCLE)
{
st.min -= MINUTE_CIRCLE;
st.hour++;
if (st.hour >= HOUR_CIRCLE)
{
st.hour -= HOUR_CIRCLE;
}
}
}
}

void PrintTimeToScreen(HANDLE hStdout, short cxCenter, short cyCenter, ST_TIME st)
{
char buf[64] = {0};
COORD crdPos;
// make it format to output.
sprintf (buf, "%02d:%02d:%02d", st.hour, st.min, st.sec);
crdPos.X = cxCenter - 4;
crdPos.Y = cyCenter;
SetConsoleCursorPosition(hStdout, crdPos);
printf(buf);
}

#ifdef USE_TIMERQUEUE
// if we use the timer queue function.
// Its procre is in this.
void CALLBACK TimerRoutine (LPVOID lpParam, BOOL TimerOrWaitFired)
{
if (lpParam == NULL)
{
printf ("NULL parameters.\n");
}
else
{
ST_TIME *st = (ST_TIME *)lpParam;
TimeIncreaseSecond(st);
PrintTimeToScreen(g_hStdout, g_cxCenter, g_cyCenter, *st);
}
}

#else

DWORD WINAPI TimerThreadProc(LPVOID lpParam)
{
#define ID_TIMER_SECOND 1
MSG msg;
BOOL ret;

ST_TIME *st = (ST_TIME *)lpParam;

SetTimer(NULL, ID_TIMER_SECOND, 1000, NULL);
PeekMessage(&msg, NULL, WM_USER, WM_USER, PM_NOREMOVE);

while (!g_ThreadTerminated && (ret = GetMessage (&msg, NULL, 0, 0)) != 0)
{
if (ret == -1)
{
//process fatal event.
}
else if (msg.message == WM_TIMER)
{
TimeIncreaseSecond(*st);
PrintTimeToScreen(g_hStdout, g_cxCenter, g_cyCenter, *st);
}
else
{
TranslateMessage (&msg);
DispatchMessage (&msg);
}
}
return 1;
}
#endif

// If the ctrl+break combined key pressed. call this function.
// It set the g_DoneEvent. this terminate the program.
BOOL WINAPI CtrlHandler(DWORD fdwCtrlType)
{
switch (fdwCtrlType)
{
case CTRL_BREAK_EVENT:
// Terminate the program.
printf ("Terminate.\n");
SetEvent(g_DoneEvent);
return TRUE;
default:
return FALSE;
}
}

BOOL InitApplication()
{
// Get the stdin and stdout handle.
HANDLE hStdIn;
hStdIn = GetStdHandle(STD_INPUT_HANDLE);
if (hStdIn == INVALID_HANDLE_VALUE)
return FALSE;
g_hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
// Set the mode, make the input echo.
DWORD fOldMode;
GetConsoleMode(hStdIn, &fOldMode);
fOldMode |= ENABLE_LINE_INPUT | ENABLE_ECHO_INPUT;
SetConsoleMode(hStdIn, fOldMode);

// Set the window buffer.
// make a line 40 columns.
CONSOLE_SCREEN_BUFFER_INFO csbiInfo;
GetConsoleScreenBufferInfo(g_hStdout, &csbiInfo);
csbiInfo.srWindow.Right = 40;

// get the center point.
g_cxCenter = csbiInfo.srWindow.Right / 2;
g_cyCenter = csbiInfo.srWindow.Bottom / 2;

// Set the window.
SetConsoleWindowInfo(g_hStdout, TRUE, &csbiInfo.srWindow);
return TRUE;
}

BOOL (HANDLE hStdout, WORD cxCenter, WORD cyCenter, ST_TIME & time)
{
#define GAPS_LEFT_COLON (-2)
#define GAPS_RIGHT_COLON (1)
#define GAPS_LEFT_UNDERLINE_START (-4)
#define GAPS_MIDDLE_UNDERLINE_START (-1)
#define GAPS_RIGHT_UNDERLINE_START (2)
// __:__:__
// So the left ":" center -2
// so the right ":" center + 1
// so the left "_" center - 4;
// so the lfet "_" center - 1;
// so the right "_" center + 2;
COORD crdPos;
crdPos.X = cxCenter + GAPS_LEFT_COLON;
crdPos.Y = cyCenter;
SetConsoleCursorPosition(hStdout, crdPos);
printf (":");

crdPos.X = cxCenter + GAPS_RIGHT_COLON;
SetConsoleCursorPosition(hStdout, crdPos);
printf (":");
crdPos.X = cxCenter + GAPS_LEFT_UNDERLINE_START;
SetConsoleCursorPosition(hStdout, crdPos);

scanf ("%d", &time.hour);
crdPos.X = cxCenter + GAPS_MIDDLE_UNDERLINE_START;
SetConsoleCursorPosition(hStdout, crdPos);
scanf ("%d", &time.min);
crdPos.X = cxCenter + GAPS_RIGHT_UNDERLINE_START;
SetConsoleCursorPosition(hStdout, crdPos);
scanf ("%d", &time.sec);

if (time.hour < 0 || time.hour > HOUR_CIRCLE ||
time.min < 0 || time.min > MINUTE_CIRCLE ||
time.sec < 0 || time.sec > SECOND_CIRCLE)
return FALSE;
return TRUE;
}

int main(int argc, char* argv[])
{
InitApplication();
(g_hStdout, g_cxCenter, g_cyCenter, g_Time);

// create a event to tell the program to terminate.
g_DoneEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
#ifdef USE_TIMERQUEUE
HANDLE hTimerQueue, hTimer;
hTimerQueue = CreateTimerQueue();
if (!CreateTimerQueueTimer(&hTimer,
hTimerQueue, TimerRoutine, &g_Time, 1000, 0, 0))
{
printf("CreateTimerQueueTimer failed (%d)\\n", GetLastError());
return 3;
}
#else
// create the thread.
HANDLE hThreadTimer;
DWORD dwThreadId;
g_ThreadTerminated = FALSE;
hThreadTimer = CreateThread(NULL, 0,
TimerThreadProc, &g_Time, 0, &dwThreadId);
if (hThreadTimer == NULL)
{
}
#endif
SetConsoleCtrlHandler(CtrlHandler, TRUE);
if (WaitForSingleObject(g_DoneEvent, INFINITE) != WAIT_OBJECT_0)
printf("WaitForSingleObject failed (%d)\\n", GetLastError());
#ifdef USE_TIMERQUEUE
if (!DeleteTimerQueue(hTimerQueue))
printf("DeleteTimerQueue failed(%d) \\n", GetLastError());
#else
g_ThreadTerminated = TRUE;
if (WaitForSingleObject(hThreadTimer, INFINITE) != WAIT_OBJECT_0)
printf("WaitForSingleObject failed (%d)\\n", GetLastError());
#endif
return 0;
}

--------------------------------------------
下面是純c的。
有幾個問題:
1.textmode函數在turboc中沒有辦法使用,不知道是什麼問題,而borland c就可以。
2.無論怎麼設置,自己的ctrlbreak函數在上述兩個環境中都不能被調用,非常遺憾。所以不能夠優雅的退出。只能按兩次ctrlbreak。
下面是程序。
------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <dos.h>

#define ABORT 0

int jump_out_loop = -1;
int jump_out(void)
{
jump_out_loop = 1;
printf("Abort ..\n");
return ABORT;
}
int main(void)
{
struct text_info ti;
int center_x, center_y;
int hour, min, sec;
char str_out[64] = {0};
clrscr();
/*textmode(BW40);*/
/*textmode在turbo c下設置會出問題*/
gettextinfo(&ti);
center_x = ti.winright / 2;
center_y = ti.winbottom / 2;
gotoxy(center_x - 4, center_y);
cprintf(" : : ");
gotoxy(center_x - 4, center_y);
cscanf("%d", &hour);
gotoxy(center_x - 1, center_y);
cscanf("%d", &min);
gotoxy(center_x + 2, center_y);
cscanf("%d", &sec);
/* check input valid or not */
{}
setcbrk(1);
ctrlbrk(jump_out);
/*jump_out沒有起到作用,實在不好意思.*/
/*
if (getcbrk())
printf("crtl break is on\n");
else
printf("is off\n");
*/

while (1)
{
delay(1000);
sec++;
if (sec >= 60)
{
sec -= 60;
min++;
if (min >= 60)
{
min -= 60;
hour++;
if (hour >= 24)
{
hour -= 24;
}
}
}
sprintf(str_out, "%02d:%02d:%02d", hour, min, sec);
gotoxy(center_x - 4, center_y);
cprintf(str_out);
}
/* getch();*/
return 0;
}

9. 數字電子鍾設計用匯編

有一個8086的給你借鑒一下,希望對你有用。


.486
DATA SEGMENTAT0USE16
ZDXL EQU20H ;中斷向量(20H)
OPORTEQU3A0H ;8259偶地址
JPORTEQU3A8H ;8259奇地址
PORT1EQU340H ;段地址
PORT2EQU360H ;位地址
DS0 EQU300H ;8253通道0
DSC EQU30CH ;8253控制口
COUNT EQU50
ORG 4000H
DATA1 DB6DUP(?)
ORG 4040H
DATA2 DB3DUP(?)
DATA ENDS

CODE SEGMENTUSE16
ASSUMECS:CODE,DS:DATA,ES:DATA
ORG2000H
BEG:CLI
JMPSTART
TABDB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,
DB7FH,67H,77H,7CH,39H,5EH,79H,71H;段碼表
TIMERDB0 ;延時、計數初值
START:
MOVAX,DATA ;初始化
MOVDS,AX
MOVES,AX
MOVAX,0
MOVSS,AX
MOVSP,1000H
INIT8253:
MOVDX,DSC
MOVAL,00010110B ;方式3,方波發生器
OUTDX,AL
MOVDX,DS0
MOVAL,0BH
OUTDX,AL
MOVAL,0E9H
OUTDX,AL
SETVECT:
MOVDI,0
MOVDX,OFFSETSERVER ;中斷服務子程序偏移地址
MOVZDXL[DI],DX;送中斷向量低位
MOVDX,CS ;中斷服務子程序段地址
MOVZDXL[DI+2],DX;送中斷向量高位
INIT8259:
MOVAL,00010011B ;ICW1
MOVDX,OPORT
OUTDX,AL
MOVAL,00001000B ;ICW2
MOVDX,JPORT
OUTDX,AL
MOVAL,00001101B ;ICW4
MOVDX,JPORT
OUTDX,AL
MOVAL,11111110B ;OCW1
MOVDX,JPORT
OUTDX,AL
MOVAL,20H ;EOI(20H)
MOVDX,OPORT
OUTDX,AL
AGAIN:
STI ;開中斷
CALLCZ ;調拆字
CALLDISP ;調顯示
JMPAGAIN

CZPROC
PUSHCX
LEASI,DATA1 ;SI=拆字,取數
LEADI,DATA2 ;DI=顯示緩沖區首址
CZ0:
MOVBL,[SI]
ANDBL,0F0H;BL=
MOVCL,4
ROLBL,CL
MOV[DI],BL;(DI)=
INCDI
MOVBL,[SI]
ANDBL,0FH;BL=
MOV[DI],BL
INCSI
INCDI
CMPSI,08H;....
JBECZ0
POPCX
RET
CZ ENDP
DISP PROC ;顯示子程序
PUSHCX
PUSHDX
LEABX,TAB
LEASI,DATA2
MOVAH,0C1H
DISP1:
MOVDX,PORT2
MOVAL,AH
OUTDX,AL ;AL=,AL=位輸出
MOVDX,PORT1
MOVAL,[SI]
XLAT
OUTDX,AL ;AL=,AL=段輸出
MOVCX,0200H
LOOP$
INCSI
SALAH,1
ORAH,0C0H
CMPAH,0C0H
JNZDISP1
POPDX
POPCX
RET
DISPENDP
SERVERPROC ;8253中斷入口
CLI
PUSHAX
PUSHCX
PUSHDX
PUSHSI
PUSHDI
LEASI,TIMER
MOVAL,[SI]
INCAL
CMPAL,… ;與延時、計數值終值比較
JBWORK ;大於、等於(到1秒)轉移
MOV[SI],AL ;[SI]=,[SI]=,[SI]=
JMPEXIT
WORK:
MOVAL,0
MOV[SI],AL
LEASI,DATA2+2
MOVAL,[SI]
INCAL
AAA ;..十進制調整
CMPAL,60 ;...與60秒比較
JBMINUTE ;...大於、等於(60秒)轉移
MOV[SI],AL
JMPEXIT
MINUTE:
MOVAL,0
MOV[SI],AL
LEASI,DATA2+1
MOVAL,[SI]
INCAL
AAA ;...十進制調整
CMPAL,60 ;...與60分比較
JBHOURE ;...大於、等於(60分)轉移
MOV[SI],AL
JMPEXIT
HOURE:
MOVAL,0
MOV[SI],AL
LEASI,DATA2
MOVAL,[SI]
INCAL
AAA ;...十進制調整
CMPAL,24 ;...與24小時比較
JBNEXT ;...大於、等於(24小時)轉移
MOV[SI],AL
JMPEXIT
NEXT:
MOVAL,0
MOV[SI],AL
EXIT:
MOVAL,20H
MOVDX,OPORT
OUTDX,AL
POPDI
POPSI
POPDX
POPCX
POPAX
RET
SERVERENDP
CODE ENDS
ENDBEG
閱讀全文

與數字電子鍾編程相關的資料

熱點內容
gz壓縮文件夾 瀏覽:177
字母h從右往左跑的c語言編程 瀏覽:127
安卓手機如何擁有蘋果手機橫條 瀏覽:765
業余編程語言哪個好學 瀏覽:137
按照文件夾分個壓縮 瀏覽:104
航空工業出版社單片機原理及應用 瀏覽:758
如何在電信app上綁定親情號 瀏覽:376
安卓的怎麼用原相機拍月亮 瀏覽:805
配音秀為什麼顯示伺服器去配音了 瀏覽:755
c盤清理壓縮舊文件 瀏覽:325
app怎麼交付 瀏覽:343
圖蟲app怎麼才能轉到金幣 瀏覽:175
如何做徵文app 瀏覽:446
用什麼app管理斐訊 瀏覽:169
安卓如何下載寶可夢劍盾 瀏覽:166
編譯器開發屬於哪個方向 瀏覽:940
megawin單片機 瀏覽:687
以色列加密貨幣監督 瀏覽:909
程序員前端現在怎麼樣 瀏覽:499
伺服器和介面地址ping不通 瀏覽:557