基于PIC单片机的实时温度控制完整系统.docx

上传人:b****3 文档编号:1795105 上传时间:2022-10-24 格式:DOCX 页数:12 大小:94.85KB
下载 相关 举报
基于PIC单片机的实时温度控制完整系统.docx_第1页
第1页 / 共12页
基于PIC单片机的实时温度控制完整系统.docx_第2页
第2页 / 共12页
基于PIC单片机的实时温度控制完整系统.docx_第3页
第3页 / 共12页
基于PIC单片机的实时温度控制完整系统.docx_第4页
第4页 / 共12页
基于PIC单片机的实时温度控制完整系统.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

基于PIC单片机的实时温度控制完整系统.docx

《基于PIC单片机的实时温度控制完整系统.docx》由会员分享,可在线阅读,更多相关《基于PIC单片机的实时温度控制完整系统.docx(12页珍藏版)》请在冰豆网上搜索。

基于PIC单片机的实时温度控制完整系统.docx

基于PIC单片机的实时温度控制完整系统

基于PIC单片机的实时温度控制系统

//实现的功能:

数码管显示实时温度,支持负温度

//芯片PIC16F877

//XT:

4MHZ

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

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

#defineLVP0x3f39

//晶振:

XT;代码:

没有代码保护;上电延时定时器关闭;

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

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

#defineuchunsignedchar                    //给unsignedchar起别名uch

#defineDQRA2                               //定义18B20数据端口

#defineDQ_DIRTRISA2                        //定义18B20D口方向寄存器

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

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

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

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

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

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

voidinit_port(void);

voiddelay(charx,chary);

voiddelay_1ms(void);

voiddelay_ms(unsignedinttime);

voidinterruptdealtime();

voidtmint(void);

voidtimetoseg(uchfh_temp,uchbai_temp,uchshi_temp,uchge_temp,uchsf_temp,uchbf_temp,uchqf_temp,uchwf_temp);

voidbinary_temp(uchTL,signedcharTH);

voidreset(void);

voidwrite_byte(uchval);

uchread_byte(void);

voidget_temp(void);

unsignedchardisplay_data[8];

unsignedcharintcount=0;

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

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

uniontemp                        //定义一个联合体

{

intT;

uchTV[2];

}temp;

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

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

unsignedintwd;                             //转换后的温度值BCD码形式

unsignedcharfh;                              //符号位

unsignedcharbai;                            //整数百位

unsignedcharshi;                            //整数十位

unsignedcharge;                             //整数个位

unsignedcharshifen;                         //十分位

unsignedcharbaifen;                         //百分位

unsignedcharqianfen;                        //千分位

unsignedcharwanfen;                         //万分位

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

//   主程序

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

voidmain(void)

{

init_port();

tmint();

while

(1)

{        

  get_temp();

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

        

}

}

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

//端口初始化

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

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

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

voidinit_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;

}

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

//  延时程序

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

voiddelay(charx,chary)

{

charz;

do{

     z=y;

     do{;}while(--z);

    }while(--x);

}

//其指令时间为:

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

//则是:

14+(3*(Y-1)+7)*(X-1)。

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

//  延迟程序

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

voiddelay_1ms(void)

{

unsignedintn;

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

  {

   NOP();

  }

}

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

voiddelay_ms(unsignedinttime)

{

for(;time>0;time--)

  {

   delay_1ms();

  }

}

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

//复位DS18B20函数

voidreset(void)

{

uchpresence=1;

while(presence)

{

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

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

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

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

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

   elsepresence=0;                         //接收到应答信号

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

  }

}

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

//写18b20写字节函数

voidwrite_byte(uchval)

{

uchi;

uchtemp;

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读字节函数

uchread_byte(void)

{

uchi;

uchvalue=0;                               //读出温度

staticbitj;

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

{

  value>>=1;

  DQ_LOW();         //每次读时隙由主机发起,拉低总线至少1μs。

  NOP();

  NOP();

  NOP();

  NOP();

  NOP();

  NOP();   

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 幼儿教育 > 家庭教育

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1