这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 基于富士通mb95264单片机控制DS1821可编程数字温度传感器的试用手记

共10条 1/1 1 跳转至

基于富士通mb95264单片机控制DS1821可编程数字温度传感器的试用手记

高工
2010-12-02 15:24:18     打赏
首先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; }

先看看图片能否上传!



关键词: 基于     富士通     mb95264     单片机     控制     DS1    

高工
2010-12-02 15:29:00     打赏
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; }

高工
2010-12-02 15:36:09     打赏
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左右  

专家
2010-12-02 15:38:11     打赏
4楼
恩,不错,继续努力!最好是把读到的数值显示出来!用串口显示,比如显示:18 °C

高工
2010-12-02 15:43:56     打赏
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) { }   后续,可以将得到的温度通过串口发送出去,或者显示……

高工
2010-12-02 15:48:43     打赏
6楼

最近工作比较忙,这几天中午抽时间调试。主要给大家提供一线制时序,程序中的很多延时都仔细测试过了。


专家
2010-12-02 16:04:23     打赏
7楼
恩,继续哦

工程师
2010-12-02 18:47:11     打赏
8楼
18b20应该也是一样的吧!

高工
2010-12-02 19:57:14     打赏
9楼

一线制的时序基本都是一样的,读、写、复位过程不能被中断,时序要求较严格。换个一线制外设芯片无非就是操作寄存器的地址不同方式不同需要根据手册要求去设计,读(DS1821_ReadByte)、写(DS1821_WriteByte)、复位(DS1821_Reset)函数在富士通这个系列单片机上是通用的。


院士
2010-12-02 20:29:33     打赏
10楼

掺乎不进来,只能是忙着加分,呵呵


共10条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]