📄 ds18b20.txt
字号:
//========================================================
// 工程名称: DS18B20
// 功能描述: 温度传感器
// 涉及的库: spca061a.h
// 组成文件: main.c
// 硬件连接: IOA15S18B20的DQ脚
// IOB0-IO7EDa-h段位;IOB8-IOB13:位选。个位、十位、小数
// 标准化: 2007.4.19
// Done by: Doublears
//========================================================
#include "spce061a.h"
#define DQ *P_IOA_Data //定义A口味DS18B20的DQ位
// 全局变量定义
unsigned int temp;
int table[10]={0x003f, 0x0006, 0x005b, 0x004f, 0x0066, 0x006d, 0x007d, 0x0007, 0x007f, 0x006f};
unsigned int sone,tens,point;
// 温度显示函数声明
void showtemp();
//========================================================
// 语法格式: void delay(int t)
// 实现功能: 延时函数
// 参数: 延时时长,t*100微妙
// 返回值: 无
//========================================================
void delay(int t)
{
unsigned int i;
while(t--)
{
for (i=0;i<=70;i++) //when t=1 100us
*P_Watchdog_Clear=0x0001;
}
}
//========================================================
// 语法格式: void showdelay()
// 实现功能: 延时显示函数,启动温度转换时用此延时函数,
// 一延时,二在这段时间也显示温度。
// 参数: 无
// 返回值: 无
//========================================================
void showdelay()
{
int i;
i=35; //延时约1s
while(i--)
showtemp();
}
//========================================================
// 语法格式: void TxReset(void)
// 实现功能: 产生复位脉冲 初始化DS18B20
// 参数: 无
// 返回值: 无
//========================================================
void TxReset(void)
{
unsigned int i;
*P_IOA_Dir=0xffff; //置A为输出端
DQ=0x0000;
delay(8); //拉低约900微秒
DQ=0x8000;
i=30; //延时30微秒
while (i--);
}
//========================================================
// 语法格式: void RxWait(void)
// 实现功能: 等待应答脉冲
// 参数: 无
// 返回值: 无
//========================================================
void RxWait(void)
{
unsigned int i;
*P_IOA_Dir=0x0000;
while((DQ&0x8000)==0x8000);
while((DQ&0x8000)==0x0000); //等待应答脉冲
i=4;
while (i--);
}
//========================================================
// 语法格式: unsigned int RbBit(void)
// 实现功能: 读取数据的一位,满足读时时隙要求
// 参数: 无
// 返回值: b:读时隙后读取数据的一位(0或1),0x000b
//========================================================
unsigned int RbBit(void)
{
unsigned int i,b;
*P_IOA_Dir=0xffff; //置A口为输出口
DQ=0x0000;
i++;
i++;
i++;
i++; //拉低后延时1us,然后释放总线
DQ=0x8000;
*P_IOA_Dir=0x0000; //置A口为输入口,接受数据
i=10;
while(i--);
b=(DQ&0x8000)>>15; //15us内读数据
i=60;
while (i--); //延时60us
return(b);
}
//========================================================
// 语法格式: unsigned int RbByte(void)
// 实现功能: 读取数字的两个字节
// 参数: 无
// 返回值: 从暂存器读取16位温度值
//========================================================
unsigned int RbByte(void)
{
unsigned int i,j,b;
b=0;
for (i=1;i<=16;i++)
{
j=RbBit();
b=(j<<15)|(b>>1);
}
return (b);
}
//========================================================
// 语法格式: void WrByte(unsigned int b)
// 实现功能: 写数据的一个字节
// 参数: DS18B20的一字节操作命令
// 返回值: 无
//========================================================
void WrByte(unsigned int b)
{
unsigned int i,j,btmp;
for (j=1;j<=8;j++)
{
btmp=b&0x0001;
b=b>>1;
*P_IOA_Dir=0xffff; //置A口为出入口
if (btmp==0x0001)
{
//写1
DQ=0x0000; //拉低15us
i=13;
while(i--);
DQ=0x8000; //15us内必须将总线了拉高
i=55;
while (i--);
i++;
i++;
}
else
{
//写0
DQ=0x0000;
i=64;
while (i--);
DQ=0x8000;
i++;
i++;
}
}
}
//========================================================
// 语法格式: void convert(void)
// 实现功能: 启动温度转换
// 参数: 无
// 返回值: 无
//========================================================
void convert(void)
{
TxReset(); //初始化
RxWait(); //应答脉冲
delay(10);
WrByte(0x00cc); //skip rom命令
WrByte(0x0044); //温度转换
*P_Watchdog_Clear=0x0001;
}
//========================================================
// 语法格式: void RdTemp(void)
// 实现功能: 读取温度值,将温度值赋予temp
// 参数: 无
// 返回值: 无
//========================================================
void RdTemp(void)
{
TxReset(); //初始化
RxWait(); //应答脉冲
delay(10);
WrByte(0x00cc); //skip rom命令
WrByte(0x00be); //读暂存器温度
temp=RbByte(); //读取温度
}
//========================================================
// 语法格式: void showtemp()
// 实现功能: 温度显示函数,通过三位LED
// 参数: 无
// 返回值: 无
//========================================================
void showtemp()
{
*P_IOB_Data=table[tens]+0xfe00; //显示十位
delay(50);
*P_IOB_Data=table[sone]+0xfd00; //显示个位
delay(50);
*P_IOB_Data=table[point]+0xfb00; //显示小数
delay(50);
*P_IOB_Data=0xffff;
}
//========================================================
// 语法格式: void main()
// 实现功能: 主函数
// 参数: 无
// 返回值: 无
//========================================================
void main()
{
unsigned int i;
*P_IOA_Dir=0x0000; //初始化端口,先定义A口为悬浮式输入端,以后须设置输出口时,只需将Dir改变即可
*P_IOA_Attrib=0xffff;
*P_IOA_Data=0x0000;
*P_IOB_Dir=0xffff; //B口味带数据缓存的输出端
*P_IOB_Attrib=0xffff;
*P_IOB_Data=0x0000;
*P_SystemClock=0x0040; //设置系统时钟,Focs选择32.768MHz,CPUCLOCK选择Focs
while(1)
{
delay(10);
convert(); //启动温度转换
showdelay(); //延时750ms以上
RdTemp(); //读取温度值
tens=((temp&0xfff0)>>4)/10; //取十位
sone=((temp&0xfff0)>>4)%10; //取个位
i=(temp&0x000f)*0.625;
point=(int) i; //取小数点后第一位
if (((int) (i*10))%10>=5 ) //取小数点后第二位,四舍五入
point++;
showtemp(); //显示温度
showtemp();
showtemp();
showtemp();
showtemp();
*P_Watchdog_Clear=0x0001; //清狗
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -