《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 其他 > 設(shè)計(jì)應(yīng)用 > LED顯示電腦電子鐘電路及控制程序
LED顯示電腦電子鐘電路及控制程序
摘要: CPU選用的是AT89C2051,,時(shí)鐘芯片選用的是Dallas公司的DS1302,,溫度傳感器選用的是Dallas公司的數(shù)字溫度傳感器DS1820,顯示驅(qū)動(dòng)芯片選用的是德州儀器公司的TPIC6B595,,也可選用與其兼容的芯片NC595或國產(chǎn)的AMT9595,。整個(gè)電子鐘用兩個(gè)鍵來調(diào)節(jié)時(shí)間和日期,。一個(gè)是位選鍵,一個(gè)是數(shù)字調(diào)節(jié)鍵,。按一下位選鍵,,頭兩位數(shù)字開始閃動(dòng),進(jìn)入設(shè) 定調(diào)節(jié)狀態(tài),,此時(shí)按數(shù)字調(diào)節(jié)鍵,,當(dāng)前閃動(dòng)位的數(shù)字就可改變。
關(guān)鍵詞: 電子鐘 LED
Abstract:
Key words :

本例介紹一種用LED制作的電腦電子鐘(電腦萬年歷),。其制作完成裝潢后的照片如下圖:

上圖中,,年、月,、日及時(shí)間選用的是1.2寸共陽數(shù)碼管,,星期選用的是2.3寸數(shù)碼管,溫度選用的是0.5寸數(shù)碼管,,也可根據(jù)個(gè)人的愛好選用不同規(guī)格的數(shù)碼管,。原理圖如下圖所示:
LED顯示電腦電子鐘 www.elecfans.com
上圖中,CPU選用的是AT89C2051,,時(shí)鐘芯片選用的是Dallas公司的DS1302,,溫度傳感器選用的是Dallas公司的數(shù)字溫度傳感器DS1820,顯示驅(qū)動(dòng)芯片選用的是德州儀器公司的TPIC6B595,,也可選用與其兼容的芯片NC595或國產(chǎn)的AMT9595,。整個(gè)電子鐘用兩個(gè)鍵來調(diào)節(jié)時(shí)間和日期。一個(gè)是位選鍵,,一個(gè)是數(shù)字調(diào)節(jié)鍵,。按一下位選鍵,頭兩位數(shù)字開始閃動(dòng),,進(jìn)入設(shè) 定調(diào)節(jié)狀態(tài),,此時(shí)按數(shù)字調(diào)節(jié)鍵,當(dāng)前閃動(dòng)位的數(shù)字就可改變,。

全部參 數(shù)調(diào)節(jié)完后,,五秒鐘內(nèi)沒有任何鍵按下,,則數(shù)字停止閃動(dòng),退出設(shè)定調(diào)節(jié)狀態(tài),。源程序清單如下(無溫度顯示程序):

start:do,;
$include(reg51.dcl)
declare (sclk,io,,rst) bit at (0b3h) register,; /* p33,p34,,p35 */
declare (command,,data,n,,temp1,,num) byte;
declare a(9) byte,;
declare ab(6) byte,;
declare aco(11) byte constant (0fdh,60h,,0dah,,0f2h,66h,,0b6h,,0beh,

0e0h,,0feh,,0f6h,00h),;
declare week(11) byte constant (0edh,,028h,,0dch,,7ch,39h,,75h,,0f5h,
2ch,,0fdh,,7dh,00h),;
declare da literally'p15',,clk literally'p16',,ale literally'p17',
mk literally'p11',,sk literally'p12',;

clear:procedure;
sclk=0,;io=0,;rst=0;
end clear,;

send1302:procedure(comm),;
declare (i,comm) byte,;
do i=0 to 7,;
comm=scr(comm,1),;
io=cy,;
call time(1);
sclk=0,;
call time(1),;
sclk=1;
end,;
end send1302,;
wbyt1:procedure(com,dat),;/*字節(jié)寫過程*/

