18b20 c语言if判断,18B20测温(求助 C语言)

ca56232b3bbedf9a539d07f37fffb99a.gif

3144d8b7615c79d9f638db40d5689d26.gif

a218af6549b45ee526caf607ebff1358.gif

0f8df0e29816ae721419de940fb833d1.gif

18B20测温(求助 C语言)

这个程序我参考了 我们老师的思路 利用定时器来实现测温 高手请别嫌程序冗长 帮忙看看

#include "REG52.H"

#include "math.h"

#include

sbit gewei=P2^0;

sbit shiwei=P2^1;

sbit baiwei=P2^2;

sbit qianwei=P2^3;

#define uint unsigned int

#define uchar unsigned char

uchar *p,id_buff[9];

uchar temp_buff[9];

uint  adcvalue;

uchar  display_value[4]={0,0,0,0};

uchar  code gongyang[]={0xC0,0xF9,0xA4,0xB0,

0x99,0x92,0x82,0xF8,

0x80,0x90,0x88,0x83,

0xC6,0xA1,0x86,0x8E};

#define FOSC 11059200

#define SETTIME 1000

#define BAUD 9600

sbit ds18b20= P3^3;

bit flag;

uint Temperature;

uint  counttimes;

void SendData(char dat);

void delay_ms(int m);

void shumagua_test();

void Init18b20();

void TempDelay(uint us);

void  shumaguan_display();

void GemTemp();

void TemperatuerResult();

void ReadID();

void read_bytes();

void WriteByte();

uchar ReadByte();

void WriteByte();

void  timer_init();

void  inter_init();

void  timer0_inter();

void  serial_init();

void   mcu_init();

main()

{  mcu_init();

shumagua_test();

Init18b20();

timer_init();

serial_init();

inter_init();

delay_ms(10);

p=id_buff;

ReadID();

while(1)

{shumaguan_display();

}

}

void Init18b20()

{     ds18b20=1;

_nop_();

ds18b20=0;

TempDelay(550);

_nop_();

ds18b20=1;

TempDelay(120);

_nop_();

_nop_();

_nop_();

if(ds18b20==0)

flag=1;

else

flag=0;

TempDelay(550);

_nop_();

_nop_();

ds18b20=1;

}

void delay_ms(int m)

{ unsigned int i,j;

for(i=0;i

for(j=0;j<300;j++);

}

void TempDelay (uint us)

{

while(us--);

}

void shumagua_test()

{   gewei=0;

shiwei=0;

baiwei=0;

qianwei=0;

P0=0x00;

delay_ms(500);

gewei=1;

shiwei=1;

baiwei=1;

qianwei=1;

P0=0xff;

delay_ms(500);

}

/************************************************************

*Function:向18B20写入一个字节

*************************************************************/

void WriteByte (uchar wr)  //单字节写入

{

uchar i;

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

{

ds18b20 = 0;

_nop_();

ds18b20=wr&0x01;

TempDelay(5);   //delay 45 uS //5   TempDelay(2);//

_nop_();

_nop_();

ds18b20=1;

wr >>= 1;

}

}

/************************************************************

*Function:读18B20的一个字节

*************************************************************/

uchar ReadByte (void)     //读取单字节

{

uchar i,u=0;

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

{

ds18b20 = 0;

u >>= 1;

ds18b20 = 1;

if(ds18b20==1)

u |= 0x80;

TempDelay (4);  // TempDelay(2);//

_nop_();

}

return(u);

}

/************************************************************

*Function:读18B20 多字节读

*************************************************************/

void read_bytes (uchar j)

{

uchar i;

for(i=0;i

{

*p = ReadByte();

p++;

}

}

/************************************************************

*Function:读取温度

*************************************************************/

void GemTemp (void)

{

unsigned char temp1;

read_bytes (2);                        // 读取scratchpad中的值

temp1 = (temp_buff[0]>>4)&0x0f;        // 舍去小数点

if((temp_buff[0]&0x08)==0x08)        // 四舍五入

temp1 += 1;

temp1 = ((temp_buff[1]<<4)&0x70)|temp1;

Temperature = temp1;

TempDelay(1);

}

/************************************************************

*Function:读18B20ID

*************************************************************/

void ReadID (void)//读取器件 id

{

Init18b20();

WriteByte(0x33);  //read rom

read_bytes(8);

}

/************************************************************

*Function:18B20 测温处理

*************************************************************/

void TemperatuerResult(void)

{

Init18b20 ();

WriteByte(0xcc);   //skip rom

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

TempDelay(6000);

Init18b20 ();

WriteByte(0xcc);   //skip rom

WriteByte(0xbe);   //读取温度指令, 即读 scratchpad

p = temp_buff;

GemTemp();

}

void  shumaguan_display(void)

{

P0=gongyang[display_value[3]];

gewei=0;

delay_ms(1);

gewei=1;

P0=gongyang[display_value[2]];

shiwei=0;

delay_ms(1);

shiwei=1;

P0=gongyang[display_value[1]];

baiwei=0;

delay_ms(1);

baiwei=1;

P0=gongyang[display_value[0]]&0x7f;   //0111 1111

qianwei=0;

delay_ms(1);

P0=0xff;

}

void  timer_init()      //定时器初始化

{

TMOD=TMOD&0xf0|0x01;

TL0= 0;

TH0= 0;

TR0=1;

TMOD=TMOD&0x0f|0x20;

TL1=TH1=0;

TR1=1;

}

void  inter_init()    //中断初始化

{

ET0=1;

ES=1;

EA=1;

}

void  timer0_inter()  interrupt 1    //定时器0中断函数

{

TL0= 0;

TH0= 0;

counttimes++;

if((counttimes%10)==0)

{

// keyvalue=keypad();

//   adcvalue=getadcvalue(0);

//   adcvalue=adcvalue*4.883;

TemperatuerResult();

Temperature=Temperature*0.0625;

adcvalue=Temperature*10;

display_value[0]=adcvalue/1000;

display_value[1]=(adcvalue%1000)/100;

display_value[2]=(adcvalue%1000%100)/10;

display_value[3]=(adcvalue%1000%100)%10;

}

if((counttimes%100)==0)

{

SendData(display_value[0]+0x30);

SendData(0x2e);

SendData(display_value[1]+0x30);

SendData(display_value[2]+0x30);

SendData(display_value[3]+0x30);

counttimes=0;

}

if((counttimes%1000)==0)

{

}

}

void  serial_init()

{

SCON=0X50;

PCON=0X00;

//   AUXR=AUXR|0x40;

delay_ms(10);

}

void SendData(char dat)

{

SBUF = dat;                     //Send current data

while (!TI)

{

;

}                     //Wait for the previous data is sent

TI = 0;                         //Clear TI flag

}

void   mcu_init(void)

{

P0=0xff;

P1=0xff;

P2=0xff;

P3=0xff;

//pwmadc=0;

// P4SW=0xff;

//  P4=0xff;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值