⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ds1820.c

📁 基于S3C23410 ARM9的温度传感实验
💻 C
字号:
/****************************************************************************
【文  件  名  称】main.c
【功  能  描  述】MCS3C2410A板DS1820温度测试
【程  序  版  本】0.0
【创建人及创建日期】孙俊军//2007年10月5日
****************************************************************************/

#include "def.h"
#include "2410addr.h"
#include "config.h"
#include "board.h"
#include "utils.h"

//位操作函数
unsigned char a,b;
#define rPDATC rGPCDAT
#define bitset(a,b) (a|=(1<<b))					//置位:
#define bitclr(a,b) (a&=~(1<<b))				//清零:
#define bitcpl(a,b) (a^=(1<<b))					//取反:
#define bittest(a,b) ((a>>b&0x01)==1)?1:0		//测试指定位1:


//*********************** **空跑时间一微秒**************************//
void sysUtilsUSecDelay(U32 t)
{
	int ls=32;
	U32 k=0;
	for(;k<t;k++)
	{
		while(ls--);
		ls=32;
	}
}

//*****************************初始化程序 *********************************//

void Init_DS18B20(void) 
{
 	int x=0;
 	bitset(rPDATC,0); //DQ先置高 
 	sysUtilsUSecDelay(70); //稍延时
 	bitclr(rPDATC,0); //发送复位脉冲 
 	sysUtilsUSecDelay(880); //延时(>480us) 
 	bitset(rPDATC,0); //拉高数据线 
 	rGPCCON = 0x00000000;  
 	sysUtilsUSecDelay(50); //等待(15~60us) 
 	x=bittest(rPDATC,0); //用X的值来判断初始化有没有成功,18B20存在的话X=0,否则X=1 
 	//printf("初始化是否成功:%d\n",x);
 	sysUtilsUSecDelay(200); 
 	rGPCCON = 0x55555555;
}

//**********读一个字节************//

unsigned char ReadOneChar(void)  //主机数据线先从高拉至低电平1us以上,再使数据线升为高电平,从而产生读信号
{
	int i=0; //每个读周期最短的持续时间为60us,各个读周期之间必须有1us以上的高电平恢复期
	unsigned char dat=0; 
	for (i=8;i>0;i--) //一个字节有8位 
	{
		bitset(rPDATC,0); 
 		sysUtilsUSecDelay(24); 
 		bitclr(rPDATC,0);
 		sysUtilsUSecDelay(8);  //>1us 
 		bitset(rPDATC,0); 
 		sysUtilsUSecDelay(10); 
 		dat>>=1;
 		rGPCCON = 0x00000000;
 		if(bittest(rPDATC,0))dat|=0x80; 
 
 		sysUtilsUSecDelay(70);
 		rGPCCON = 0x55555555;
	} 
	return(dat);
} 



//*********************** **写一个字节**************************//

void WriteOneChar(unsigned char dat) 
{ 
  	unsigned char i=0; //数据线从高电平拉至低电平,产生写起始信号。15us之内将所需写的位送到数据线上,
  	rGPCCON = 0x55555555;
  	for(i=8;i>0;i--) //在15~60us之间对数据线进行采样,如果是高电平就写1,低写0发生。 
  	{
   		bitclr(rPDATC,0); //在开始另一个写周期前必须有1us以上的高电平恢复期。
   		sysUtilsUSecDelay(10);  //>1us  
   		if(bittest(dat,0)) 
   			bitset(rPDATC,0);
   		else
   			bitclr(rPDATC,0); 
   		sysUtilsUSecDelay(100);
    
   		bitset(rPDATC,0); 
    	sysUtilsUSecDelay(10);  //>1us    
   		dat>>=1;
  	} 
} 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -