18B20测温(求助 C语言)
这个程序我参考了 我们老师的思路 利用定时器来实现测温 高手请别嫌程序冗长 帮忙看看#include "REG52.H"
#include "math.h"
#include <intrins.h>
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<m;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<j;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;
}