DS18B20温度传感器
主要需要注意的是官方驱动的延时,它本身给的延时是12T的延时,但是比赛用的单片机是1T的。
需要把官方驱动里的延时延长,12倍左右就行。
#include <STC15F2K60S2.H>
#include "onewire.h"
unsigned int table[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
unsigned int temp;
void Delay1ms() //@12.000MHz
{
unsigned char i, j;
i = 12;
j = 169;
do
{
while (--j);
} while (--i);
}
void delay(unsigned int t)
{
while(t--)
{
}
}
void duanxuan()//段选
{
P2=0xe0;
}
void weixuan()//位选
{
P2=0xc0;
}
void smg(unsigned int num,unsigned int pos)
{
duanxuan();
P0=0xff;
weixuan();
P0=0x01<<pos;
duanxuan();
P0=table[num];
}
void smg_d(unsigned int num,unsigned int pos)
{
duanxuan();
P0=0xff;
weixuan();
P0=0x01<<pos;
duanxuan();
P0=table[num]+0x80;
}
void csmg()
{
smg(temp%10,7);
delay(20);
smg_d(((temp%100)/10),6);
delay(20);
smg(temp/100,5);
delay(20);
}
void delay2(int t)
{
while(t--)
{
csmg();
}
}
void ds18b20()
{
unsigned char low,high;
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0x44);
delay2(2000);
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0xbe);
low=Read_DS18B20();
high=Read_DS18B20();
temp=high;
temp=(temp<<8)|low;
temp=temp*0.625;
}
void main()
{
temp=35;
while(1)
{
ds18b20();
csmg();
}
}