CPU選用的是AT89C2051,時(shí)鐘芯片選用的是Dallas公司的DS1302, 溫度傳感器選用的是Dallas公司的數(shù)字溫度傳感器DS1820,顯示驅(qū)動(dòng)芯片選用的是德州儀器公司的TPIC6B595,也可選用與其兼容的芯片NC595或 國(guó)產(chǎn)的AMT9595。整個(gè)電子鐘用兩個(gè)鍵來(lái)調(diào)節(jié)時(shí)間和日期。一個(gè)是位選 鍵,一個(gè)是數(shù)字調(diào)節(jié)鍵。按一下位選鍵,頭兩位數(shù)字開(kāi)始閃動(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)沒(méi)有任何鍵按下,則數(shù)字停止閃動(dòng),退出設(shè)定調(diào)節(jié)狀態(tài)。源程序清單如下(無(wú)溫度顯示程序): 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é)寫(xiě)過(guò)程*/ declare (com,dat) byte; call clear; rst=1; call send1302(com); call send1302(dat); call clear; end wbyt1; wbyt8:procedure;/*時(shí)鐘多字節(jié)突發(fā)模式寫(xiě)過(guò)程*/ 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ā)模式讀過(guò)程*/ 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
|
|