declare (com,,dat) byte;
call clear,;
rst=1,;
call send1302(com);
call send1302(dat),;
call clear,;
end wbyt1;
wbyt8:procedure,;/*時(shí)鐘多字節(jié)突發(fā)模式寫過程*/
declare j byte,;
call clear;
a(7)=A(6),;a(6)=a(0),;
rst=1;
call send1302(command);
do j=1 to 8,;
call send1302(a(j)),;
end;
call clear,;
end wbyt8,;
 

 

RBYT1:PROCEDURE;
DECLARE I BYTE,;
CALL CLEAR,;
RST=1;
call send1302(0c1h),;
IO=1,;
DO I=0 TO 7;
SCLK=1,;
SCLK=0,;
CY=IO;
N=SCR(N,,1),;
END;
A(8)=N,;
CALL CLEAR,;
END RBYT1;
send595:procedure,;
declare k byte,;
do k=0 to 7;
data=scr(data,,1),;
da=cy;
clk=1,;
clk=0,;
end;
end send595,;

send595_1:procedure,;
declare k byte;
do k=0 to 7,;
data=scr(data,,1);
da1=cy,;
clk1=1;
clk1=0;
end,;
end send595_1,;

rb1:procedure(abc,j),;
DECLARE (I,,j,abc) BYTE,;
CALL CLEAR,;
RST=1;
call send1302(abc),;
IO=1,;
DO I=0 TO 7;
SCLK=1,;
SCLK=0,;
CY=IO;
N=SCR(N,,1),;
END;
ab(j)=N,;
ab(j)=dec(ab(j)),;
CALL CLEAR;
end rb1,;

rbyt6:procedure,;
call rb1(0f1h,0),;
call rb1(0f3h,,1);
call rb1(0f5h,,2),;
call rb1(0f7h,3),;
call rb1(0f9h,,4);
call rb1(0fbh,,5),;
call rb1(0fdh,6),;
end rbyt6,;

wbyt6:procedure,;
call wbyt1(8eh,0),; /* write enable */
call wbyt1(0f0h,,ab(0));
call wbyt1(0f2h,,ab(1)),;
call wbyt1(0f4h,ab(2)),;
call wbyt1(0f6h,,ab(3));
call wbyt1(0f8h,,ab(4)),;
call wbyt1(0fah,ab(5)),;
call wbyt1(0fch,,ab(6));
call wbyt1(8eh,,80h),; /* write disable */
end wbyt6;
rbyt8:procedure,;/*時(shí)鐘多字節(jié)突發(fā)模式讀過程*/
declare (i,,j) byte;
call clear,;
rst=1,;
call send1302(command);
io=1,;
do j=1 to 8,;
do i=0 to 7;
sclk=1,;
call time(1),;
sclk=0;
cy=io,;
n=scr(n,,1);

end,;
a(j)=n,;
end;
call clear,;
a(0)=a(6),;a(6)=A(7),;
a(0)=a(0) and 0fh;
if a(0)>6 then a(0)=0,;
CALL RBYT1,;
if (a(1)=0 and a(2)=0 and a(3)=0) then
do,;
do num=0 to 35,;
call time(250);
end,;
temp1=1,;
end;
if temp1=1 then
do,;
temp1=0,;
ab(4)=ab(4)+1;
if ab(4)>99h then
do,;
ab(4)=0,;
ab(5)=ab(5)+1;
if ab(5)>99h then ab(5)=0,;
end,;
call wbyt6;
end,;
end rbyt8,; 
 

 

display:procedure; /*jieya,,yima,,fasong*/
declare (i,n,,m) byte,;
n=a(0) and 0fh; /* send week */
data=week(n),;
call send595,;

n=a(4); /* send date */
n=n and 0fh,;
data=aco(n),;
call send595;
n=a(4),;
n=shr(n,,4);
data=aco(n),;
call send595,;

