历史上的今天
返回首页

历史上的今天

今天是:2024年10月25日(星期五)

正在发生

2019年10月25日 | DS18B20的使用程序PIC单片机

2019-10-25 来源:51hei


#include

__CONFIG(0x1832);        

//芯片配置字,看门狗关,上电延时开,掉电检测关,低压编程关,加密,4M晶体HS振荡


#define  uch unsigned char                     //给unsigned char起别名 uch

# define DQ RA2                                //定义18B20数据端口 

# define DQ_DIR TRISA2                         //定义18B20D口方向寄存器 

# define DQ_HIGH() DQ_DIR =1                   //设置数据口为输入

# define DQ_LOW() DQ = 0; DQ_DIR = 0           //设置数据口为输出

unsigned char  TLV=0 ;                        //采集到的温度高8位

unsigned char  THV=0;                         //采集到的温度低8位

unsigned char TZ=0;                           //转换后的温度值整数部分

unsigned char TX=0;                           //转换后的温度值小数部分

unsigned int wd;                              //转换后的温度值BCD码形式

unsigned char shi;                             //整数十位

unsigned char ge;                              //整数个位

unsigned char shifen;                          //十分位

unsigned char baifen;                          //百分位

unsigned char qianfen;                         //千分位

unsigned char wanfen;                          //万分位

unsigned char table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; 

//0-9的显示代码

//------------------------------------------------

//延时函数

void delay(char x,char y) 

{

  char z;

  do{

      z=y;

      do{;}while(--z);

     }while(--x);

}

//其指令时间为:7+(3*(Y-1)+7)*(X-1)如果再加上函数调用的call 指令、页面设定、传递参数花掉的7 个指令。

//则是:14+(3*(Y-1)+7)*(X-1)。

//--------------------------------------------------

//结果显示函数

void display()

{

TRISA=0X00;                            //设置A口全为输出

PORTD=table[shi];                      //显示整数十位

PORTA=0x1f;

delay(10,70);

PORTD=table[ge]&0X7F;                  //显示整数个位,并点亮小数点

PORTA=0x2f;

delay(10,70);

PORTD=table[shifen];                   //显示小数十分位

PORTA=0x37;

delay(10,70);

PORTD=table[baifen];                   //显示小数百分位

PORTA=0x3b;

delay(10,70);

PORTD=table[qianfen];                  //显示小数千分位

PORTA=0x3d;

delay(10,70);

PORTD=table[wanfen];                   //显示小数万分位

PORTA=0x3e;

delay(10,70);

}

//------------------------------------------------

//系统初始化函数

void init()

{

  ADCON1=0X07;                                //设置A口为普通数字口

  TRISA=0X00;                                 //设置A口方向为输出

  TRISD=0X00;                                 //设置D口方向为输出

}

//-----------------------------------------------

//复位DS18B20函数

reset(void)

{

  char presence=1;

  while(presence)

  { 

    DQ_LOW() ;                                //主机拉至低电平

    delay(2,70);                              //延时503us

    DQ_HIGH();                                //释放总线等电阻拉高总线,并保持15~60us

    delay(2,8);                               //延时70us

    if(DQ==1) presence=1;                     //没有接收到应答信号,继续复位

    else presence=0;                          //接收到应答信号

    delay(2,60);                              //延时430us

   }

  }

//-----------------------------------------------

//写18b20写字节函数

void write_byte(uch val)

{

uch i;

uch temp;

for(i=8;i>0;i--)

{

   temp=val&0x01;                            //最低位移出

   DQ_LOW(); 

   NOP();

   NOP();

   NOP();

   NOP();

   NOP();                                    //从高拉至低电平,产生写时间隙

   if(temp==1)  DQ_HIGH();                   //如果写1,拉高电平

   delay(2,7);                               //延时63us

   DQ_HIGH(); 

   NOP();

   NOP();

   val=val>>1;                               //右移一位

  }

}

//------------------------------------------------

//18b20读字节函数

uch read_byte(void)

{

uch i;

uch value=0;                                //读出温度

static bit j;

for(i=8;i>0;i--)

{

   value>>=1; 

   DQ_LOW();

   NOP();

   NOP();

   NOP();

   NOP();

   NOP();

   NOP();                                   //6us

   DQ_HIGH();                               //拉至高电平

   NOP(); 

   NOP();

   NOP();  

   NOP(); 

   NOP();                                  //4us

   j=DQ;

   if(j) value|=0x80;

   delay(2,7);                             //63us

  }

  return(value);

}

//-------------------------------------------------

//启动温度转换函数

void get_temp()

int i;

DQ_HIGH();

reset();                                 //复位等待从机应答 

write_byte(0XCC);                        //忽略ROM匹配 

write_byte(0X44);                        //发送温度转化命令  

for(i=20;i>0;i--)

    {

        

        display();                       //调用多次显示函数,确保温度转换完成所需要的时间

    }

reset();                                 //再次复位,等待从机应答 

write_byte(0XCC);                        //忽略ROM匹配 

write_byte(0XBE);                        //发送读温度命令 

TLV=read_byte();                         //读出温度低8 

THV=read_byte();                         //读出温度高8位 

