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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 9551|回復: 14
打印 上一主題 下一主題
收起左側

DS18B20溫度計精簡設計

  [復制鏈接]
跳轉到指定樓層
樓主
ID:70941 發表于 2015-4-19 22:43 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
本帖最后由 dagu 于 2015-4-19 22:44 編輯



材料:如下圖所示





       DS18B20溫度傳感器、STC12C5A60S2單片機、40針插座一個、共陽4聯排LED12Mhz晶振、30p電容(2個)、電源接頭、導線、熱縮套管。另外用到AB膠圖中沒有列出。
制作注意點:
1、  把40針插座靠近單片機電源口那個地方剪掉,便于安裝電源插座,如下圖顯示,可以在電源座接頭引線的位置先把插針取消,便于焊接,免除不必要的麻煩。設計好位置之后,把電源座用AB膠粘在CPU背面。
2、晶振、電容焊接時候,注意檢查不要有短路
電路圖




源程序:
下列程序也是用網上的程序進行修改,主要改動部分是顯示輸出部分,而溫度轉換是采用的查表法(具體原理還沒有看懂),但該程序經過編譯,100%通過。STC12C5A60S2.h頭文件下載:http://www.zg4o1577.cn/mcu/2564.html
#include < STC12C5A60S2.h >
#include < intrins.h >

#define uchar unsigned char
#define uint   unsigned int
bit presence   ;
//***************************************************************************************************//
sbit DQ = P1^6 ;             //定義DS18B20端口DQ  
sbit   LED_A      =P4 ^ 4; //設置LED點陣屏連接的I/O
sbit   LED_B      =P0 ^ 6; //設置LED點陣屏連接的I/O
sbit   LED_C       =P3 ^ 0; //設置LED點陣屏連接的I/O
sbit   LED_D      =P3 ^ 2; //設置LED點陣屏連接的I/O
sbit   LED_E       =P3 ^ 3; //設置LED點陣屏連接的I/O
sbit   LED_F       =P4 ^ 5; //設置LED點陣屏連接的I/O
sbit   LED_G      =P4 ^ 7; //設置LED點陣屏連接的I/O
sbit   LED_DP    =P3 ^ 1; //設置LED點陣屏連接的I/O
sbit LED1= P2^7 ;            //定義LED數碼管位腳
sbit LED2= P4^6 ;
sbit LED3= P0^7 ;
sbit LED4= P1^7 ;
//***************************************************************************************************//
unsigned char data   temp_data[2] = {0x00,0x00} ;
unsigned char data   display[5] =    {0x00,0x00,0x00,0x00,0x00} ;
unsigned char code   ditab[16] =     {0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,
                                                        0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09} ;
unsigned char code   mytab[4] = {0xF9,0xB0,0x92,0x99} ;//純粹用來測試,可刪除
//***************************************************************************************************//
const uchar tab[]={             /* 根據共陰極字型編碼表獲取0~9A~B字型代碼 */
         0x3f,0x06,0x5b,0x4f,//0~3
         0x66,0x6D,0x7D,0x07,//4~7
         0x7F,0x6F,0x77,0x7C,//8~b
         0x39,0x5E,0x79,0x71,//c~f
         0x00//mie
};
//***************************************************************************************************//
const uchar tab1[]={             /* 根據共陽極字型編碼表獲取0~9A~B字型代碼 */
         0xC0,0xF9,0xA4,0xB0,//0~3
         0x99,0x92,0x82,0xF8,//4~7
         0x80,0x90,0x88,0x83,//8~b
         0xC6,0xA1,0x86,0x8E,//c~f
         0xff//mie
};
#define delayNOP() ; {_nop_() ;_nop_();_nop_() ;_nop_() ;} ;

/*******************************************************************/
void delay1(int ms)
{
unsigned char y ;
  while(ms--)
{
  for(y = 0 ; y<250 ; y++)
   {
   _nop_() ;
   _nop_() ;
   _nop_() ;
   _nop_() ;
   }
}
}

/******************************************************************/
/*us級延時函數                                         */
/*******************************************************************/
void Delay(unsigned int num)   //延時6us,誤差 0us
{
   unsigned char a;
         while(num--!=0)
   {for(a=15;a>0;a--);}
}

/*void Delay(unsigned int num)
{
  while( --num ) ;
}
*/

