首先easy kit的软件环境应用这里就不多说了,论坛里的很多童鞋都积极发言为大家提供服务,这里我就手头现有器件DS1821通过富士通mb95264单片机进行控制,主要进行DS1821工作模式设置,温度读取.尤其对一线制时序进行了仔细的跟踪调试,目的对我的试用手记负责,需要的童鞋可以借鉴,不多说了上图:
对DS1821温度传感器Reset操作抓图:
运行代码:
int8 DS1821_Reset(void)
{ int8 d;
DS1821DQ =0;// reset pulse
DQ_DDR = 1;//设置p01为输出状态
delay(60);// 600us
DQ_DDR = 0;//设置p01为输入状态
delay(1);// 20us
while(!DS1821DQ);
return (int8)DS1821DQ;
}
先看看图片能否上传!
共10条
1/1 1 跳转至页
基于富士通mb95264单片机控制DS1821可编程数字温度传感器的试用手记
2楼
对DS1821温度传感器write操作抓图:
写入数据为:0x0C
a-->h方向是从低位到高位。
代码: void DS1821_WriteByte(uint8 dat) { uint8 i,nop; for(i=0;i<8;i++){ DS1821DQ=0; if (dat&0x01) { // bit = 1 LSB first DQ_DDR = 1;//设置p01为输出状态 DQ_DDR = 0;//设置p01为输入状态 } else { // bit = 0 DQ_DDR = 1;//设置p01为输出状态 } dat >>= 1; delay(5); // wait 110us DQ_DDR = 0;//设置p01为输出状态 } DQ_DDR = 0;//设置p01为输入状态 } 对DS1821温度传感器read操作抓图: 下图是读到状态寄存器(0xAC)的值为0x50 代码: int8 DS1821_ReadByte(void) { uint8 dat,i,nop; dat=0; for(i=0;i<8;i++) { dat >>= 1; DS1821DQ=0; // 送出 1us pulse DQ_DDR = 1;//设置p01为输出状态 DQ_DDR = 0;//设置p01为输入状态 asm ("\tNOP"); asm ("\tNOP"); if(DS1821DQ) { dat|=0x80; // msb 優先 } delay(2);//等40us, 加上其它程式碼, 每個bit有80us } return (int8)dat; }
代码: void DS1821_WriteByte(uint8 dat) { uint8 i,nop; for(i=0;i<8;i++){ DS1821DQ=0; if (dat&0x01) { // bit = 1 LSB first DQ_DDR = 1;//设置p01为输出状态 DQ_DDR = 0;//设置p01为输入状态 } else { // bit = 0 DQ_DDR = 1;//设置p01为输出状态 } dat >>= 1; delay(5); // wait 110us DQ_DDR = 0;//设置p01为输出状态 } DQ_DDR = 0;//设置p01为输入状态 } 对DS1821温度传感器read操作抓图: 下图是读到状态寄存器(0xAC)的值为0x50 代码: int8 DS1821_ReadByte(void) { uint8 dat,i,nop; dat=0; for(i=0;i<8;i++) { dat >>= 1; DS1821DQ=0; // 送出 1us pulse DQ_DDR = 1;//设置p01为输出状态 DQ_DDR = 0;//设置p01为输入状态 asm ("\tNOP"); asm ("\tNOP"); if(DS1821DQ) { dat|=0x80; // msb 優先 } delay(2);//等40us, 加上其它程式碼, 每個bit有80us } return (int8)dat; }
3楼
下图是读状态寄存器(0xAC)的值为0x50的完整图片抓图:
代码:
int8 TemperatureRead(void)
{
DS1821_Reset();
DS1821_WriteByte(0xAC);
return DS1821_ReadByte();
}
下图是读温度值(0xAA)的值为0x16(22摄氏度)的完整图片抓图:
代码:
int8 TemperatureRead(void)
{
DS1821_Reset();
DS1821_WriteByte(0xAA);
return DS1821_ReadByte();
}
放到笔记本表面连续抓图:温度30左右
5楼
完整代码如下(测试通过):
#include "..\MB95200_IO\mb95200.h"
#define DS1821DQ PDR0_P01
#define DQ_DDR DDR0_P01
typedef unsigned char uint8;
typedef char int8;
void Clock_Init(void);
void delay(uint8 data);
void DS1821_Init(void);
int8 DS1821_Reset(void);
void DS1821_WriteByte(uint8);
int8 DS1821_ReadByte(void);
int8 TemperatureRead(void);
void uart_Init(void);
void send(int8 TempD);
int8 TempD=1;
void main(void)
{
uint8 j=0;
Clock_Init();
DS1821_Init();
while(1){
TempD=TemperatureRead();
delay(100);
}
}
void Clock_Init(void)
{
SYCC_DIV0 = 1;
SYCC_DIV1 = 0;
AIDRL_P01=1;
}
int8 DS1821_Reset(void)
{ int8 d;
DS1821DQ =0;// reset pulse
DQ_DDR = 1;//设置p01为输出状态
delay(60);// 600us
DQ_DDR = 0;//设置p01为输入状态
delay(1);// 20us
while(!DS1821DQ);
return (int8)DS1821DQ;
}
void DS1821_Init(void)
{
DQ_DDR = 0;//设置p01为输出状态
DS1821_Reset();
DS1821_WriteByte(0x0C);
delay(1);
DS1821_WriteByte(0x00);
DS1821_Reset();
DS1821_WriteByte(0xEE);
delay(1);
}
void DS1821_WriteByte(uint8 dat)
{
uint8 i,nop;
for(i=0;i<8;i++){
DS1821DQ=0;
if (dat&0x01) { // bit = 1 LSB first
DQ_DDR = 1;//设置p01为输出状态
DQ_DDR = 0;//设置p01为输入状态
} else { // bit = 0
DQ_DDR = 1;//设置p01为输出状态
}
dat >>= 1;
delay(5); // wait 110us
DQ_DDR = 0;//设置p01为输出状态
}
DQ_DDR = 0;//设置p01为输入状态
}
int8 DS1821_ReadByte(void)
{
uint8 dat,i,nop;
dat=0;
for(i=0;i<8;i++) {
dat >>= 1;
DS1821DQ=0; // 送出 1us pulse
DQ_DDR = 1;//设置p01为输出状态
DQ_DDR = 0;//设置p01为输入状态
asm ("\tNOP");
asm ("\tNOP");
if(DS1821DQ) {
dat|=0x80; // msb 優先
}
delay(2);//等40us, 加上其它程式碼, 每個bit有80us
}
return (int8)dat;
}
int8 TemperatureRead(void)
{
DS1821_Reset();
DS1821_WriteByte(0xAA);
return DS1821_ReadByte();
}
void delay(uint8 data)
{
for(;data>0;data--);
}
void uart_Init(void)
{
}
void send(int8 TempD)
{
}
后续,可以将得到的温度通过串口发送出去,或者显示……
9楼
一线制的时序基本都是一样的,读、写、复位过程不能被中断,时序要求较严格。换个一线制外设芯片无非就是操作寄存器的地址不同方式不同需要根据手册要求去设计,读(DS1821_ReadByte)、写(DS1821_WriteByte)、复位(DS1821_Reset)函数在富士通这个系列单片机上是通用的。
共10条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |