一个单片机控制两个DS18B20,该注意什么问题,进行ROM匹配么?急需解答啊,哪位高手帮帮我啊!

作者&投稿:昌英 (若有异议请与网页底部的电邮联系)
2个关于单片机的题目急需解答!~

1.ROM的片内存储对应的地址是0000H~0FFFH,片外呢
片外要另外按装ROM芯片,其可用的地址范围是:1000H~FFFFH。

2.下列程序执行后,A,B,R0内容是什么!
MOV 30H,#60H
MOV R0,#60H ;R0 = 60H
MOV A ,30H ;A = 60H
MOV B,A ;B = 60H
MOV @R0 ,B

都是60H。

/*-----------------------------------------------
名称:18B20温度传感器
内容:18B20单线温度检测的应用样例程序,请将18b20插紧,
然后在数码管可以显示XX.XC,C表示摄氏度,如显示25.3C表示当前温度25.3度
------------------------------------------------*/
#include //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#include
#include
#define uchar unsigned char
#define uint unsigned int;
/******************************************************************/
/* 定义端口 */
/******************************************************************/
sbit seg1=P2^0;
sbit seg2=P2^1;
sbit seg3=P2^2;
sbit DQ=P1^3;//ds18b20 端口
sfr dataled=0x80;//显示数据端口
/******************************************************************/
/* 全局变量 */
/******************************************************************/
uint temp;
uchar flag_get,count,num,minute,second;
uchar code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//7段数码管段码表共阳
uchar str[6];
/******************************************************************/
/* 函数声明 */
/******************************************************************/
void delay1(uchar MS);
unsigned int ReadTemperature(void);
void Init_DS18B20(void);
unsigned char ReadOneChar(void);
void WriteOneChar(unsigned char dat);
void delay(unsigned int i);
/******************************************************************/
/* 主函数 */
/******************************************************************/
main()
{
unsigned char TempH,TempL;
TMOD|=0x01;//定时器设置
TH0=0xef;
TL0=0xf0;
IE=0x82;
TR0=1;
P2=0x00;
count=0;
while(1)
{
str[5]=0x39; //显示C符号
str[1]=tab[TempH/100]; //百位温度
str[2]=tab[(TempH%100)/10]; //十位温度
str[3]=tab[(TempH%100)%10]|0x80; //个位温度,带小数点
str[4]=tab[TempL];
if(flag_get==1) //定时读取当前温度
{
temp=ReadTemperature();
if(temp&0x8000)
{
str[0]=0x40;//负号标志
temp=~temp; // 取反加1
temp +=1;
}
else
str[0]=0;
TempH=temp>>4;
TempL=temp&0x0F;
TempL=TempL*6/10;//小数近似处理
flag_get=0;
}
}
}

/******************************************************************/
/* 定时器中断 */
/******************************************************************/
void tim(void) interrupt 1 using 1//中断,用于数码管扫描和温度检测间隔
{
TH0=0xef;//定时器重装值
TL0=0xf0;
num++;
if (num==50)
{num=0;
flag_get=1;//标志位有效
second++;
if(second>=60)
{second=0;
minute++;
}
}
count++;
if(count==1)
{P2=0;
dataled=str[0];}//数码管扫描
if(count==2)
{P2=1;
dataled=str[1];}
if(count==3)
{ P2=2;
dataled=str[2];
}
if(count==4)
{ P2=3;
dataled=str[3];
}
if(count==5)
{ P2=4;
dataled=str[4];
}
if(count==6)
{ P2=5;
dataled=str[5];
count=0;}
}
/******************************************************************/
/* 延时函数 */
/******************************************************************/
void delay(unsigned int i)//延时函数
{
while(i--);
}
/******************************************************************/
/* 初始化 */
/******************************************************************/
void Init_DS18B20(void)
{
unsigned char x=0;
DQ = 1; //DQ复位
delay(8); //稍做延时
DQ = 0; //单片机将DQ拉低
delay(80); //精确延时 大于 480us
DQ = 1; //拉高总线
delay(10);
x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
delay(5);
}
/******************************************************************/
/* 读一个字节 */
/******************************************************************/
unsigned char ReadOneChar(void)
{
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(5);
}
return(dat);
}
/******************************************************************/
/* 写一个字节 */
/******************************************************************/
void WriteOneChar(unsigned char dat)
{
unsigned char i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01;
delay(5);
DQ = 1;
dat>>=1;
}
delay(5);
}
/******************************************************************/
/* 读取温度 */
/******************************************************************/
unsigned int ReadTemperature(void)
{
unsigned char a=0;
unsigned int b=0;
unsigned int t=0;
Init_DS18B20();
WriteOneChar(0xCC); // 跳过读序号列号的操作
WriteOneChar(0x44); // 启动温度转换
delay(200);
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
a=ReadOneChar(); //低位
b=ReadOneChar(); //高位
b<<=8;
t=a+b;
return(t);
}

