B1209 周晓闪.docx

上传人:b****5 文档编号:7478288 上传时间:2023-01-24 格式:DOCX 页数:12 大小:42.02KB
下载 相关 举报
B1209 周晓闪.docx_第1页
第1页 / 共12页
B1209 周晓闪.docx_第2页
第2页 / 共12页
B1209 周晓闪.docx_第3页
第3页 / 共12页
B1209 周晓闪.docx_第4页
第4页 / 共12页
B1209 周晓闪.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

B1209 周晓闪.docx

《B1209 周晓闪.docx》由会员分享,可在线阅读,更多相关《B1209 周晓闪.docx(12页珍藏版)》请在冰豆网上搜索。

B1209 周晓闪.docx

B1209周晓闪

洛阳理工学院实验报告

系别

计算机系

班级

B120502

学号

B12050209

姓名

周晓闪

课程名称

单片机原理与应用

实验日期

2014.6.4

实验名称

线数字式温度传感器DS18B20应用设计

成绩

实验目的:

掌握DS18B20温度传感器的原理,和LCD液晶显示的原理。

实验条件:

电脑一台、KeiluVision4编程软件、Proteus仿真软件。

【实验原理】

电路原理图如图1所示,图中

分别与传感器U2和U3相连,P0口接LCD液晶显示模块。

图1实验原理图

【实验内容】

(1)掌握温度传感器和液晶显示的软件编程;

(2)完成此次实验的C51语言编程。

【实验步骤】

(1)提前阅读与实验有关的阅读材料;

(2)在ISIS中完成电路原理图的绘制;

(3)采用KeiluVision4编程软件进行编程。

【仿真结果】

图2仿真结果图

【源程序】

#include

#include

#defineucharunsignedchar

#defineuintunsignedint

sbitRS=P2^0;

sbitRW=P2^1;

sbitEN=P2^2;

sbitDQ=P3^3;

ucharcodestr1[]={0x28,0x08,0xA7,0xBA,0x02,0x00,0x00,0x18};//ROM1序列号可用程序检测出来

ucharcodestr2[]={0x28,0x0C,0xBA,0xBA,0x02,0x00,0x00,0x54};//ROM2

ucharcodetable[8]={0x0c,0x12,0x12,0x0c,0x00,0x00,0x00,0x00};//摄氏温度符号

uchardatadisdata[5];

uinttvalue;//温度值

uchartflag;//温度正负标志

/*************************lcd1602程序**************************/

voiddelay1ms(uintms)//延时1毫秒(不够精确的)

{uinti,j;

for(i=0;i

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);

}

}

 

实验总结:

这次的试验,让我学到了很多。

虽然这次的实验,虽然自己没有独立的编写出来这个程序,可以说几乎就没有编写,但是自己看懂了一点儿。

这次的实验,我发现我不会的还有很多,特别是将实际与理论相结合,通过这次的实验,我发现自己真的还需要多看看书,多动手做一些实验,将实际与理论结合起来。

这次实验,我懂得了很多,不会就要问,而不是就那样简简单单的就过去了,不会就算了,而是要自己多多的琢磨,多多的努力,更加的勤奋。

不管怎样,我想我以后会更加的努力,这几次的实验,我发现自己在慢慢的进步,我相信,以后会更好。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 电子电路

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1