logo资料库

实验一 基于DS18B20温度测量与显示实验.docx

第1页 / 共8页
第2页 / 共8页
第3页 / 共8页
第4页 / 共8页
第5页 / 共8页
第6页 / 共8页
第7页 / 共8页
第8页 / 共8页
资料共8页,全文预览结束
实验一 基于 DS18B20 温度测量与显示实验 1 一、基本概念 单总线、DS18B20、温度测量 二、实验目的 1.学习单总线电路的接口工作原理; 2.了解 DS18B20 的工作原理、内部寄存器及接口时序; 与传统的热敏电阻相比,他能够直接读出被测温度并且可根据实 际要求通过简单的编程实现 9~12 位的数字值读数方式。可以分别在 93.75 ms 和 750 ms 内完成 9 位和 12 位的数字量,并且从 DS18B20 读出的信息或写入 DS18B20 的信息仅需要一根口线(单线接口)读写, 温度变换功率来源于数据总线,总线本身也可以向所挂接的 DS18B20 供电,而无需额外电源。因而使用 DS18B20 可使系统结构更趋简单, 可靠性更高。 3.掌握 DS18B20 的温度采集程序编程技术。 三、实验要求 1.掌握单总线电路的接口工作原理; 2.掌握 DS18B20 的编程方法。 四、实验内容 利用 DS18B20 模块电路与单片机连接,构成室温数字采集与数码管显 示。 五、实验电路图及其结果 1
2 六、实验代码 //接 ds18b20 数据端口 #include #define uchar unsigned char #define uint unsigned int sbit DQ=P3^0; sbit p20=P2^0; sbit p21=P2^1; sbit p22=P2^2; sbit p23=P2^3; code uchar tab[]={0xc0,0xF9,0xA4,0xB0,0x99,0x92, //0~9 code uchar tab1[]={0x40,0x79,0x24,0x30,0x19,0x12, 0x82,0xF8,0x80,0x90}; 0x02,0x78,0x00,0x10}; uchar a,b,t; uchar bai,shi,ge; 2
3 void delay(unsigned int i) { while(i--); } { int_DS18B20()//对 ds18b20 初始化 //DQ 复位 //延时 //单片机将 DQ 拉低 //精度延时大于 480us //拉高总线 //x=0 则初始化成功,x=1 则初始化失败 unsigned char x=0; DQ=1; delay(8); DQ=0; delay(80); DQ=1; delay(10); x=DQ; delay(20); return x; } read()//读温度数值 { unsigned char i=0; unsigned char dat=0; for(i=8;i>0;i--) {DQ=0; dat>>=1; DQ=1; if(DQ) dat|=0x80; delay(4); } return(dat); } void write(unsigned char dat) 3
4 { } unsigned char i=0; for(i=8;i>0;i--) {DQ=0; DQ=dat&0x01; delay(5); DQ=1; dat>>=1; } delay(4); void int_() { while(int_DS18B20()); write(0xCC); write(0x44); } void main() { uint count=0; P2=0xFF; int_(); delay(220); for(count=0;count<100;count++) //数码管初始化 00 {p20=1; P0=tab[0]; delay(100); p20=0; p21=1; P0=tab[0]; delay(100); p21=0; 4
5 p22=1; delay(100); p22=0; p23=1; P0=0xc6; delay(100); p23=0; } while(1) { delay(10); while(int_DS18B20()); write(0xCC); write(0xBE); a=read(); //读高八位 b=read(); //读低八位 if(b>127) //判断温度正负 B>127 为负 { a=~a; b=~b; a=a>>4; t=b<<4; t=t|a; t+=1; shi=t/10; ge=t%10; for(count=0;count<123;count++) { if(t>=10) { p20=1; P0=0xBF; delay(30); 5
6 p20=0; p21=1; P0=tab[shi]; delay(30); p21=0; p22=1; P0=tab1[ge]; delay(30); p22=0; p23=1; P0=0xc6; delay(30); p23=0; } p20=0; p21=1; P0=0xBF; delay(30); p21=0; p22=1; P0=tab1[ge]; delay(30); p22=0; p23=1; P0=0xc6; delay(30); p23=0; } 6 else { } } else {
7 count=0; a=a>>4; t=b<<4; t=t|a; bai=t/100; shi=t%100/10; ge=t%10; for(count=0;count<123;count++) {if(bai) {p20=1; P0=tab[bai]; delay(20); p20=0; } else p20=0; if(shi) {p21=1; P0=tab[shi]; delay(20); p21=0; } p21=0; p22=1; P0=tab1[ge]; delay(20); p22=0; p23=1; P0=0xc6; delay(20); p23=0; } } 7 int_();
8 } } 七、实验小结 在仿真中因为有没有晶振都一样就没有接,在选择器件时,应该 注意器件的属性,例如数码管的共阴共阳性质,避免在显示上出现问 题。 8
分享到:
收藏