找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1248|回复: 0
打印 上一主题 下一主题
收起左侧

温度及设计

[复制链接]
跳转到指定楼层
楼主
ID:348848 发表于 2018-6-10 16:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

源程序代码
                                                           

//DS18B20的读写程序,数据脚P2.7                     //

//温度传感器18B20汇编程序,采用器件默认的12位转化   //

//最大转化时间750微秒,显示温度-55+125,显示精度 //

//0.1度,显示采用4LED共阳显示测温值            //

//P0口为段码输入,P34~P37为位选                       //

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


#include "reg51.h"

#include "intrins.h"       //_nop_();延时函数用

#define  dm P0              //段码输出口

#define  uchar unsigned char

#define  uint  unsigned int

sbit DQ=P2^7;       //温度输入口

sbit w0=P2^0;       //数码管4

sbit w1=P2^1;              //数码管3

sbit w2=P2^2;              //数码管2

sbit w3=P2^3;             //数码管1

sbit beep=P1^7;      //蜂鸣器和指示灯

sbit set=P2^6;        //温度设置切换键  

sbit add=P2^4;        //温度加

sbit dec=P2^5;        //温度减

int temp1=0;          //显示当前温度和设置温度的标志位为0时显示当前温度

uint h;

uint temp;

uchar r;

uchar high=35,low=20;

uchar sign;

uchar q=0;

uchar tt=0;

uchar scale;

//**************温度小数部分用查表法***********//

uchar codeditab[16]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};              //小数断码表

uchar codetable_dm[12]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40};

//共阴LED段码表       "0"  "1"  "2" "3"  "4"  "5" "6"  "7"  "8" "9" "不亮" "-"  

uchar table_dm1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};  //个位带小数点的断码表

  

uchar data temp_data[2]={0x00,0x00};             //读出温度暂放

uchar data display[5]={0x00,0x00,0x00,0x00,0x00};     //显示单元数据,共4个数据和一个运算暂用

/*****************11us延时函数*************************/


void delay(uint t)

{

  for (;t>0;t--);

}


void scan()

{

int j;

         for(j=0;j<4;j++)

         {

                   switch (j)

                   {

                            case0: dm=table_dm[display[0]];w0=0;delay(50);w0=1;//xiaoshu

                            case1: dm=table_dm1[display[1]];w1=0;delay(50);w1=1;//gewei

                            case2: dm=table_dm[display[2]];w2=0;delay(50);w2=1;//shiwei

                            case3: dm=table_dm[display[3]];w3=0;delay(50);w3=1;//baiwei

                                     //       else{dm=table_dm[b3];w3=0;delay(50);w3=1;}

         }

         }

}


//***************DS18B20复位函数************************/

ow_reset(void)

{

char presence=1;

while(presence)

{

  while(presence)

   {

    DQ=1;_nop_();_nop_();//从高拉倒低

DQ=0;                                       

delay(50);           //550 us

DQ=1;                                       

delay(6);            //66 us

presence=DQ;         //presence=0复位成功,继续下一步

   }

   delay(45);            //延时500 us

   presence=~DQ;         

}

DQ=1;                   //拉高电平

}

/****************DS18B20写命令函数************************/

//1-WIRE 总线上写1个字节

void write_byte(uchar val)

{

  uchar i;

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

  {

   DQ=1;_nop_();_nop_();                  //从高拉倒低

  DQ=0;_nop_();_nop_();_nop_();_nop_(); //5 us

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

   delay(6);                              //66 us

   val=val/2;                             //右移1

   }

   DQ=1;

   delay(1);

}

/****************DS18B201字节函数************************/

//从总线上取1个字节

uchar read_byte(void)

{

uchar i;

uchar value=0;

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

{

  DQ=1;_nop_();_nop_();

  value>>=1;

DQ=0;_nop_();_nop_();_nop_();_nop_();         //4 us

DQ=1;_nop_();_nop_();_nop_();_nop_();         //4 us

  if(DQ)value|=0x80;

  delay(6);                                     //66 us

}

DQ=1;

return(value);

}