/*********************************************************************************************/
void PUTLED (unsigned char d){ //LED段輸入
         unsignedchar i;
         i= d & 0x01;
         if(i== 0x00){              LED_A = 0;}
         i= d & 0x02;
         if(i== 0x00){              LED_B = 0;}
         i= d & 0x04;
         if(i== 0x00){              LED_C = 0;}
         i= d & 0x08;
         if(i== 0x00){              LED_D = 0;}
         i= d & 0x10;
         if(i== 0x00){              LED_E = 0;}
         i= d & 0x20;
         if(i== 0x00){              LED_F = 0;}
         i= d & 0x40;
         if(i== 0x00){              LED_G = 0;}
         i= d & 0x80;
         if(i== 0x00){              LED_DP = 0;}
}
/*******************************************************************/
void dis_off(void){
LED_A      =1;//設置LED點陣屏連接的I/O
LED_B      =1;//設置LED點陣屏連接的I/O
LED_C       =1;//設置LED點陣屏連接的I/O
LED_D      =1;//設置LED點陣屏連接的I/O
LED_E       =1;//設置LED點陣屏連接的I/O
LED_F       =1;//設置LED點陣屏連接的I/O
LED_G      =1;//設置LED點陣屏連接的I/O
LED_DP    =1;//設置LED點陣屏連接的I/O
LED1= 0 ;           
LED2= 0;
LED3=0 ;
LED4= 0 ;   
}
/*******************************************************************/
void displayLED(void){
dis_off();
PUTLED(tab1[display[3]]);//顯示百位
LED1=1;
Delay(150);
dis_off();
PUTLED(tab1[display[2]]);//顯示十位
LED2=1;
Delay(150);
dis_off();
PUTLED(0x7f&tab1[display[1]]);//顯示個位和小數點
LED3=1;
Delay(150);
dis_off();
PUTLED(tab1[display[0]]);//顯示小數位
LED4=1;
Delay(150);
dis_off();
}

/*******************************************************************/
/*初始化ds1820                                                    */
/*******************************************************************/
Init_DS18B20(void)
{  
     DQ = 1 ;       //DQ復位
     Delay(8) ;     //稍做延時

     DQ = 0 ;       //單片機將DQ拉低
     Delay(90) ;    //精確延時大于 480us

     DQ = 1 ;        //拉高總線
     Delay(8) ;

     presence = DQ ;     //如果=0則初始化成功 =1則初始化失敗
     Delay(100) ;
     DQ = 1 ;

     return(presence) ; //返回信號,0=presence,1=no presence
}


/* 讀一個字節                      */
/*******************************************************************/
ReadOneChar(void)
{
unsigned char i = 0 ;
unsigned char dat = 0 ;

for (i = 8 ; i > 0 ; i--)
   {
    DQ = 0 ; // 給脈沖信號
    dat >>= 1 ;
    DQ = 1 ; // 給脈沖信號

    if(DQ)
     dat |= 0x80 ;
    Delay(4) ;
   }

    return (dat) ;
}

/* 寫一個字節                                          */
/*******************************************************************/
WriteOneChar(unsigned char dat)
{
  unsigned char i = 0 ;
  for (i = 8 ; i > 0 ; i--)
   {
    DQ = 0 ;
    DQ = dat&0x01 ;
    Delay(5) ;

    DQ = 1 ;
    dat>>=1 ;
   }
}

/* 讀取溫度                            */
/*******************************************************************/
Read_Temperature(void)
{
     Init_DS18B20() ;

     WriteOneChar(0xCC) ;   // 跳過讀序號列號的操作
     WriteOneChar(0x44) ;   // 啟動溫度轉換

     Init_DS18B20() ;
     WriteOneChar(0xCC) ;   //跳過讀序號列號的操作
     WriteOneChar(0xBE) ;   //讀取溫度寄存器

     temp_data[0] = ReadOneChar() ;   //溫度低8
     temp_data[1] = ReadOneChar() ;   //溫度高8
}

/* 數據轉換與溫度顯示                                              */
/*******************************************************************/
Disp_Temperature()
{
  display[4]=temp_data[0]&0x0f ;
  display[0]=ditab[display[4]] ;     //查表得小數位的值

  display[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4);
  display[3]=display[4]/100 ;
  display[1]=display[4]%100 ;
  display[2]=display[1]/10 ;
  display[1]=display[1]%10 ;
    if(display[3]==0x00)         //高位為0,不顯示
    {
     display[3]=16 ;              
     if(display[2]==0x00)       //次高位為0,不顯示
     display[2]=16 ;
    }
         }


