资源简介
总线形式的访问多个DS18B20温度传感器的程序。程序已经测试过,试过7个DS18B20正常访问。要连接多个DS18B20要考虑其供电,最好单独供电。
用的AT89S52的单片机,程序注释里有硬件连接。
代码片段和文件信息
//读者须知:
//若要用这个程序,LCD的D0-D7跟单片机的P2口连。LCD用得是1602,LCD的第4脚与单片机的P3.5脚,LCD的第6脚与单片机的P3.4连
//LCD的第5脚接地。DS18B20的数据线(中间的引脚)接单片机的P1.0。单片机用的是AT89S52.
//这个程序,本人测试过了,测试过单总线上7个DS18B20的连接,并能正确读到。
//
//序列号只能一位一位读出来,先写个程序读出序列号,然后可以针对某一个DS18B20进行操作
//需要注意的是:若单总线上有多个DS18B20时,读不到正确的序列号,因为单片机在总线上发出读序列号的命令后
//每一个DS18B20都会开始上传自己的序列号,因此读不到正确的序列号,只能一个一个地读序列号。
#include
#include
#define uchar unsigned char
#define uint unsigned int
sbit ds=P1^0; //温度传感器DS18B20信号线与P1.0连
uint temptemp1temp2temp3temp4temp5temp6temp7temp8numnum1;
float f_temp;
uchar D1_ROM_ID[8];
uchar D2_ROM_ID[8];
//通过调用“read_and_display_DS18B20_ROMID()” 在1602液晶里显示序列号,如何读到正确的序列号,请
//参考read_and_display_DS18B20_ROMID()的说明,读出正确的序列号后,把序列号填到下面的数组里面,
//然后通过调用“get_temperature(DD1_ROM_ID)” 得到总线上指定的DS18B20的温度,而不会读到其它的DS18B20的温度。
//需要注意的是:若单总线上有多个DS18B20时,读不到正确的序列号,因为单片机在总线上发出读序列号的命令后
//每一个DS18B20都会开始上传自己的序列号,因此读不到正确的序列号,只能一个一个地读序列号。
uchar code DD1_ROM_ID[8]={0x280x0b0x0f0x0d0x020x000x000x5b};
uchar code DD2_ROM_ID[8]={0x280xc10xdc0x0c0x020x000x000x94};
//液晶1602部分--start
sbit LCDen=P3^4; //液晶LCD1602的第6脚与P3.4连
sbit LCDrs=P3^5; //液晶LCD1602的第4脚与P3.5连
unsigned char code table[]=“I LOVE MCU!“;
unsigned char code table1[]=“WWW.WZVCST.COM“;
//液晶1602部分--end
//延时xms毫秒
void delay(uint xms)
{
uint ij;
for(i=xms;i>0;i--)
for(j=120;j>0;j--);
}
//R/W-->GNDno used 液晶的第5脚没有用到,直接接地。因为往液晶里写数据就显示,所以只需要接地。
//不需要从液晶里读数据,所以这根脚就直接接地。
//往液晶里写命令:如清屏,设置显示的位置等。
void write_com(uchar com)
{
LCDrs=0;
P2=com;
delay(5);
LCDen=1;
delay(5);
LCDen=0;
}
//往液晶里写数据:要显示的数据,通过此程序来写进液晶里去。
void write_data(uchar date)
{
LCDrs=1;
P2=date;
delay(5);
LCDen=1;
delay(5);
LCDen=0;
}
//液晶部分--start:1602的初始化
void LCD_init()
{
write_com(0x38); //P150 tale7.2.6
write_com(0x0c); //open display not display cursor
write_com(0x06); //address point add one after write a char
write_com(0x01); //clear the LCD and data point
}
//液晶部分--end:1602的初始化
//DS18B20的相关程序--start
void dsreset(void) //DS18B20复位,初始化函数
{
uint i;
ds=1;
i++;
ds=0;
i=400;
while(i>0)i--;
ds=1;
// i=4;
i=8;
while(i>0)i--;
}
bit tempreadbit(void) //读1位数据函数
{
uint i;
bit dat;
ds=1;i++;
ds=0;i++;i++; i++;i++;
ds=1;i++;i++;
dat=ds;
i=30;while(i>0)i--; //i=8;while(i>0)i--; ;若是i=8,只能检测到5个 3
return(dat);
}
uchar tempread(void) //读1个字节数据函数
{
uchar ijdat;
dat=0;
for(i=1;i<=8;i++)
{
j=tempreadbit();
dat=(j<<7)|(dat>>1);
}
return dat;
}
void tempwritebyte(uchar dat) //向DS18B20写一个字节数据函数
{
uint i;
uchar j;
bit testb;
for(j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if(testb)
{
ds=0;
i++;i++;
ds=1;
i=8;while(i>0)i--;
}
else
{
ds=0;
i=8;while(i>0)i--;
ds=1;
i++;i++;
}
}
}
void tempchange(void) //DS18B20开始获取温度并转换
{
dsreset();
delay(1);
tempwritebyte(0xcc);
tempwri
相关资源
- 单片机音乐倒数定时器的设计
- ds18b20温度传感器编程指令功能
- 温度传感器DS18B20序列号批量搜索算法
- FreeRTOS采样ADC+KEY事件信号+DMA串口收发
- STC15F
- 51单片机通信采样proteus仿真方波转化
- 51 单片机 红外避障小车 大集合136
- STC8951系列单片机中方指南
- 基于MCS_51单片机的工业屏柜散热方案
- MCS_51单片机与8255A的接口设计
- 飞思卡尔单片机MC9S12XS12G128驱动(硬件
- 51单片机PWM程序,占空比、周期可调整
- 单片机和adc0809数字电压表
- PIC单片机完成的电子密码锁
- 单片机、ADC0808809设计简易数字电压表
- 51单片机多功能自行车测速仪
- 单片机做的6位时分秒数字钟
- 单片机电子时钟 闹钟 日历
- 音乐代码转换软件 单片机编程时用
- 单片机课程设计 篮球计分器
- 00
- 用51单片机实现G代码翻译
- 简易的电阻电容测量电路
- 单片机与温度传感器DS18B20的程序设计
- 毕业论文之温度传感器DS18B20(源码
- 51单片机基于protues的几个仿真实例
- 基于52单片机的直流电压测量
- 38k单片机红外发送代码、keil
- 51单片机PCB设计图
- PC -- 单片机的串口数据传输系统设计
评论
共有 条评论