用两个IO控制的就不说了和控制一个18b20一样 如果你采用一个IO口控制的话需要进行ROM匹配
你可以先用一个测序列号的程序测出2个18b20的IP
然后在测温程序中直接匹配就行了
下面是度序列号的程序 用1602显示的 程序已通过测试 如果对你有用的话在给你测温的程序
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit lcdrs=P2^1;
sbit lcden=P2^2;
sbit DQ=P2^0;
uchar ID[8];//定义一个数组来存放序列号
uchar sn1,sn2,sn3,sn4,sn5,sn6,sn7,sn8;
void longdelay(uint count)
{
uint i,j;
for(i=0;i<count;i++)
for(j=0;j<10;j++);
}
void delay(uchar count)
{
uchar i;
for(i=0;i<count;i++);
}

void write_com(uchar com) //lcd写命令函数
{
lcdrs=0;
P1=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}

void write_data(uchar date) //lcd写数据函数
{
lcdrs=1;
P1=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void initlcd() //lcd初始化函数
{
lcden=0;
write_com(0x01);
write_com(0x38);
write_com(0x0e);
write_com(0x06);

}

void init_18b20() //初始化18b20
{
uchar n;
DQ=1;
delay(8);
DQ=0;
delay(80);
DQ=1;
delay(8);
n=DQ;
delay(4);

}

void write_byte(uchar dat) //向18b20中写一个字节
{
uchar i;
for(i=0;i<8;i++)
{
DQ=0;
DQ=dat&0x01;
delay(4);
dat>>=1;
DQ=1;
}
delay(4);
}

uchar read_byte() //从18b20中读取一个字节
{
uint value,i;
for(i=0;i<8;i++)
{
DQ=0;
value>>=1;
DQ=1;
if(DQ)
value=value|0x80;
delay(4);
}
return value;

}

void readrom() //read the serial 读取温度传感器的序列号子函数
{
init_18b20();
longdelay(1);
write_byte(0x33);
sn1=read_byte();
ID[7]=sn1;
sn2=read_byte();
ID[6]=sn2;
sn3=read_byte();
ID[5]=sn3;
sn4=read_byte();
ID[4]=sn4;
sn5=read_byte();
ID[3]=sn5;
sn6=read_byte();
ID[2]=sn6;
sn7=read_byte();
ID[1]=sn7;
sn8=read_byte();
ID[0]=sn8;
}

void lcd_display()//显示函数
{
uchar i,h,l;
write_com(0x80);
for(i=0;i<8;i++)
{
l=ID[i]&0x0f; //取低4位
h=ID[i]&0xf0; //取高4位 */
h>>=4;
if((h>=0x00)&&(h<=0x09))
write_data(h+0x30); //取ASCII码
else
write_data(h+0x37); //取ASCII码

if((l>=0x00)&&(l<=0x09))
write_data(l+0x30); //取ASCII码
else
write_data(l+0x37); //取ASCII码
}
/* write_com(0x80+0x40);
for(i=4;i<8;i++)
{
l=ID[i]&0x0f; //取低4位
h=ID[i]&0xf0; //取高4位
h>>=4;
if((h>=0x00)&&(h<=0x09))
write_data(h+0x30); //取ASCII码
else
write_data(h+0x37); //取ASCII码

if((l>=0x00)&&(l<=0x09))
write_data(l+0x30); //取ASCII码
else
write_data(l+0x37); //取ASCII码
} */
}

void main()
{
initlcd();
readrom();//读取序列号
while(1)
{
lcd_display();//在1602上显示序列号
longdelay(6000);
}
}

分别建立两个 9个字节的 缓存(全局变量)
分别读取?
要是不够可以这样建立1个 9个字节的 缓存(全局变量)
用于输出
主程序里分别读取

释放总线问题

在写ds18b02时下到单片机中只有一个数码管亮,一个微亮,显示为5且数值...
答:显示数值是85吧 表示ds18b20读取数据,没有成功 只有一个数码管亮,一个微亮 这个是你,显示程序有问题。看看各部分的延时。肯定是一个延时长,一个延时短,要调一下

关于DS18B20单片机C编程及仿真问题 附我的仿真图 另外需知道数码管的...
答:显然你少了一些子程序。缺少read_bit();write_bit();

DS18B02温度读不出来,只能读出0XFF
答:温度(temperature)是表示物体冷热程度的物理量,微观上来讲是物体分子热运动的剧烈程度。温度只能通过物体随温度变化的某些特性来间接测量,而用来量度物体温度数值的标尺叫温标。DS18B02是有时娇气点,对使用时序操作很严格,如果一点做错了,可能测不出来!还有那些延时程序,必须要精确延时,按DATASHEET上...

请问我用DS18B20编写的程序,想通过7段数码管显示温度,为什么数据显示不...
答:我感觉应该从两个方面来分析这个问题,首先,你的扫描数码管显示程序(display函数)中的延时是不是很合理,一般来说频率大于25hz人眼就将显示当作是连续的了,所以这个延时最好不能大于0.013S(你这儿是三位数码管),我没有仿真你这个延时函数,所以你得自己仿真一下,或者看下书上的延时函数。再者...

DS18B20无法初始化
答:仅是关注一下。如果您用“delay(80); ”精确延时大于480us,那么我认为您用“delay(140);”来等待绝对时间超长了。DS18B20数据手册明确要求,拉低480~960us后拉高,等待15~60us。DS18B20如果正常,会反馈60~240us的低电平,从您拉高到反馈结束总计不会超过480us,也就是说“delay(80); ”就已经...

单片机通过USB接口与计算机通讯电路图
答:如图所示:需要单片机51,温度传感器18B02。USB转RS485的转串口线。直接用serialport控件,设置通讯参数,然后向串口发数据。比如发1,然后使用事件触发接收单片机的数据,如果两侧通讯没问题,电脑会收到2,然后把它显示出来或者做其他处理。

用单片机做温度监控需要购买那些器件?在线等,急求,谢谢!!
答:温度器件,如铂电阻,需要根据你要测的具体范围选型 测温电路,如简单分压,或用恒流源,看你选的温度器件与所需要的测量精度而定 单片机最小系统所需的器件,看你用啥单片机而定 其它,比如有无通讯要求或显示要求 总之,成本从几块钱到几百块都能做,先明确需求,然后才能确定选啥方案,最后才知道...

急求一个 DS18B2O感温 然后 at89c51单片机控制2267发射信号的程序 及...
答:不明白你的意思啊

基于51系列的单片机和DS1302时钟芯片以及液晶显示的lcd1602电子万年历毕...
答:累加器ACC是一个8位的存储单元,是用来放数据的。但是,这个存储单元有其特殊的地位,是单片机中一个...void write_sfm(uchar add,uchar dat)//向LCD写时分秒,有显示位置加、现示数据,两个参数{ uchar ...//Init_DS18B20();//温度传感器DS18b2初始化子函数,在头文件中 flag=ReadTemperature();//将18b2...

请单片机高手分析下面程序WARNING L16: UNCALLED SEGMENT, IGNORED F...
答:程序本身是对的,只是其中定义了一些变量或者函数没有被调用到就会出现这个警告。我看了就是 void busy()这个函数没有用到,只要将它注释掉就不会出现警告!