历史上的今天

今天是:2024年10月29日(星期二)

正在发生

2019年10月29日 | PIC16F877单片机DS18B20数码管温度计仿真程序 可显示负温度

发布者:fuehrd努力的 来源: 51hei关键字:PIC16F877  DS18B20  数码管温度计 手机看文章 扫描二维码
随时随地手机看文章

电路原理图如下:

//*********************************************************

//        实现的功能:数码管显示实时温度,支持负温度

//        芯片PIC16F877

//        XT:4MHZ

//*********************************************************

#include        //包含单片机内部资源预定义

#define LVP 0x3f39


// 晶振:XT;代码:没有代码保护;上电延时定时器关闭;

// 低电压复位禁止;看门狗关闭 ;低电压编程禁止

__CONFIG (XT & UNPROTECT & PWRTDIS & BORDIS & WDTDIS & LVP);


#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_DIR = 0;DQ = 0            //设置数据口为输出


const unsigned char ledcode[12]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00,0x40};

//不带小数点的共阴极数码管0123456789段码,正负符号位

const unsigned char ledcode1[12]={0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,0x00,0x40};   

//带小数点的共阴极数码管0123456789段码 ,正负符号位 


void init_port(void);

void delay(char x,char y); 

void delay_1ms(void);

void delay_ms(unsigned int time);

void interrupt dealtime();

void tmint(void);

void timetoseg(uch fh_temp,uch bai_temp,uch shi_temp,uch ge_temp,uch sf_temp,uch bf_temp,uch qf_temp,uch wf_temp);

void binary_temp(uch TL , signed char TH);

void reset(void);

void write_byte(uch val);

uch read_byte(void);

void get_temp(void);


unsigned char display_data[8];

unsigned char intcount=0; 

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

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


union temp                         //定义一个联合体

{

int T;        

uch TV[2];        

}temp;


signed char TZ=0;                     //转换后的温度值整数部分,有符号位

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


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


unsigned char fh;                               //符号位

unsigned char bai;                             //整数百位

unsigned char shi;                             //整数十位

unsigned char ge;                              //整数个位

unsigned char shifen;                          //十分位

unsigned char baifen;                          //百分位

unsigned char qianfen;                         //千分位

unsigned char wanfen;                          //万分位



//*********************************************************

//                        主程序

//*********************************************************

void main(void)

{

init_port();

tmint();

while(1)

  {         

   get_temp();

   timetoseg(fh,bai,shi,ge,shifen,baifen,qianfen,wanfen);  


  }

}

//*********************************************************

//        端口初始化

//        PORTD作为数码管段驱动(高有效)

//        PORTE作为数码管位选择驱动(低有效)

//*********************************************************

void init_port(void)

{

  RBPU=0;

//  PORTB=0xFF;

  TRISB=0xFF; 

  PORTD=0x00;           //

  TRISC=0x00;           //C口控制LED指示灯,设置成输出

  TRISD=0;                   //D口当作数码管段,设置成输出

  ADCON1=0x07;                //使A口,E口全为数字I/O口

  TRISE=0x00;           //E口当作数码管位选择控制脚,设置成输出   

  PORTE=0x00; 

}

//*********************************************************

//                延时程序

//*********************************************************

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 delay_1ms(void)

{

  unsigned int n;

  for(n=0;n<50;n++)

   {

    NOP();

   }

}

//*********************************************************

void delay_ms(unsigned int time)

{

  for(;time>0;time--)

   {

    delay_1ms();

   }

}


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

//复位DS18B20函数

void reset(void)

{

  uch presence=1;

  while(presence)

  { 

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

    delay(2,90);                              //延时>480503us

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

    delay(2,8);                               //延时>60us

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

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

    delay(2,70);                              //延时>240us

   }

  }


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

//写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();          //每次读时隙由主机发起,拉低总线至少1μs。

   NOP();

   NOP();

   NOP();

   NOP();

   NOP();

   NOP();                                   //6us

   DQ_HIGH();          //读时隙开始后的15μs内释放总线,拉至高电平,准备采样总线。

   NOP(); 

   NOP();

   NOP();  

   NOP(); 

   NOP();                                  //5us

   j=DQ;               //采样总线

   if(j) value|=0x80;  //把采样到的数据放入value

   delay(2,7);               //所有读时隙至少60μs,这里大约63us

  }

  return(value);

}


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

//启动温度转换函数

void get_temp()

int i;

DQ_HIGH();

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

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

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

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

    {    

        delay(201,132);                       

    }    


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

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

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

[1] [2]
关键字:PIC16F877  DS18B20  数码管温度计 引用地址:PIC16F877单片机DS18B20数码管温度计仿真程序 可显示负温度

上一篇:PIC单片机按键控制PWM输出LED灯亮度C语言程序
下一篇:PIC12F675单片机LED控制程序

推荐阅读

