基于51单片机的温度数据采集程序

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

/*基于51单片机的温度数据采集程序*/ #include

#include

#define uint unsigned int

#define uchar unsigned char

uchar set_up; //温度设定值

uint temper;

sbit FM=P2^3; //蜂鸣器报警

sbit DQ=P2^4;

sbit dula=P2^6; //数码管段选

sbit wela=P2^7; //数码管位选

sbit key1=P3^4; //按键

sbit key2=P3^5;

sbit key3=P3^6;

sbit key4=P3^7;

uchar code table[]={

0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,

0x39,0x5e,0x79,0x71};

void delay(uint z) //延时函数1ms

{

uint x,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);

}

void delay_reset(uint t) //延时函数11us

{

for(;t>0;t--);

}

void DS18B20_reset(void) //DS18B20初始化函数{

bit flag=1;

while (flag)

{

while (flag)

{

DQ = 1;

delay_reset(1);

DQ = 0;

delay_reset(50); // 延时550us

DQ = 1;

delay_reset(6); //延时66us

flag=DQ;

}

delay_reset(45); //延时500us

flag=~DQ;

}

DQ=1;

}

void write_byte(uchar val) //DS18B20写一个字节函数{

uchar i;

for (i=0; i<8; i++)

{

DQ = 1;

_nop_();

DQ = 0;

_nop_();

_nop_();

DQ = val & 0x01; //最低位移出

delay_reset(6);

val >>= 1; //右移一位

}

DQ = 1;

delay_reset(1);

}

uchar read_byte(void) //DS18B20读一个字节函数{

uchar i,value=0;

for (i=0; i<8; i++)

{

DQ=1;

_nop_();

value >>= 1;

DQ = 0;

_nop_();

_nop_();

DQ = 1;

_nop_();

_nop_();

if (DQ)

value|=0x80;

delay_reset(6); //延时66us }

DQ=1;

return(value);

}

void display(uchar temp) //数码管显示函数{

uchar bai,shi,ge;

bai = temp/100; //百位

shi= temp%100/10; //十位

ge= temp%10; //个位

dula=1;

P0=table[bai];

dula=0;

P0=0xff;

wela=1;

P0=0xfe;

wela=0;

delay(1);

dula=1;

P0=table[shi];

dula=0;

P0=0xff;

wela=1;

P0=0xfd;

wela=0;

delay(1);

dula=1;

P0=table[ge];

dula=0;

P0=0xff;

wela=1;

P0=0xfb;

wela=0;

delay(1);

}

uint Get_Tem() //获取温度函数

{

uchar a,b;

DS18B20_reset(); //初始化

write_byte(0xCC); //忽略ROM指令

write_byte(0x44); //温度转换指令

delay(500); // 等待温度转换完成

DS18B20_reset(); //初始化

write_byte(0xCC); //忽略ROM指令

write_byte(0xBE); //读暂存器指令

a = read_byte(); //读取到的第一个字节为温度LSB

b = read_byte(); //读取到的第一个字节为温度MSB

temper=b; //先把高八位有效数据赋于temper

temper<<= 8; //把以上8位数据从temper低八位移到高八位temper=temper|a; //两字节合成一个整型变量

temper=temper*0.0625; //得到真实十进制温度值

return temper;

}

void keyscan() //按键扫描函数

{

if(key1==0) //调节设定值键

{

delay(10); //按键去抖

if(key1==0)

display(set_up);

while(!key1); //直到按键释放,否则不退出循环

while(key4) //判断有无返回键按下

{

if(key2==0) //设定值加1键

{

delay(10);

if(key2==0)

{

if(set_up>=125)

set_up=0;

else

相关文档
最新文档