历史上的今天
返回首页

历史上的今天

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

正在发生

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

2019-10-29 来源:51hei

电路原理图如下:

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

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

//        芯片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);                        //发送读温度命令 

推荐阅读

史海拾趣

Custom Mmic Design Services Inc公司的发展小趣事

为了进一步拓展国际市场,CMDS积极寻求与国外企业的合作。通过与国际知名电子企业建立战略合作关系,CMDS不仅获得了先进的技术支持和市场资源,还成功将其产品打入国际市场。同时,公司还积极参加国际展会和交流活动,与全球同行建立了广泛的联系和合作网络。这些国际合作不仅为CMDS带来了更多的商业机会,也提升了其在国际市场上的知名度和影响力。

Dialog公司的发展小趣事

Dialog公司一直注重产品的安全性和可靠性。为了确保其产品和解决方案能够满足客户对安全性的要求,Dialog公司积极寻求各种认证和合规性评估。例如,Dialog公司的DA16200 Wi-Fi SoC获得了PSA一级认证,这标志着Dialog公司在芯片层面保护设备方面取得了重要里程碑。PSA Certified认证机制由Arm及其四个全球领先的独立安全评估实验室合作伙伴共同创立,该认证机制以一种方法论的方式来开发安全功能的最佳实践。获得PSA一级认证使Dialog公司能够确保其客户和合作伙伴在从芯片到应用的各个开发阶段都能获得安全性保障。

CT [ Central Technologies ]公司的发展小趣事

经过数年的努力,CT公司终于研发出了一款具有颠覆性的新型芯片技术。这款芯片在性能上大幅超越了当时的同类产品,引起了市场的广泛关注。多家知名企业纷纷与CT公司展开合作,将这款芯片应用于他们的产品中。随着合作伙伴的增加和市场份额的扩大,CT公司的知名度逐渐提升,成为了电子行业的一匹黑马。

硕颉(BITEK)公司的发展小趣事

硕颉科技不断推出创新产品,主打系列包括逆变器、LED驱动器、线性稳压器、AC/DC驱动器、MOSFET、视频编码器和解码器以及图像处理器等。这些产品广泛应用于消费电子领域,满足了市场对高质量电子产品的需求。同时,公司积极拓展销售网络,以台湾、韩国、中国大陆和日本等地区为主,逐步向全球市场扩张。

GE Industrial Solutions公司的发展小趣事
通过输入不同幅度的信号,测量输出信号的幅度,并计算输入输出之间的线性关系。
General Microcircuits Corp公司的发展小趣事
对于温度敏感的电路,可以采用温度补偿技术来减小因温度变化引起的漂移。

问答坊 | AI 解惑

ESP8266搭建环境导入工程编译失败

我买了个ESP8266模块,搭建了开发环境,导入了一个工程,编译出错,如图 请问高手,如何解决?谢谢! …

查看全部问答>

有没有人做过高斯白噪声叠加一个正弦信号的仿真工程,这是细胞自动化高斯白噪声

module CellularAutomata#(     parameter INIT_VEC = 32'b0100_1000_0001_0010_0100_1000_0001_0010,     parameter RULE_VEC = 32'b0000_1100_0100_0111_0000_1100_0000_0110,     N = 32 )(   ...…

查看全部问答>

GaN 功率级设计的散热注意事项

在任何电力电子转换器中,热设计都是一项重要的考虑因素。热设计经优化后,工程师能够将 GaN 用于各种功率级别、拓扑和应用中。此应用手册论述了 TI LMG341XRxxx GaN 功率级系列非常重要的权衡标准和注意事项,包括 PCB 布局、热界面、散热器选择和 ...…

查看全部问答>

全桥逆变的问题请教

本帖最后由 灞波儿奔 于 2022-11-16 08:48 编辑 请教一个全桥逆变的电路,下图是并网的电路,左边是电网,右边的全桥逆变,这个-200接起来什么意思?     …

查看全部问答>

请问JY134G9是哪家的液晶屏,这是我下载的资料中出现的一个型号,网上查不到是哪家的

请问JY134G9是哪家的液晶屏,这是我下载的资料中出现的一个型号,网上查不到是哪家的,所以问问大家。 …

查看全部问答>

闲置电源适配器改装成可调电源

分享的一位UP主的作品,闲置电源适配器改装成可调电源,有感兴趣的可以搞起来!     …

查看全部问答>

【创龙科技全志A40i开发板】TL7606I模块测试

## 前 言 本文主要介绍基于全志科技A40i(ARM Cortex-A7)处理器的8/16通道AD采集开发案例,使用核芯互联CL1606/CL1616AD芯片,亦适用于ADI AD7606/AD7616。CL1606/CL1616与AD7606/AD7616软硬件兼容。 > 备注: > > (1)创龙科技TL7606I ...…

查看全部问答>

招聘 软件开发工程师(嵌入式)

浙江南都电源动力股份有限公司(股票代码:300068)面向智慧储能、数据中心、工业后备和绿色出行四大应用领域,提供以锂离子电池和铅电池为核心的产品、系统集成及服务,同时打造了“锂电池循环产业链”和“铅电池循环产业链” ...…

查看全部问答>

招聘 BMS软件开发工程师 工作地点北京

浙江南都电源动力股份有限公司(股票代码:300068)面向智慧储能、数据中心、工业后备和绿色出行四大应用领域,提供以锂离子电池和铅电池为核心的产品、系统集成及服务,同时打造了“锂电池循环产业链”和“铅电池循环产业链” ...…

查看全部问答>

最小的CP/M微型计算机

  爱好者Kian Ryan组装了一台很可能是最小的CP/M微型计算机--建立在Pimoroni Tiny 2040和Adafruit microSD读卡器之上。   “我一直在使用RC 2014作为CP/M开发机器,特别是在开发跨平台的Rogue类游戏时。我喜欢它,” ...…

查看全部问答>