/*****************读出温度函数************************/

read_temp()

{

  ow_reset();                  //总线复位

  delay(200);

  write_byte(0xcc);            //发命令

  write_byte(0x44);            //发转换命令

  ow_reset();

  delay(1);

  write_byte(0xcc);            //发命令

  write_byte(0xbe);

  temp_data[0]=read_byte();    //读温度值的第字节

  temp_data[1]=read_byte();    //读温度值的高字节

  temp=temp_data[1];

  temp<<=8;                                               

  temp=temp|temp_data[0];      // 两字节合成一个整型变量。

return temp;                 //返回温度值

}

/****************温度数据处理函数************************/

//二进制高字节的低半字节和低字节的高半字节组成一字节,这个

//字节的二进制转换为十进制后,就是温度值的百、十、个位值,而剩

//下的低字节的低半字节转化成十进制后,就是温度值的小数部分

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

work_temp(uint tem)

{

uchar n=0;

if(tem>6348)                       // 温度值正负判断

     {tem=65536-tem;n=1;}            // 负温度求补码,标志位置1

     display[4]=tem&0x0f;          // 取小数部分的值

display[0]=ditab[display[4]];  // 存入小数部分显示值

     display[4]=tem>>4;            // 取中间八位,即整数部分的值

display[3]=display[4]/100;     //取百位数据暂存

  display[1]=display[4]%100;     // 取后两位数据暂存

  display[2]=display[1]/10;      // 取十位数据暂存

  display[1]=display[1]%10;     //个位数据

r=display[1]+display[2]*10+display[3]*100;

/////符号位显示判断/////

  if(!display[3])

  {

    display[3]=0x0a;           //最高位为0时不显示

    if(!display[2])

{

   display[2]=0x0a;        //次高位为0时不显示

}

  }

  if(n){display[3]=0x0b;}      //负温度时最高位显示"-"

}


void BEEP()

{

         if((r>=high&&r<129)||r<low)

         {

                   beep=!beep;

         }

         else

         {

                   beep=0;

         }

}

//*********设置温度显示转换************//

void xianshi(int horl)

{

         int n=0;

         if(horl>128)

         {

                   horl=256-horl;n=1;

         }

         display[3]=horl/100;

         display[3]=display[3]&0x0f;

         display[2]=horl%100/10;

         display[1]=horl%10;

         display[0]=0;

         if(!display[3])

         {

             display[3]=0x0a;          //最高位为0时不显示

             if(!display[2])

                   {

                      display[2]=0x0a;        //次高位为0时不显示

                   }

         }

           if(n)

           {

                  display[3]=0x0b; //负温度时最高位显示"-"

           }     


}


//*********按键查询程序**************//

void keyscan()

{

         int temp1;   //最高温度和最低温度标志位

         if(set==0)   

         {

                   while(1)

                   {      

                            delay(500);//消抖

                            if(set==0)

                            {      

                                     temp1++;

                                     while(!set)

                                     scan();

                            }

                            if(temp1==1)

                            {

                                     xianshi(high);

                                     scan();

                                     if(add==0)

                                     {

                                               while(!add)

                                               scan();

                                               high+=1;

                                     }

                                     if(dec==0)

                                     {

                                               while(!dec)

                                               scan();

                                               high-=1;

                                     }

                            }                 

                           

                            if(temp1==2)

                            {

                                     xianshi(low);

                                     if(add==0)

                                     {

                                               while(!add)

                                               scan();

                                               low+=1;

                                     }

                                     if(dec==0)

                                     {

                                               while(!dec)

                                               scan();

                                               low-=1;      

                                     }

                                     scan();

                            }

                            if(temp1>=3)

                            {

                                     temp1=0;

                                     break;

                            }

                   }

         }

}


/****************主函数************************/

void main()

{

         

          dm=0x00;                 //初始化端口

          w0=0;

          w1=0;

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表