📄 main.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 + -