久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1284|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久久久久黄 | 日本a∨视频 | 国产在线一区二 | 美女福利网站 | 日本一区视频在线观看 | 久久久久久女 | 欧美成人精品一区二区男人看 | 在线欧美视频 | 国产真实精品久久二三区 | 久久精品国产久精国产 | 亚洲一区av | 色婷婷综合久久久中字幕精品久久 | 成人免费日韩 | 久久免费精品 | 一区二视频 | 国产高清在线精品一区二区三区 | 337p日韩| 日韩视频精品 | 综合久久久久久久 | 国产精品久久久久久久白浊 | 欧美一级毛片免费观看 | 日韩毛片在线观看 | 日本一区二区三区免费观看 | 野狼在线社区2017入口 | 国产精品视频一区二区三区四蜜臂 | 91视频91| 黄色一级片在线播放 | 国产精品一区二区三区免费观看 | 欧美在线一区二区三区 | 中文字幕爱爱视频 | 啪视频在线 | 国产欧美在线播放 | 亚洲人精品午夜 | 在线观看一区 | 激情国产| 天天狠狠 | 色婷婷一区二区三区四区 | 欧洲亚洲精品久久久久 | 天天影视网天天综合色在线播放 | 日韩国产黄色片 | 毛片在线免费播放 |