仪器社区

ds18b20测温程序,芯片:飞思卡尔,9s12dg128同系列的

zbzzlok 2011-05-01
如上题,主要是18b20的采集,比如外加一个继电器之类的,大于40度,报警或打开继电器,等,csdn或程序员网站上的程序也成啊,大家帮帮忙了,满意加分啊!!!!!!!!!
评论
全部评论
352405484
9s12dg128 好像不支持单总线,读取ds18b20需要采用模拟方式读取
我所温度部分程序给你,以前弄毕业设计的代码,芯片是9S12DT256,你只是单纯的用到I/O,所以程序同样适用你那个芯片。用的晶振是4M。
#define DQ PORTA_BIT0 //定义I/O端口
#define DQ_Dir DDRA_BIT0

#define Release() DQ_Dir = 0; //释放总线,使其作为输入信号,接收来自18B20的应答
#define PullDown() DQ_Dir = 1; DQ = 0;//下拉,使其作为输出低电平给18B20提供时序

//#define T PORTB_BIT0 //for Test
//#define T_Dir DDRB_BIT0 //for Test

#define SkipROM 0xCC //跳过ROM
#define Convert 0x44 //温度转换
#define ReadScr 0xBE //读暂存器
#define ReadPower 0xB4 //读电源
#define ReadROM 0x33 //读ROM

#include "18B20.h"

void delay1us()
{
//_asm nop;
//_asm nop;
// _asm nop;

// _asm nop;
_asm nop;
_asm nop;
_asm nop;
}

void delay_10us(unsigned int u) //延时10*u微秒
{
while(u--)
{
//经测试,每个nop大概1微妙
delay1us();
delay1us();
delay1us();
delay1us();
delay1us();

delay1us();
delay1us();
delay1us();
delay1us();
delay1us();
}
}
void delay1ms() //延时1ms
{
unsigned char i;
for(i = 0;i<200;i++)
{
delay_10us(100);
delay_10us(100);
delay_10us(100);
delay_10us(100);
delay_10us(100);
}
}

unsigned char DetectB20() //初始化18B20,检测是否有应答脉冲
{
//T_Dir = 1;
PullDown();
delay_10us(60);
Release();
delay_10us(5);
if(!DQ) //有应答脉冲
{
//T = 1;
delay_10us(60);
return 1;
}
delay_10us(60);
//T = 0;
return 0;
}

void WriteBit(unsigned char *tp) //将一位写入18B20
{
PullDown();
delay1us();//_asm nop;
if((*tp)&0x01)
{
Release();
//T=0;
}
delay_10us(6);
Release();
}

void WriteByte(unsigned char tmp) //将一个字节写入18B20,通过每次写入一位来完成
{
unsigned char i=8;
do{
WriteBit(&tmp);
tmp>>=1;
}while(--i);
}

void ReadBit(unsigned char *tp) //读一位
{
PullDown();
delay1us();//_asm nop;
delay1us();//_asm nop;
Release();
delay1us();//_asm nop;
if(DQ)
{
(*tp)|=0x80;
}
delay_10us(6);

}

unsigned char ReadByte() //读一个字节,通过每次读取一位来完成
{
unsigned char i = 8;
unsigned char tmp=0x00;
do{
tmp>>=1;
ReadBit(&tmp);
//T=0;
delay_10us(60);
//T=1;
}while(--i);
//PORTA = tmp;
return tmp;
}

void ReadB20ROM(unsigned char *ROM) //读ROM
{
unsigned char i=8;
if(DetectB20())
{
WriteByte(ReadROM);
do{
*ROM=ReadByte();
ROM++;
}while(--i);
}
}

void ReadT(unsigned int *tempr) //读取18B20中温度值
{ //t[0]存放温度的高字节,t[1]存放温度的低字节
unsigned char t[2];
unsigned int k;
if(DetectB20())
{
// T = 1;
WriteByte(SkipROM); //跳过ROM
WriteByte(Convert); //18B20温度转换
delay1ms(); //延时1ms,一定需要一定延时
if(DetectB20()) //初始化后有应答脉冲
{
WriteByte(SkipROM);
WriteByte(ReadScr); //读暂存器
t[1] = ReadByte(); //读取温度的低字节
t[0] = ReadByte(); //读取温度的高字节
k = t[1];
*tempr = t[0];
(*tempr)<<=8;
*tempr=(*tempr)|k;
}
}
// NOT found 18B20
}

#define ALM_TEMP 40
unsigned int temperture;
void main()
{

for(;;){
ReadT(&temperture);
if(temperture > ALM_TEMP){
//写上自己需要的代码
}
}
}
10 0 2011-05-02 0条评论 回复
您可能感兴趣的社区主题
加载中...
发布 评论