DQ_HIGH();                               //释放总线 

TZ=(TLV>>4)|(THV<<4)&0X3f;               //温度整数部分

TX=TLV<<4;                               //温度小数部分

if(TZ>100) TZ/100;                       //不显示百位

ge=TZ%10;//个位                          //整数部分个位

shi=TZ/10;//十位                         //整数十位

wd=0;  

if (TX & 0x80) wd=wd+5000;

if (TX & 0x40) wd=wd+2500;

if (TX & 0x20) wd=wd+1250;

if (TX & 0x10) wd=wd+625;                //以上4条指令把小数部分转换为BCD码形式             

shifen=wd/1000;                          //十分位                    

baifen=(wd%1000)/100;                    //百分位

qianfen=(wd%100)/10;                     //千分位

wanfen=wd%10;                            //万分位

推荐阅读

史海拾趣

Crane Co.公司的发展小趣事

到了1860年代,Crane Co.作为西北制造公司,开始为铁路部门供应蒸汽机的关键部件,并涉足蒸汽加热业务领域。这一时期,公司不仅展现了其在机械制造方面的实力,还通过不断创新和拓展业务范围,为公司的长远发展奠定了坚实基础。

Big-Sun Electronics Co Ltd公司的发展小趣事

随着国内市场的逐步饱和,Big-Sun Electronics Co Ltd公司开始将目光投向国际市场。公司积极参与国际电子展会,与海外客户建立起了良好的合作关系。同时,Big-Sun还与国际知名电子企业开展技术合作,共同研发新产品,进一步提升了公司的国际竞争力。

FTCAP Fischer & Tausche Capacitor Group公司的发展小趣事

Big-Sun Electronics Co Ltd公司自成立以来,始终致力于技术研发和产品创新。在成立初期,公司便投入大量资源于研发部门,通过不断试验和改进,成功研发出了一款具有高效能、低能耗特点的电子芯片,这一技术突破迅速在市场上引起了广泛关注。随着产品线的不断扩展,Big-Sun的电子产品逐渐在行业内树立起了技术领先的形象。

GaN Systems公司的发展小趣事

GAIA Converter Inc成立于1993年,总部位于法国波尔多附近的航空航天工业城,这里聚集了众多高科技企业和研究机构。公司自创立之初便专注于高可靠性和工业模块化电源解决方案的研发与生产。在成立初期,GAIA盖亚电源凭借对电力转换技术的深入理解,迅速开发出了一系列适用于航空、军事及高端工业应用的DC/DC转换器模块。这些产品凭借其卓越的性能和稳定的质量,在市场上赢得了初步认可。

Elytone Electronics Co Ltd公司的发展小趣事

进入XXXX年代,随着电子技术的飞速发展,Elytone公司意识到技术创新是企业持续发展的关键。公司投入大量资金引进先进设备和研发人才,成功开发出一系列具有竞争力的电子产品。这些产品在市场上获得了良好的口碑,为公司的快速发展奠定了坚实基础。

Giga公司的发展小趣事
通过定时控制LED灯的亮灭,实现视觉效果。

问答坊 | AI 解惑

汽车管理系统2002

汽车管理系统2002…

查看全部问答>

测温电路???用热敏电阻

跪求关于 用热敏电阻设计的测温电路LCD显示PROTEUS仿真…

查看全部问答>

电容屏 touch驱动

有没有哪位大哥做过电容屏的touch驱动,或者了解这个的,希望给点思路。。。。…

查看全部问答>

DirectDraw加载位图的问题

                        ddrval = DirectDrawCreate(NULL, &g_pDD, NULL);                         ddrval = g_pDD ...…

查看全部问答>

这算什么意思

下了好几个Keil uvision 软件,有V3, 也有2的, 也装了个完全版的,还有序列号,网上下的, 很奇怪编译成功过几次的,突然再次提醒2K 的代码限制,(前面成功编译的代码长度肯定也超过2K的) *** FATAL ERROR L250: CODE SIZE LIMIT IN RESTRIC ...…

查看全部问答>

如何在控制面板里添加蓝牙?(很急)

如题, 怎么生成bthpnl.cpl?catalog items里应该如何勾选?谢谢达人朋友解答!…

查看全部问答>

LM3S 8962

电话:15928776296 邮箱:1005450581@qq.com 地址:四川省成都市郫县团结四川师范大学成都学院电子程系工业与民用1班 姓名:赵健雄   我是嵌入的学习者,只有通过做一个东西,才能学到更多,只有做得更好,更强大 ,才会成长得更快。…

查看全部问答>

问一个Iap写flash的问题

我在用stm32 IAP 更新flash的时候 看到 最少是写半个字 但是我发现 编译完生成的bin文件 有单数字节 怎么处理着最后一个字节呢?…

查看全部问答>

请教一个STM32固件库中GPIO-SPEED的问题

今天在学习GPIO设置的程序时,对这一行程序有些不理解GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 疑问,这条指令是设置GPIO的输出速率,GPIO_Speed_50MHz是通过在stm32f10x_gpio.h中的 typedef enum {   GPIO_Speed_ ...…

查看全部问答>