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

📄 main.c

📁 一总线通信方式的18b20在spce061a上的驱动程序
💻 C
字号:
#include<SPCE061A.h>
//IOA8接DQ(即1-Wire总线)
void delay(unsigned int time)//time=1延时39.0624us
{
	for(;time!=0;time--)
		*P_Watchdog_Clear=0x0001;
}
//向18B20写命令函数
void WriteByte(unsigned int comm)
{
	unsigned int temp;
	long j;
	int i;
	*P_IOA_Dir|=0x0010;
	*P_IOA_Attrib|=0x0010;
	*P_IOA_Data|=0x0010;//设置IOA8为输出端,切初始值为1
	for(i=7;i>=0;i--)	
	{
		temp=1<<i;
		temp&=comm;
		if(temp==0)//写0
		{
			*P_IOA_Data&=0xffef;//DQ=0
			delay(2);//延时39.0625*2=78.125Us
			*P_IOA_Data|=0x0010;//DQ=1
		}
		else//写1
		{
			*P_IOA_Data&=0xffef;//DQ=0
			j=10000;
			j=10000;
			__asm("nop");
			__asm("nop");//延时14.324us
			*P_IOA_Data|=0x0010;//DQ=1
			delay(1);
			j=j+1;//延时39.0625+18.23=57.2925
		}
	}
}
//读18B20函数,一次读2个字节
unsigned int ReadWord(void)
{
	int i;
	unsigned int j;
	unsigned int Temperature=0;
	for(i=15;i>=0;i--)
	{
		*P_IOA_Dir|=0x0010;
		*P_IOA_Attrib|=0x0010;
		*P_IOA_Data&=0xffef;//DQ=0
		__asm("nop");//1.302us延时
		*P_IOA_Data|=0x0010;//DQ=1
		*P_IOA_Dir&=0xffef;
		j=*P_IOA_Data;
		j=j&0x0010;
		if(j!=0)
			Temperature=Temperature+(1<<i);	
	}
	return (Temperature);
}
//对18B20的初始化
void init18b20()
{
	unsigned int i=0;
	*P_IOA_Dir|=0x0010;
	*P_IOA_Attrib|=0x0010;
	*P_IOA_Data|=0x0010;//设置IOA8为输出端
	*P_IOA_Data&=0xffef;//DQ=0
	delay(15);//39.0625*15=585.9375us
	*P_IOA_Data|=0x0010;//DQ=1
	delay(1);//39.0625us
	*P_IOA_Dir&=0xffef;//设置IOB8为输入口
	while(1)
	{
		if((*P_IOA_Data&=0xffef)==0x0000)
			break;
		i++;
		if(i==12)//大约260us
			break;
	}
}
//启动温度转换
void shift()
{
	init18b20(); 
	delay(2); 
	WriteByte(0x00cc);              //skip rom命令 
	WriteByte(0x0044);              //温度转换 
	*P_Watchdog_Clear=0x0001;	
}
unsigned int readtemp()// 实现功能:  读取温度值,将温度值赋予temp
{ 
	init18b20(); 
	delay(2); 
	WriteByte(0x00cc);           //skip rom命令 
	WriteByte(0x00be);           //读暂存器温度 
	return (ReadWord());            //读取温度
}
int main()
{
	unsigned int i;
	*P_IOA_Dir|=0x0010;
	*P_IOA_Attrib|=0x0010;
	*P_IOA_Data|=0x0010;//设置IOA8为输出端
	init18b20();
	while(1)
	{
		delay(10);
		shift();
		delay(9500);
	//	delay(9500);
		i=readtemp();
		delay(9500);
	}
	return 0;
}

⌨️ 快捷键说明

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