一个液晶显示的数字式电脑温度计.docx
《一个液晶显示的数字式电脑温度计.docx》由会员分享,可在线阅读,更多相关《一个液晶显示的数字式电脑温度计.docx(11页珍藏版)》请在冰豆网上搜索。
一个液晶显示的数字式电脑温度计
一个液晶显示的数字式电脑温度计
文章来源:
遥控网
液晶显示器分很多种类,按显示方式可分为段式,行点阵式和全点阵式。
段式与数码管类似,行点阵式一般是英文字符,全点阵式可显示任何信息,如汉字、图形、图表等。
这里我们介绍一种八段式四位LCD显示器,该显示器内置驱动器,串行数据传送,使用非常方便。
原理图如下图:
下图是长沙太阳人科技开发有限公司生产的4位带串行接口的液晶显示模块SMS0403
的外部引线简图:
关该模块的具体参数,请查看该公司网站。
此例中使用的温度传感器为美国DALLAS公司生产的单总线式数字温度传感器。
该传感器本站有其详细的资料可供下载。
此例稍加改动,即可做成温控器。
本例介绍一种用LED制作的电脑电子钟(电脑万年历)。
其制作完成装潢后的照片如下图:
点击看大图
上图中,年、月、日及时间选用的是1.2寸共阳数码管,星期选用的是2.3寸数码管,温度选用的是0.5寸数码管,也可根据个人的爱好选用不同规格的数码管。
原理图如下图所示:
上图中,CPU选用的是AT89C2051,时钟芯片选用的是Dallas公司的DS1302,温度传感器选用的是Dallas公司的数字温度传感器DS1820,显示驱动芯片选用的是德州仪器公司的TPIC6B595,也可选用与其兼容的芯片NC595或国产的AMT9595。
整个电子钟用两个键来调节时间和日期。
一个是位选键,一个是数字调节键。
按一下位选键,头两位数字开始闪动,进入设定调节状态,此时按数字调节键,当前闪动位的数字就可改变。
全部参数调节完后,五秒钟内没有任何键按下,则数字停止闪动,退出设定调节状态。
源程序清单如下(无温度显示程序):
start:
do;
$include(reg51.dcl)
declare(sclk,io,rst)bitat(0b3h)register;/*p33,p34,p35*/
declare(command,data,n,temp1,num)byte;
declarea(9)byte;
declareab(6)byte;
declareaco(11)byteconstant(0fdh,60h,0dah,0f2h,66h,0b6h,0beh,
0e0h,0feh,0f6h,00h);
declareweek(11)byteconstant(0edh,028h,0dch,7ch,39h,75h,0f5h,
2ch,0fdh,7dh,00h);
declaredaliterally'p15',clkliterally'p16',aleliterally'p17',
mkliterally'p11',skliterally'p12';
clear:
procedure;
sclk=0;io=0;rst=0;
endclear;
send1302:
procedure(comm);
declare(i,comm)byte;
doi=0to7;
comm=scr(comm,1);
io=cy;
calltime
(1);
sclk=0;
calltime
(1);
sclk=1;
end;
endsend1302;
wbyt1:
procedure(com,dat);/*字节写过程*/
declare(com,dat)byte;
callclear;
rst=1;
callsend1302(com);
callsend1302(dat);
callclear;
endwbyt1;
wbyt8:
procedure;/*时钟多字节突发模式写过程*/
declarejbyte;
callclear;
a(7)=A(6);a(6)=a(0);
rst=1;
callsend1302(command);
doj=1to8;
callsend1302(a(j));
end;
callclear;
endwbyt8;
RBYT1:
PROCEDURE;
DECLAREIBYTE;
CALLCLEAR;
RST=1;
callsend1302(0c1h);
IO=1;
DOI=0TO7;
SCLK=1;
SCLK=0;
CY=IO;
N=SCR(N,1);
END;
A(8)=N;
CALLCLEAR;
ENDRBYT1;
send595:
procedure;
declarekbyte;
dok=0to7;
data=scr(data,1);
da=cy;
clk=1;
clk=0;
end;
endsend595;
send595_1:
procedure;
declarekbyte;
dok=0to7;
data=scr(data,1);
da1=cy;
clk1=1;
clk1=0;
end;
endsend595_1;
rb1:
procedure(abc,j);
DECLARE(I,j,abc)BYTE;
CALLCLEAR;
RST=1;
callsend1302(abc);
IO=1;
DOI=0TO7;
SCLK=1;
SCLK=0;
CY=IO;
N=SCR(N,1);
END;
ab(j)=N;
ab(j)=dec(ab(j));
CALLCLEAR;
endrb1;
rbyt6:
procedure;
callrb1(0f1h,0);
callrb1(0f3h,1);
callrb1(0f5h,2);
callrb1(0f7h,3);
callrb1(0f9h,4);
callrb1(0fbh,5);
callrb1(0fdh,6);
endrbyt6;
wbyt6:
procedure;
callwbyt1(8eh,0);/*writeenable*/
callwbyt1(0f0h,ab(0));
callwbyt1(0f2h,ab
(1));
callwbyt1(0f4h,ab
(2));
callwbyt1(0f6h,ab(3));
callwbyt1(0f8h,ab(4));
callwbyt1(0fah,ab(5));
callwbyt1(0fch,ab(6));
callwbyt1(8eh,80h);/*writedisable*/
endwbyt6;
rbyt8:
procedure;/*时钟多字节突发模式读过程*/
declare(i,j)byte;
callclear;
rst=1;
callsend1302(command);
io=1;
doj=1to8;
doi=0to7;
sclk=1;
calltime
(1);
sclk=0;
cy=io;
n=scr(n,1);
end;
a(j)=n;
end;
callclear;
a(0)=a(6);a(6)=A(7);
a(0)=a(0)and0fh;
ifa(0)>6thena(0)=0;
CALLRBYT1;
if(a
(1)=0anda
(2)=0anda(3)=0)then
do;
donum=0to35;
calltime(250);
end;
temp1=1;
end;
iftemp1=1then
do;
temp1=0;
ab(4)=ab(4)+1;
ifab(4)>99hthen
do;
ab(4)=0;
ab(5)=ab(5)+1;
ifab(5)>99hthenab(5)=0;
end;
callwbyt6;
end;
endrbyt8;
display:
procedure;/*jieya,yima,fasong*/
declare(i,n,m)byte;
n=a(0)and0fh;/*sendweek*/
data=week(n);
callsend595;
n=a(4);/*senddate*/
n=nand0fh;
data=aco(n);
callsend595;
n=a(4);
n=shr(n,4);
data=aco(n);
callsend595;
doi=1to3;/*sendsecond,minute,hour*/
n=a(i);
n=nand0fh;
data=aco(n);
callsend595;
n=a(i);
n=shr(n,4);
data=aco(n);
callsend595;
end;
doi=5to6;/*sendmonth,year*/
n=a(i);
n=nand0fh;
data=aco(n);
callsend595;
n=a(i);
n=shr(n,4);
data=aco(n);
callsend595;
end;
n=a(8);/*send19or20*/
n=nand0fh;
data=aco(n);
callsend595;
n=a(8);
n=shr(n,4);
data=aco(n);
callsend595;
dom=0to5;
n=ab(m);
n=nand0fh;
data=aco(n);
callsend595_1;
n=ab(m);
n=shr(n,4);
data=aco(n);
callsend595_1;
end;
ale=0;
ale=1;
enddisplay;
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;/*setdate/time(1997,7,1,8:
00:
00,week3)*/
callwbyt1(8eh,0);/*writeenable*/
callwbyt1(80h,00h);/*startcolock*/
callwbyt1(0beh,0abh);/*两个二极管与8K电阻串联充电*/
command=0beh;/*writecolock/date*/
callwbyt8;
callwbyt1(0c0h,a(8));
callwbyt1(8eh,80h);/*setwriteprotectbit*/
endbeginset;
key:
procedure;
declare(i,time1,k1,tem)byte;
calltime(100);
k1=7;time1=30;
ifmk=0then
do;
dowhiletime1>0;
week:
ifk1=0then
do;
doi=0to5;
/*callhz(a(0));*/
end;
doi=0to3;
/*callhz0;*/
end;
end;
tem=a(k1);
ifk1=7thentem=a(8);
a(k1)=0aah;
ifk1=7thena(8)=0aah;
calldisplay;
calltime(254);
calltime(254);
a(k1)=tem;
ifk1=7thena(8)=tem;
calldisplay;
calltime(254);
calltime(254);
calltime(254);
time1=time1-1;
ifmk=0then
do;calltime(100);/*MODKEYPROCESS*/
TIME1=30;
IFMK=0THEN
DO;
k1=k1-1;
DOWHILEK1=0FFH;
K1=7;
END;
END;
end;
IFSK=0THEN
DO;CALLTIME(100);/*SETKEYPROCESS*/
TIME1=30;
IFSK=0THEN
DO;
tem=tem+1;
tem=dec(tem);
DOCASEK1;
DOWHILEtem=7;/*week*/
tem=0;
END;
DOWHILEtem=60H;/*scond*/
tem=0;
END;
DOWHILEtem=60H;/*minute*/
tem=0;
END;
DOWHILEtem=24H;/*hour*/
tem=0;
END;
DOWHILEtem=32H;/*date*/
tem=1;
END;
DOWHILEtem=13H;/*month*/
tem=1;
END;
DOwhiletem=100h;/*YEAR*/
tem=00;
END;
DOWHILETEM>=21H;
tem=19H;
END;
END;
A(K1)=tem;
ifk1=7thena(8)=tem;
END;
END;
END;
END;
endkey;
main$program:
mk=1;sk=1;temp1=0;num=0;p32=1;
ifsk=0thencallbeginset;
clk=0;da=0;ale=1;
loop:
dowhilemk=1;
ifa(0)>6thena(0)=0;
command=0bfh;
callrbyt8;
calldisplay;
dowhilemk=0;
callkey;
callwbyt1(8eh,0);
command=0beh;
callwbyt8;
callwbyt1(0C0H,A(8));
callwbyt1(8eh,80h);
end;
end;
gotoloop;
endstart;