找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 8008|回复: 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.51hei.com/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 单片机教程网

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