作者:Benwei Xin,德州仪器(TI)市场业务经理Wenchau Albert Lo,德州仪器(TI)个人电子产品系统工程师 智能音箱行业的竞争愈发激烈,各大制造商都在争相开发功能更强大、使用更方便的产品。当今的智能音箱拥有语音交互、人工智能、智能家居控制及多媒体播放等丰富的功能。要在竞争中占据先机,智能音箱的设计必须在总体系统成本、电池续航能力、热...
2018年11月23日,随着藏中电力联网工程竣工投运,这座世界海拔最高、海拔跨度最大、自然条件最复杂输变电工程,正式为工程沿线3070个小城镇(中心村)、156万各族群众生活提供可靠电源保障。 藏中电力联网工程由西藏藏中和昌都电网联网工程、川藏铁路拉萨至林芝段供电工程组成,起于西藏昌都市芒康县,止于山南市桑日县,跨越西藏三地市十区县,横穿...
  1、二极管的特性  二极管的英文是diode。二极管的正。负二个端子,(如图1)正端A称为阳极,负端B称为阴极。电流只能从阳极向阴极方向移动。  2、如何用万用表测量二极管的正负极  对半导体二极管政府极进行简易测试时,要选用万用表的欧姆档。测量方法如(图2、图3)所示。和万用表+输入相连的红表笔与表内电源的负极相通;而与万用表-输入端...
10月28日,飞凯材料发布三季报称,2021年7-9月,公司实现营业收入为6.85亿元,同比增长32.81%,归属于上市公司股东的净利润为1.02万元,同比增长72.52%。2021年前三季度,飞凯材料实现营业收入为18.87亿元,同比增长40.34%,归属于上市公司股东的净利润为2.70亿元,同比增长59.34%。飞凯材料表示,报告期内,虽然国内外疫情仍有所反复,但是公司按照年度经...

史海拾趣

问答坊 | AI 解惑

怎样成为合格的机械三维设计人员

怎样成为合格的机械三维设计人员 首先需要你耐得住寂寞,大家都知道,我们国家的产业政策,特别是在北方不主张发展工业,首当其冲的是加工业,我在北京,市政府近年来上的工业项目最大的是韩国的现代轿车,全套引进。说实话,加工业是第二产业,比不上服务 ...…

查看全部问答∨

高性价比兼容三菱FX1N国产系列PLC

功能介绍:   ○ 编程软件兼容日本三菱FXGP_WIN-C梯形图软件,在应用中相当于三菱的FX1N;   ○ 工作电源AC18V或DC24V,带有防雷击保护电路; ○ 主板有20路I/0输入输出,其中输入12路,输出8路(有继电器输出和晶体管输出两种型号); ○ 本 ...…

查看全部问答∨

【藏书阁】图表细说元器件及实用电路

目录: 第1章 新概念电子电路入门基础 1.1 熟悉最基本的日常电路 1.1.1 电工电路与电子电路的区别 1.1.2 电子电路图和电路图识图信息解析 1.1.3 常见电子电路种类解说 1.2 掌握基本的技术名词和概念 1.2.1 电流概念解说 1.2.2 电位、电压 ...…

查看全部问答∨

7*1W LED驱动 方案 FAN103 做出来的成本是否有竞争性

7*1W LED驱动 85-265输入 变压器隔离 恒流输出 成本上考虑是否适用; 有比这方案更好的吗? …

查看全部问答∨

wince 启动拍照功能实现问题

各位,小弟想请教一下, 在wince 5.0 或6.0 中怎么启动拍照功能, 最好是用C# 的,请各位帮忙,谢谢!…

查看全部问答∨

串口传送数据传了3个字节,只显示一个字节

uchar buffer[]={0xaa,0xbb,0x64}; void init_serial();  //串品初始化 void senddata(uchar *buffer,uchar length);//发送数据 void senddata(uchar *buffer,uchar length) {   uchar i;   for(i=0;i<lengt ...…

查看全部问答∨

有关遨游设置问题

遨游右上角有我的电脑、注册表编辑器 什么的 想把其中一个改为WORD  编辑的命令是什么? …

查看全部问答∨

在XP中无法正常使用数码相机的问题!

在下有一套 SIPIX矽峰SC-1300/SC-2100的数码相机,驱动程序只支持到WindowsXP SP1,在SP2的系统上就不行了(驱动能装上,但是使用Photoshop等软件都无法引入图象,但windows2003/windows2000/windowsXP SP1下就可以正常使用),去下载驱动,发现我这个驱动 ...…

查看全部问答∨

LPC1114中的CT32B0_MAT2与CT16B1_CAP0都是具体怎么解释啊

请问LPC1114中的CT32B0_MAT2与CT16B1_CAP0都是具体怎么解释啊…

查看全部问答∨

无叶风扇原理图

最近想搞个无叶风扇,不知道大家谁有它的图纸参考下。还有,它的电机是不是步进电机?电机上也没有型号文字。在此先谢了。…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved