B1209 周晓闪.docx
- 文档编号:7478288
- 上传时间:2023-01-24
- 格式:DOCX
- 页数:12
- 大小:42.02KB
B1209 周晓闪.docx
《B1209 周晓闪.docx》由会员分享,可在线阅读,更多相关《B1209 周晓闪.docx(12页珍藏版)》请在冰豆网上搜索。
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); } } 实验总结: 这次的试验,让我学到了很多。 虽然这次的实验,虽然自己没有独立的编写出来这个程序,可以说几乎就没有编写,但是自己看懂了一点儿。 这次的实验,我发现我不会的还有很多,特别是将实际与理论相结合,通过这次的实验,我发现自己真的还需要多看看书,多动手做一些实验,将实际与理论结合起来。 这次实验,我懂得了很多,不会就要问,而不是就那样简简单单的就过去了,不会就算了,而是要自己多多的琢磨,多多的努力,更加的勤奋。 不管怎样,我想我以后会更加的努力,这几次的实验,我发现自己在慢慢的进步,我相信,以后会更好。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- B1209 周晓闪