8路温度传感器采集系统
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
shub(LedNumVal);
for(i=0; i<5; i++)
{
switch(i)
{
case 0:LSA=1;LSB=0;LSC=0;LSD=0;LSE=0; break;
case 1:LSA=0;LSB=1;LSC=0;LSD=0;LSE=0; break;
case 2:LSA=0;LSB=0;LSC=1;LSD=0;LSE=0; break;
void tmpwritebyte(uchar dat);
void tmpchange(void);
uint tmp();
sbit DS=P3^7;
uint temp;
void delay(uint count) //delay
{
uint i;
while(count)
{
i=200;
while(i>0)
LedOut[2]=Disp_Tab[temp%1000/100];
LedOut[3]=Disp_Tab[temp%100/10];//十位
LedOut[4]=Disp_Tab[temp%10]; //个位
if(fl==0)
{
if((temp/10)==0) LedOut[3]=Disp_Tab[10];
{
uint i;
uchar j;
bit testb;
for(j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if(testb) //write 1
{
DS=0;
i++;i++;
DS=1;
i=8;
while(i>0)
i--;
}
else
{
DS=0; //write 0
i=8;
//mainn.c
#include <reg51.H>
extern showled();
extern void tmpchange(void);//声明引用外部函数
unsigned int idata wei=1;
void delaym(unsigned int i);
unsigned int idata weim[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
case 3:LSA=0;LSB=0;LSC=0;LSD=1;LSE=0; break;
case 4:LSA=0;LSB=0;LSC=0;LSD=0;LSE=1; break;
}
P0 = LedOut[i] ;
delaym(100);
}
P0 =0xff;
}
void shub(uint temp)
{
uint fl,i;
tmpwritebyte(0xbe);
a=tmpread(); //读低8位
b=tmpread(); //读高8位
temp=b;
temp<<=8; //two byte compose a int variable两个字节组合为1个字
temp=temp|a;
return temp;
}
仿真
tmpwritebyte(0x44); // initiates a single temperature conversion写温度转换指令
}
uint tmp() //get the temperature读取寄存器中存储的温度数据
{
uchar a,b;
dsreset();
delay(1);
tmpwritebyte(0xcc);
{
uchar i,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j=tmpreadbit();
dat=(j<<7)|(dat>>1); //读出的数据最低位在最前面,这样刚好一个字节在DAT里
}
return(dat);
}
void tmpwritebyte(uchar dat) //write a byte to ds18b20向1820写一个字节数据函数
i--;
count--;
}
}
///////功能:串口初始化,波特率9600,方式1///////
void dsreset(void) //send reset and initialization command 18B20复位,初始化函数
{
uint i;
DS=0;
i=103;
while(i>0)i--;
for(j = 200; j > 0; j--);
}
//show.c
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
extern unsigned int idata wei;
extern unsigned int tmp();
else if(temp/100==0)LedOut[2]=Disp_Tab[10];
else if(temp/1000==0)LedOut[1]=Disp_Tab[10];
}
}
//wendu.c
/*************************此部分为18B20的驱动程序*************************************/
while(i>0)
i--;
DS=1;
i++;i++;
}
}
}
void tmpchange(void) //DS18B20 begin change开始获取数据并转换
{
dsreset();
delay(1);
tmpwritebyte(0xcc); // address all drivers on bus写跳过读ROM指令
DS=1;
i=4;
while(i>0)i--;
}
bit tmpreadbit(void) //read a bit读1位数据函数
{
uint i;
bit dat;
DS=0;i++; //延时
DS=1;i++;i++;
dat=DS;
i=8;while(i>0)i--;
return (dat);
}
uchar tmpread(void) //read a byte date读1字节函数
unsigned long LedOut[5],LedNumVal;
void showled()
{
/********以下将读18b20的数据送到LED数码管显示*************/
int i;
LedNumVal=tmp(); //把实际温度送到LedNumVal变量中
LedOut[0]=Disp_Tab[wei+1];
#include <reg52.H>
#define uchar unsigned char
#define uint unsigned int
void delay(uint count);
void dsreset(void);
bit tmpreadbit(void);
uchar tmpread(void);
void showled();
void shub(uint temp);
extern delaym(unsigned int i);
sbit LSA=P2^0; //管脚定义
sbit LSB=P2^1;
sbit源自文库LSC=P2^2;
sbit LSD=P2^3;
sbit LSE=P2^4;
unsigned char code Disp_Tab[] = {0x40,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};
void main()
{
int i,j;
for(i=0;i<8;i++)
{
wei=i;
P1=weim[wei];
for(j=0;j<100;j++)
{
tmpchange();
showled();
}
}
}
//延时程序
void delaym(unsigned int i)
{
char j;
for(i; i > 0; i--)
if(temp&0x8000)
{
temp=~temp;
temp+=1;
fl=0;
}
else fl=1;
i=temp*0.0625; //温度在寄存器中是12位,分辨率是0.0625
temp=i*10+0.5; //乘10表示小数点后只取1位,加0.5是四折五入
temp=temp/10;
LedOut[1]=Disp_Tab[temp%10000/1000];
for(i=0; i<5; i++)
{
switch(i)
{
case 0:LSA=1;LSB=0;LSC=0;LSD=0;LSE=0; break;
case 1:LSA=0;LSB=1;LSC=0;LSD=0;LSE=0; break;
case 2:LSA=0;LSB=0;LSC=1;LSD=0;LSE=0; break;
void tmpwritebyte(uchar dat);
void tmpchange(void);
uint tmp();
sbit DS=P3^7;
uint temp;
void delay(uint count) //delay
{
uint i;
while(count)
{
i=200;
while(i>0)
LedOut[2]=Disp_Tab[temp%1000/100];
LedOut[3]=Disp_Tab[temp%100/10];//十位
LedOut[4]=Disp_Tab[temp%10]; //个位
if(fl==0)
{
if((temp/10)==0) LedOut[3]=Disp_Tab[10];
{
uint i;
uchar j;
bit testb;
for(j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if(testb) //write 1
{
DS=0;
i++;i++;
DS=1;
i=8;
while(i>0)
i--;
}
else
{
DS=0; //write 0
i=8;
//mainn.c
#include <reg51.H>
extern showled();
extern void tmpchange(void);//声明引用外部函数
unsigned int idata wei=1;
void delaym(unsigned int i);
unsigned int idata weim[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
case 3:LSA=0;LSB=0;LSC=0;LSD=1;LSE=0; break;
case 4:LSA=0;LSB=0;LSC=0;LSD=0;LSE=1; break;
}
P0 = LedOut[i] ;
delaym(100);
}
P0 =0xff;
}
void shub(uint temp)
{
uint fl,i;
tmpwritebyte(0xbe);
a=tmpread(); //读低8位
b=tmpread(); //读高8位
temp=b;
temp<<=8; //two byte compose a int variable两个字节组合为1个字
temp=temp|a;
return temp;
}
仿真
tmpwritebyte(0x44); // initiates a single temperature conversion写温度转换指令
}
uint tmp() //get the temperature读取寄存器中存储的温度数据
{
uchar a,b;
dsreset();
delay(1);
tmpwritebyte(0xcc);
{
uchar i,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j=tmpreadbit();
dat=(j<<7)|(dat>>1); //读出的数据最低位在最前面,这样刚好一个字节在DAT里
}
return(dat);
}
void tmpwritebyte(uchar dat) //write a byte to ds18b20向1820写一个字节数据函数
i--;
count--;
}
}
///////功能:串口初始化,波特率9600,方式1///////
void dsreset(void) //send reset and initialization command 18B20复位,初始化函数
{
uint i;
DS=0;
i=103;
while(i>0)i--;
for(j = 200; j > 0; j--);
}
//show.c
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
extern unsigned int idata wei;
extern unsigned int tmp();
else if(temp/100==0)LedOut[2]=Disp_Tab[10];
else if(temp/1000==0)LedOut[1]=Disp_Tab[10];
}
}
//wendu.c
/*************************此部分为18B20的驱动程序*************************************/
while(i>0)
i--;
DS=1;
i++;i++;
}
}
}
void tmpchange(void) //DS18B20 begin change开始获取数据并转换
{
dsreset();
delay(1);
tmpwritebyte(0xcc); // address all drivers on bus写跳过读ROM指令
DS=1;
i=4;
while(i>0)i--;
}
bit tmpreadbit(void) //read a bit读1位数据函数
{
uint i;
bit dat;
DS=0;i++; //延时
DS=1;i++;i++;
dat=DS;
i=8;while(i>0)i--;
return (dat);
}
uchar tmpread(void) //read a byte date读1字节函数
unsigned long LedOut[5],LedNumVal;
void showled()
{
/********以下将读18b20的数据送到LED数码管显示*************/
int i;
LedNumVal=tmp(); //把实际温度送到LedNumVal变量中
LedOut[0]=Disp_Tab[wei+1];
#include <reg52.H>
#define uchar unsigned char
#define uint unsigned int
void delay(uint count);
void dsreset(void);
bit tmpreadbit(void);
uchar tmpread(void);
void showled();
void shub(uint temp);
extern delaym(unsigned int i);
sbit LSA=P2^0; //管脚定义
sbit LSB=P2^1;
sbit源自文库LSC=P2^2;
sbit LSD=P2^3;
sbit LSE=P2^4;
unsigned char code Disp_Tab[] = {0x40,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};
void main()
{
int i,j;
for(i=0;i<8;i++)
{
wei=i;
P1=weim[wei];
for(j=0;j<100;j++)
{
tmpchange();
showled();
}
}
}
//延时程序
void delaym(unsigned int i)
{
char j;
for(i; i > 0; i--)
if(temp&0x8000)
{
temp=~temp;
temp+=1;
fl=0;
}
else fl=1;
i=temp*0.0625; //温度在寄存器中是12位,分辨率是0.0625
temp=i*10+0.5; //乘10表示小数点后只取1位,加0.5是四折五入
temp=temp/10;
LedOut[1]=Disp_Tab[temp%10000/1000];