/* 主函數      */
/************************************/
void main()
{  P0M1=0x00;
   P0M0=0x80;
         P1M1=0x00;
   P1M0=0x80;
   P2M1=0x00;
   P2M0=0x80;

         P4M1=0x00;
   P4M0=0x40;
         P4SW= 0xff; //啟動P4接口
     while(1)
   {
   Read_Temperature() ;
   Disp_Temperature() ;
         displayLED();
    }
}




分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏9 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:77523 發表于 2015-4-22 15:28 來自手機 | 只看該作者
感謝分享~!!!!
回復

使用道具 舉報

板凳
ID:78702 發表于 2015-5-26 19:31 | 只看該作者
詳細資料,幫助別人
回復

使用道具 舉報

地板
ID:82588 發表于 2015-7-3 11:35 | 只看該作者
看了才明白所謂的精簡就是不要PCB或洞洞板的,不錯,頂一個
回復

使用道具 舉報

5#
ID:65730 發表于 2015-8-9 22:31 | 只看該作者
很好,現在的溫度計也不少,缺的是溫度控制裝置,
回復

使用道具 舉報

6#
ID:44267 發表于 2015-11-16 11:27 | 只看該作者
diy的精神讓人欽佩
回復

使用道具 舉報

7#
ID:77776 發表于 2015-11-18 22:39 | 只看該作者
不錯,程序也簡潔,元件也非常少
回復

使用道具 舉報

8#
ID:19947 發表于 2016-1-22 14:32 | 只看該作者
謝謝樓主的無私,學習了!
回復

使用道具 舉報

9#
ID:70785 發表于 2016-1-22 19:09 | 只看該作者
謝謝樓主,學習!
回復

使用道具 舉報

10#
ID:112579 發表于 2016-4-7 23:43 | 只看該作者
非常感謝啊啊   初學者  膜拜
回復

使用道具 舉報

11#
ID:137511 發表于 2017-4-7 18:18 | 只看該作者
感謝樓主, 終于找到個用STC12C5A60S2的了
回復

使用道具 舉報

12#
ID:136189 發表于 2017-4-9 06:59 來自手機 | 只看該作者
非常感謝,努力學習中,
回復

使用道具 舉報

13#
ID:137511 發表于 2017-4-15 19:28 | 只看該作者
/*********************************************************************************************/
void PUTLED (unsigned char d){ //LED段輸入
         unsignedchar i;



unsignedchar這個不是要空格分開嗎?》》》》unsigned char
回復

使用道具 舉報

14#
ID:210317 發表于 2017-6-15 10:52 | 只看該作者
正好課程設計要用到,看看
回復

使用道具 舉報

15#
ID:715628 發表于 2020-3-26 16:41 | 只看該作者
感謝分享感謝分享
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 91精品国模一区二区三区 | 91.com视频 | 亚洲一区二区免费电影 | 欧美一级片 | 国产麻豆乱码精品一区二区三区 | 一区二区亚洲 | 午夜视频一区二区三区 | 欧美在线视频观看 | 成人免费精品视频 | 国产一区精品在线 | 在线视频一区二区 | 在线中文字幕视频 | 成年人黄色免费视频 | 中文字幕在线观看一区二区 | aaa级片 | 天天夜夜人人 | 久久精品69 | 91 在线 | 欧美夜夜 | 美国黄色一级片 | 久久久久亚洲精品 | 国产精品精品视频一区二区三区 | 国产一区二区三区色淫影院 | 一区二区三区四区在线 | 中文字幕一区二区在线观看 | 欧美日韩专区 | 欧美国产一区二区三区 | 亚洲喷水 | 91精品国产91久久综合桃花 | 91精品国产综合久久久久久 | 亚洲国产精品美女 | 99这里只有精品 | 欧美日韩视频在线第一区 | 国产视频1 | 亚洲精品福利视频 | 日本午夜视频 | 伊人免费视频二 | 亚洲精品久久久一区二区三区 | 91国在线观看 | 亚洲一区二区三区视频在线 | 国产视频久久 |