do i=1 to 3,; /* send second,minute,,hour */
n=a(i),;
n=n and 0fh;
data=aco(n),;
call send595,;
n=a(i);
n=shr(n,,4),;
data=aco(n);
call send595,;
end,;
do i=5 to 6; /* send month,,year */
n=a(i),;
n=n and 0fh;
data=aco(n),;
call send595,;
n=a(i);
n=shr(n,,4),;
data=aco(n);
call send595,;
end,;

n=a(8); /* send 19 or 20 */
n=n and 0fh,;
data=aco(n),;
call send595;
n=a(8),;
n=shr(n,,4);
data=aco(n),;
call send595,;
do m=0 to 5;
n=ab(m),;
n=n and 0fh,;
data=aco(n);
call send595_1,;
n=ab(m),;
n=shr(n,,4);
data=aco(n),;
call send595_1,;
end;
ale=0,;
ale=1,;
end display;

beginset:procedure,;
a(0)=06h,;a(1)=58h,;a(2)=59h,;a(3)=23h;
a(4)=30h,;a(5)=06h,;a(6)=97h;a(7)=00,;
a(8)=19h,; /* set date/time (1997,7,,1,,8:00:00,week 3) */
call wbyt1(8eh,,0),; /* write enable*/
call wbyt1(80h,00h),;/* start colock */
call wbyt1(0beh,,0abh);/*兩個(gè)二極管與8K電阻串聯(lián)充電*/
command=0beh,; /* write colock/date */
call wbyt8,;
call wbyt1(0c0h,a(8)),;
call wbyt1(8eh,,80h); /* set write protect bit */
end beginset,;

key:procedure,;
declare (i,time1,,k1,,tem) byte,;
call time(100);
k1=7,;time1=30,;
if mk=0 then
do;
do while time1>0,;
week: if k1=0 then
do,;
do i=0 to 5;
/* call hz(a(0)),; */
end,;
do i=0 to 3;
/* call hz0,; */
end,;
end;

tem=a(k1),;
if k1=7 then tem=a(8),;
a(k1)=0aah;
if k1=7 then a(8)=0aah,;
call display,;
call time(254);
call time (254),;
a(k1)=tem,;
if k1=7 then a(8)=tem;
call display,;
call time(254),;
call time(254);
call time(254),;
time1=time1-1,;
if mk=0 then
do;call time(100),; /*MOD KEY PROCESS*/
TIME1=30,;
IF MK=0 THEN
DO;
k1=k1-1,;
DO WHILE K1=0FFH,;
K1=7;
END,;
END,;
end;
IF SK=0 THEN
DO;CALL TIME(100),; /*SET KEY PROCESS*/
TIME1=30,;
IF SK=0 THEN
DO;
tem=tem+1,;
tem=dec(tem),;
DO CASE K1;
DO WHILE tem=7,;/*week*/
tem=0,;
END;
DO WHILE tem=60H,;/*scond*/
tem=0,;
END;
DO WHILE tem=60H,;/*minute*/
tem=0,;
END;
DO WHILE tem=24H,;/*hour*/
tem=0,;
END;
DO WHILE tem=32H,;/*date*/
tem=1;
END,;
DO WHILE tem=13H,;/*month*/
tem=1;
END,;
DO while tem=100h,; /* YEAR */
tem=00;
END,;
DO WHILE TEM>=21H,;
tem=19H;
END,;
END,;
A(K1)=tem;
if k1=7 then a(8)=tem,;
END,;
END;
END,;
END,;
end key;

 

main$program:
mk=1,;sk=1,;temp1=0,;num=0;p32=1,;
if sk=0 then call beginset,;
clk=0;da=0,;ale=1,;
loop:
do while mk=1 ;
if a(0)>6 then a(0)=0,;
command=0bfh,;
call rbyt8;
call display,;
do while mk=0,;
call key;
call wbyt1(8eh,,0),;
command=0beh;
call wbyt8,;
call wbyt1(0C0H,,A(8));
call wbyt1(8eh,,80h),;
end;
end,;
goto loop,;
end start

此內(nèi)容為AET網(wǎng)站原創(chuàng),未經(jīng)授權(quán)禁止轉(zhuǎn)載,。