注意:访问本站需要Cookie和JavaScript支持!请设置您的浏览器! 打开购物车 查看留言付款方式联系我们
初中电子 单片机教材一 单片机教材二
搜索上次看见的商品或文章:
商品名、介绍 文章名、内容
首页 电子入门 学单片机 免费资源 下载中心 商品列表 象棋在线 在线绘图 加盟五一 加入收藏 设为首页
本站推荐:
四个DS1820温度读取C源程序
文章长度[5430] 加入时间[2006/7/1] 更新时间[2024/12/20 6:52:08] 级别[3] [评论] [收藏]
四个DS1820温度读取C源程序 
日期:2006-1-14 9:29:30 人气:3 查看:[大字体 中字体 小字体] 

// 以下是四个DS1820温度读取程序
//使用时先调用"rom()"子程序读出每个器件的序列号
//再将各个序列号填入SN数组中才能读出各个温度

#include
#define uchar unsigned char

sbit TMDAT = P0^1; //根据实实际情况设定
uchar TMP[4]; //读取后的4个温度值,将其除以2即可得出实际温度;
uchar SN[4][8]; //4个器件的序列号,先读出单个序列号后填上才可以读取温度
uchar f[4]; //结果是否为负温,“0”为正温,“1”为负温。 

////////////////////////////////////////延时部分//////////////////////////
void dmsec (unsigned int count)    //
{     //
unsigned int i;       //
while (count)    //
{    //
 i = 115;   //
 while (i>0) i--;   //
 count--;   //
  }     //
}     //
//////////////////////////////////////////////////////////////////////////

/////////////////////////////////////// 发送复位//////////////////////////
void tmreset (void)    //
{             //
unsigned int i;    //
TMDAT = 0;    //
i = 103;    //
while (i>0) i--;     // 延时 900 uS(11.0592Mhz时) //
TMDAT = 1;    //
i = 4;    //
while (i>0) i--;   //
}     //
//////////////////////////////////////////////////////////////////////////

//判断DS1820是否存在的子程序。最好不要用,因为当器件不存在时将会进入死循环

////////////////////////////////////// 等待存在脉冲///////////////////////
void tmpre (void)  //判断器件是否存在 //
{              //
unsigned int i;    //
while (TMDAT);    //
while (~TMDAT);    //
i = 4; while (i>0) i--;   //
}     //
//////////////////////////////////////////////////////////////////////////

///////////////////////////////////// 读一位//////////////////////////////
bit tmrbit (void)    //
{             // 
unsigned int i;    //
bit dat;    //
TMDAT = 0; i++;    //
TMDAT = 1; i++; i++; //微量延时  //
dat = TMDAT;    //
i = 8; while (i>0) i--; // 延时  //
return (dat);    //
}     //
//////////////////////////////////////////////////////////////////////////

//////////////////////////////////////// 读一个字节///////////////////////
unsigned char tmrbyte (void)    //
{         //
unsigned char i,j,dat;   //
dat = 0;    //
for (i=1;i<=8;i++)   //
{    //
 j = tmrbit ();   //
 dat = (j << 7) | (dat >> 1);  //
}    //
return (dat);    //
}     //
//////////////////////////////////////////////////////////////////////////

/////////////////////////////////////// 写一个字节////////////////////////
void tmwbyte (unsigned char dat)   //
{            //
unsigned int i;    //
unsigned char j;   //
bit testb;    //
for (j=1;j<=8;j++)   //
{    //
 testb = dat & 0x01;   //
 dat = dat >> 1;   //
 if (testb)   //
 {    //
  TMDAT = 0;              // 写0 //
  i++; i++;               //
  TMDAT = 1;   //
  i = 8; while (i>0) i--;        //
 }    //
 else    //
 {    //
  TMDAT = 0;              // 写0 //
  i = 8; while (i>0) i--;        //
  TMDAT = 1;   //
  i++; i++;               //
 }    //
}    //
}     //
//////////////////////////////////////////////////////////////////////////

/////////////////////////////////发送ds1820 开始转换//////////////////////
void tmstart (void)    //
{             //
tmreset (); //复位   //
//tmpre (); //等待存在脉冲  //
dmsec (1); //延时   //
tmwbyte (0xcc); //跳过序列号命令,对所有器件有效 //
tmwbyte (0x44); //发转换命令 44H,  //
}     //
//////////////////////////////////////////////////////////////////////////


//////////////////////////////////读取温度////////////////////////////////
void tmrtemp ()    //
{             //
uchar i,j;    //
uchar a,b;    //
for(j=0;j<4;j++)   //
{    //
 tmreset(); //复位  //
 dmsec(1); //延时  //
 tmwbyte(0x55); //发送ROM匹配命令 //
 for(i=0;i<8;i++)   //
 {    //
  tmwbyte(SN[j][i]); //发送64位序列号 //
 }    //
 tmwbyte (0xbe); //发送读取命令  //
 a = tmrbyte (); //连续读取两位温度 //
 b = tmrbyte ();    //
 f[j]=b;  //若b为1则为负温 //
 if(f[j])   //
 {    //
  TMP[j]=~a+1; //如果为负温则去除其补码 //
 }    //
 else    //
 {    //
  TMP[j]=a;   //
 }    //
}    //
}     //
//////////////////////////////////////////////////////////////////////////


//以下是读取器件序列号的子程序,需要读取序列时可在程序中调用;
//调用时确保总线中只有一只器件,若有多个器件时则读取出来的号码无效;
//将读取出来的序列号填到前面的数组中即可使用;
//平时可以将此子程序删除以节约空间。
 
//////////////////////////读取器件序列号子程序////////////////////////////
void rom()     //
{     //
//以下是定义8个序列号变量   //
uchar sn1;    //
uchar sn2;    //
uchar sn3;    //
uchar sn4;    //
uchar sn5;    //
uchar sn6;    //
uchar sn7;    //
uchar sn8;    //
     //
tmreset (); //复位   //
dmsec (1); //延时   //
tmwbyte(0x33); //发送读序列号子程序  //
sn1=tmrbyte(); //读取第一个序列号,应为16H; //
sn2=tmrbyte(); //读取第二个序列号,应为10H; //
sn3=tmrbyte();    //
sn4=tmrbyte();    //
sn5=tmrbyte();    //
sn6=tmrbyte();    //
sn7=tmrbyte();    //
sn8=tmrbyte();    //
}     //
//////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////
main()     //
{     //
do{   //
 rom(); //调用读序列号子程序  //
 //tmstart();   //
 dmsec(100); //如果是不断地读取的话可以不延时 //
 //tmrtemp(); //读取温度,执行完毕温度将存于TMP[]数组中//
}while(1);    //
}     //
//////////////////////////////////////////////////////////////////////////


1、 本站不保证以上观点正确,就算是本站原创作品,本站也不保证内容正确。
2、如果您拥有本文版权,并且不想在本站转载,请书面通知本站立即删除并且向您公开道歉! 以上可能是本站收集或者转载的文章,本站可能没有文章中的元件或产品,如果您需要类似的商品请 点这里查看商品列表!
本站协议 | 版权信息 |  关于我们 |  本站地图 |  营业执照 |  发票说明 |  付款方式 |  联系方式
深圳市宝安区西乡五壹电子商行——粤ICP备16073394号-1;地址:深圳西乡河西四坊183号;邮编:518102
E-mail:51dz$163.com($改为@);Tel:(0755)27947428
工作时间:9:30-12:00和13:30-17:30和18:30-20:30,无人接听时可以再打手机13537585389