for(j=0;j<100;j++);
}
voidwr_com(ucharcom)//写指令//
{delay1ms
(1);
RS=0;
RW=0;
P0=com;
delay1ms
(1);
EN=1;
delay1ms
(1);
EN=0;
}
voidwr_dat(uchardat)//写数据//
{delay1ms
(1);
RS=1;
RW=0;
P0=dat;
delay1ms
(1);
EN=1;
delay1ms
(1);
EN=0;
}
voidwr_new()//写新字符
{
uchari;
wr_com(0x40);
for(i=0;i<8;i++)
{
wr_dat(table[i]);
}
}
voidlcd_init()//初始化设置//
{delay1ms(15);
wr_com(0x38);delay1ms(5);//8位数据,双列,5*7字形
wr_com(0x08);delay1ms(5);//关显示
wr_com(0x01);delay1ms(5);//清屏
wr_com(0x06);delay1ms(5);//读或写一个字符后地址指针加一,且光标加一,整屏不移动
wr_com(0x0c);delay1ms(5);//开启显示屏,关光标,光标不闪烁
wr_new();
wr_com(0x80);
wr_dat('A');
wr_com(0x81);
wr_dat(':
');
wr_com(0x89);
wr_dat(0x00);
wr_com(0x8a);
wr_dat('C');
wr_com(0xc9);
wr_dat(0x00);//摄氏温度字符
wr_com(0xca);
wr_dat('C');
wr_com(0xc0);
wr_dat('B');
wr_com(0xc1);
wr_dat(':
');
}
/******************ds1820程序***********************/
voiddelay_18B20(uinti)//延时1微秒
{
while(i--);
}
voidds1820rst()/*ds1820复位*/
{ucharx=0;
DQ=1;//DQ复位
delay_18B20(4);//延时
DQ=0;//DQ拉低
delay_18B20(100);//精确延时大于480us
DQ=1;//拉高
delay_18B20(40);
}
uchards1820rd()/*读数据*/
{uchari=0;
uchardat=0;
for(i=0;i<8;i++)
{DQ=0;//给脉冲信号
dat>>=1;//
DQ=1;//给脉冲信号
if(DQ)
dat|=0x80;
delay_18B20(10);
}
return(dat);
}
voidds1820wr(uchardat)/*写数据*/
{uchari=0;
for(i=0;i<8;i++)
{DQ=0;
DQ=dat&0x01;
delay_18B20(10);
DQ=1;
dat>>=1;
}
}
voidb20_Matchrom(uchara)//匹配ROM
{
charj;
ds1820wr(0x55);//发送匹配ROM命令
if(a==1)
{
for(j=0;j<8;j++)
ds1820wr(str1[j]);//发送18B20的序列号,先发送低字节
}
if(a==2)
{
for(j=0;j<8;j++)
ds1820wr(str2[j]);//发送18B20的序列号,先发送低字节
}
}
read_temp(ucharz)/*读取温度值并转换*/
{uchara,b;
floattt;
ds1820rst();
ds1820wr(0xcc);//读序列号
ds1820rst();
if(z==1)
{
b20_Matchrom
(1);//匹配ROM1
}
if(z==2)
{
b20_Matchrom
(2);//匹配ROM2
}
ds1820wr(0x44);//*启动温度转换*/
delay1ms(5);
ds1820rst();
ds1820wr(0xcc);//读序列号
ds1820rst();
if(z==1)
{
b20_Matchrom
(1);//匹配ROM1
}
if(z==2)
{
b20_Matchrom
(2);//匹配ROM2
}
ds1820wr(0xbe);//*读取温度*/
a=ds1820rd();
b=ds1820rd();
tvalue=b;
tvalue<<=8;
tvalue=tvalue|a;
if(tvalue<0x07ff)
tflag=0;
else
{tvalue=~tvalue+1;
tflag=1;
}
tt=tvalue*0.0625;
tvalue=tt*10;
return(tvalue);
}
/*****************显示函数******************************/
voidds1820disp(ucharz)//温度值显示
{ucharflagdat;
disdata[0]=tvalue/1000+0x30;//百位数
disdata[1]=tvalue%1000/100+0x30;//十位数
disdata[2]=tvalue%100/10+0x30;//个位数
disdata[3]=tvalue%10+0x30;//小数位
if(tflag==0)
flagdat=0x20;//正温度不显示符号
else
flagdat=0x2d;//负温度显示负号:
-
if(disdata[0]==0x30)
{disdata[0]=0x20;//如果百位为0,不显示
if(disdata[1]==0x30)
{disdata[1]=0x20;//如果百位为0,十位为0也不显示
}
}
if(z==1)
{
wr_com(0x82);
wr_dat(flagdat);//显示符号位
wr_com(0x83);
wr_dat(disdata[0]);//显示百位
wr_com(0x84);
wr_dat(disdata[1]);//显示十位
wr_com(0x85);
wr_dat(disdata[2]);//显示个位
wr_com(0x86);
wr_dat(0x2e);//显示小数点
wr_com(0x87);
wr_dat(disdata[3]);//显示小数位
}
if(z==2)
{
wr_com(0xc2);
wr_dat(flagdat);//显示符号位
wr_com(0xc3);
wr_dat(disdata[0]);//显示百位
wr_com(0xc4);
wr_dat(disdata[1]);//显示十位
wr_com(0xc5);
wr_dat(disdata[2]);//显示个位
wr_com(0xc6);
wr_dat(0x2e);//显示小数点
wr_com(0xc7);
wr_dat(disdata[3]);//显示小数位
}
}
/********************主程序***********************************/
voidmain()
{
lcd_init();//初始化显示
while
(1)
{
read_temp
(1);//读取温度
ds1820disp
(1);//显示
read_temp
(2);//读取温度
ds1820disp
(2);//显示
//delay1ms(10000);
}
}
实验总结:
这次的试验,让我学到了很多。
虽然这次的实验,虽然自己没有独立的编写出来这个程序,可以说几乎就没有编写,但是自己看懂了一点儿。
这次的实验,我发现我不会的还有很多,特别是将实际与理论相结合,通过这次的实验,我发现自己真的还需要多看看书,多动手做一些实验,将实际与理论结合起来。
这次实验,我懂得了很多,不会就要问,而不是就那样简简单单的就过去了,不会就算了,而是要自己多多的琢磨,多多的努力,更加的勤奋。
不管怎样,我想我以后会更加的努力,这几次的实验,我发现自己在慢慢的进步,我相信,以后会更好。