数码之家

 找回密码
 立即注册

QQ登录

只需一步,快速开始

微信登录

微信扫一扫,快速登录

搜索
查看: 4607|回复: 13

[综合] 数字温度计制作

[复制链接]
发表于 2019-7-30 08:26:50 | 显示全部楼层 |阅读模式
单片机制作个数字温度计之前也做过,用洞洞版搭的,这次用覆铜板做个。
芯片:pic16f73
传感器;ds18b20
-55~125度

/***************以下是代码******************/
#include <pic.h>
__CONFIG(0x3B31);
//关闭看门狗,选择高速晶振,上电延时复位,掉电复位使能,代码保护

#define uchar unsigned char
#define uint  unsigned int
#define pinDIN    RA2                       //串行数据输入端
#define pinLOAD   RA1                        //数据锁存端
#define pinCLK    RA3                       //时钟
#define  DQ      RC2
#define  DQ_in   TRISC2=1
#define  DQ_LOW()    TRISC2=0;DQ=0
#define  DQ_HIGH()   TRISC2=1
#define LED RC0
void display(uchar num1,uchar num2,uchar num3,uchar num4);
#define _nop_() asm("nop")
uchar const LEDcode[]=
{0x7e,0x30,0x6d,0x79,0x33,0x5b,0x5f,0x70,0x7f,0x7b,   /*0,1,2,3,4,5,6,7,8,9,全灭*/
0x77,0x1f,0x4e,0x3d,0x4f,0x47,0x67,0x3e,0xff,  };    /*A,B,C,D,E,F,P,U,全亮*/
/*********************/

const unsigned char table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳极
//const uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共阴极
//带小数点字码
const uchar table1[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10}; //共阳极
//const uchar table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87, 0xff,0xef}; //共阴极

uint temper;
uchar flag_fu=0;  //温度正负值标志位
uchar a1,a2,a3,a4,a5;
//uchar w1,w2,w3,w4;
void delay(uint x);
void delayus(uint ,uchar );
void init();  
void reset();
uchar m=0;
char w=0;
void write_byte(uchar date);
uchar read_byte();
void get_tem();
void disp();
void display();
void sendword (uchar addr,uchar dat);
void sendbyte (uchar dat);
void init7219 (void);
void timer1_init();
uchar counter=0;
/****************************************/
void main()
{

//int result=0x00;       
        //uchar i;
init();
   //init7219();/********************/guan
sendword (0x0f,0x01);
delay(500);
  // clear7219();
sendword (0x0f,0x00);
delay(5);
   init();
write_byte(0x10);
timer1_init();
LED=1;
   while(1)
  {
   // uchar num;
   get_tem();
          //for(num=50;num>0;num--);
       // disp(a1,a2,a3,a4);
/***                if(w==1)
                {
                  LED1=0;
                        w=0;
                        }
                        else LED1=1;
***********/
   }  
}
/************************************/
void delay(uint x)
{
unsigned int a,b;
for(a=x;a>0;a--)
      for(b=110;b>0;b--);
  }

void init()
{
        ADCON1=0x06;                //a口设为普通口
  TRISB=0x00;
//        TRISD=0x00;
  TRISC=0X00;
  TRISA=0x00;
  PORTC=0xFF;
// PORTA=0x00;
  //PORTD=0x00;
  delay(1000);
  //PORTA=0xff;
PORTC=0x00;
}
/****************************/
void timer1_init()
{
        GIE=1;
        PEIE=1;
        T1CKPS0=1;T1CKPS1=1;                //1:8
        TMR1CS=0;
    TMR1IE=1;
        TMR1ON=1;
        TMR1H=0xfb;
        TMR1L=0x1e;

}
   void interrupt ISR(void)
  {
         
        if(TMR1IF==1)
        {
               
                TMR1IF=0;
                TMR1H=0xfb;
                TMR1L=0x1e;
        if(++counter>=100)
                   {
        //        w=1;
               
                LED=~LED;
                        counter=0;
                }
                return;
        }
                  }
/****************************/
void delayus(uint x,uchar y)
{
uint i;uchar j;
    for(i=x;i>0;i--)
      for(j=y;j>0;j--) ;
}

void reset()
{
      uchar st=1;
          DQ_HIGH();
          NOP();NOP();
     while(st)
  {
          DQ_LOW();
          delayus(15,10);//750us
          DQ_HIGH();
          delayus(3,2);//70us
       st=DQ;
      if(DQ==1)
         st=1;
   else
          st=0;
   delayus(11,10);//500us
   }
}

void write_byte(uchar date)
{
  uchar i,temp;
     DQ_HIGH();
     NOP();NOP();
  for(i=8;i>0;i--)
   {

     temp=date&0x01;
      DQ_LOW();
      delayus(0,0);
      if(temp==1)
        DQ_HIGH();
      delayus(2,1);//45us
      DQ_HIGH();
     date=date>>1;
    }
}

uchar read_byte()
{
uchar i,date;
static bit j;
for(i=8;i>0;i-- )
  {
          date=date>>1;
          DQ_HIGH();
          NOP();NOP();
          DQ_LOW();
          NOP();NOP(); NOP();NOP(); NOP();NOP();
          DQ_HIGH();
          NOP();NOP(); NOP();NOP(); NOP();
          j=DQ;
          if(j==1)
             date=date|0x80;
            delayus(1,1);
   }  
       return(date);  
}

void get_tem()
{

        uchar tem1,tem2;
   // RC3=1;
        GIE=0;
        reset();
        write_byte(0xCC);
        write_byte(0x44);
        GIE=1;//
   // delayus(2,2);//600us(60,15)
   /// disp(a1,a2,a3,a4,a5);  ////
display(a1,a2,a3,a4);  /////////
        GIE=0;//
        reset();
        write_byte(0xCC);
        GIE=1;//
   delayus(2,1);
        GIE=0;//
        write_byte(0xBE);
        tem1=read_byte();
        tem2=read_byte();
         temper = ((tem2<<4)&0xF0)|((tem1>>4)&0x0F);
        GIE=1;//
  if(temper>127)
  {
        //temper = ~temper + 1;
                        flag_fu=1;
        }
        else
        {
                flag_fu=0;
        }


/*
   if(temper&0x8000)
        {
                temper=~temper;
                temper+=1;
                flag_fu=1;
        }
        else
        {
                flag_fu=0;
        }
   */
  temper=(tem2*256+tem1)*6.25;
   if(flag_fu==1)
        {        temper = ~temper + 1;}
                if(temper>10000)
        {
        a1=temper/10000;
        a2=temper%10000/1000;
        a3=temper%1000/100;
        a4=temper%100/10;
        a5=(temper%10);
                m=1;
        }
        else
        {
        a1=temper/1000;
        a2=temper%1000/100;
        a3=temper%100/10;
        a4=temper%10;
        a5=(temper%5);
                        m=0;
        }
/*************
        a1=temper/1000;
        a2=temper%1000/100;
        a3=temper%100/10;
        a4=temper%10;
        a5=(temper%5);


*****************/
//RC3=0;
}

/**************************************************
*         向MAX7219写入字节(8位)函数                      *
***************************************************/
void sendbyte (uchar dat)
{
        uchar i,temp;
        _nop_();
        for (i=0;i<8;i++)
   {
       temp=dat&0x80;
       dat=dat<<1;
       if(temp)
           pinDIN=1;
       else
           pinDIN=0;
       pinCLK=0;
       _nop_();
       pinCLK=1;         
   }
}
/**************************************************
*        向MAX7219写入地址和控制字(16位)                  *
***************************************************/
void sendword (uchar addr,uchar dat)
{
        pinLOAD=0;
        _nop_();
        sendbyte (addr);
        _nop_();
        sendbyte (dat);
        _nop_();
        pinLOAD=1; //第16个上升沿之后,第17个上升沿之前必须把pinCLK置高,否则数据丢失
}
/**************************************************
*                MAX7219初始化                                          *
***************************************************/
void init7219 (void)
   {
            sendword (0x0c,0x01);     /*  设置电源工作模式      */   
            sendword (0x0a,0x04);     /*   设置亮度  19/32      */  
            sendword (0x0b,0x07);     /*  设置扫描界限          */
            sendword (0x09,0x00);     /*   设置译码模式         */
                sendword (0x0f,0x00);     /*显示测试 00为正常工作状态*/
   }
/**************************************************
*                MAX7219清除显示                                  *
***************************************************/
void clear7219(void)
{
        uchar i;
        for(i=8;i>0;i--)
        {
                sendword(i,0x00);
        }
}
void disp()
{
                                                if(m==1)
                                                {
                                                 // clear7219();  
                        sendword(0x01,LEDcode[a5]);
                                                delay(2) ;
                        sendword(0x02,LEDcode[a4]);  //|0x80;XIAOSHU
                                                        delay(2) ;
                        sendword(0x03,LEDcode[a3]|0x80);
                                                delay(2) ;
                        sendword(0x04,LEDcode[a2]);
                                                        delay(2) ;
                        sendword(0x05,LEDcode[a1]);  
                        //sendword(0x06,LEDcode[3]);  
                       // sendword(0x07,LEDcode[2]);  
                        //sendword(0x08,LEDcode[1]);
                                                delay(2) ;
                                                }
                                                else if(m==0)
                                        {
                                                 // clear7219();  
                        sendword(0x01,LEDcode[a5]);
                                                delay(2) ;
                        sendword(0x02,LEDcode[a4]);  //|0x80;XIAOSHU
                                                        delay(2) ;
                        sendword(0x03,LEDcode[a3]);
                                                delay(2) ;
                        sendword(0x04,LEDcode[a2]|0x80);
                                                        delay(2) ;
                        sendword(0x05,LEDcode[a1]);  
                        //sendword(0x06,LEDcode[3]);  
                       // sendword(0x07,LEDcode[2]);  
                        //sendword(0x08,LEDcode[1]);
                                                delay(2) ;
                                        }
}
void display(uchar num1,uchar num2,uchar num3,uchar num4)
{
                 if(m==1)
                        {
       
                        PORTB=table[num1];//段选
               
                        RC4=1;        //11110111          位选
                        delay(3);
                        RC4=0;
                        PORTB=table[num2];
               
                        RC5=1;        //11110111          位选
                        delay(3);
                        RC5=0;
                        PORTB=table1[num3];
                               
                        RC6=1;        //11110111          位选
                        delay(3);
                        RC6=0;
                       
                        PORTB=table[num4];
               
                        RC7=1;        //11110111          位选
                        delay(3);
                        RC7=0;
                        delay(3);
                        //PORTC&=0X0F;
               
                        }
          else
                {
                PORTB=table[num1];//段选
               
                RC4=1;        //11110111          位选
                delay(3);
                RC4=0;
                PORTB=table1[num2];
       
                RC5=1;        //11110111          位选
                delay(3);
                RC5=0;
       
                PORTB=table[num3];
               
                RC6=1;        //11110111          位选
                delay(3);
                RC6=0;
                PORTB=table[num4];
               
                RC7=1;        //11110111          位选
                delay(3);
                RC7=0;
                delay(3);
                //PORTC&=0X0F;
                }

}

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x

打赏

参与人数 4家元 +44 收起 理由
温力口 + 10 谢谢分享,以次鼓励。。。。。.
10655188 + 4 謝謝分享
人艰不拆了 + 10
邓穿石 + 20 原創內容

查看全部打赏

发表于 2019-7-30 09:15:06 | 显示全部楼层
三极管样子那是传感器吗:loveliness:
回复 支持 反对

使用道具 举报

发表于 2019-7-30 09:18:26 | 显示全部楼层
I/O口有富裕功能还可以扩展加上温度控制或时钟功能也不错。

打赏

参与人数 1家元 +10 收起 理由
aec + 10 謝謝分享

查看全部打赏

回复 支持 反对

使用道具 举报

发表于 2019-7-30 09:22:01 | 显示全部楼层
手底下还有几个ds18b20,单总线通讯的~
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-7-30 09:29:51 来自手机浏览器 | 显示全部楼层
本帖最后由 qwer1415926 于 2019-7-30 11:27 编辑
人艰不拆了 发表于 2019-7-30 09:15
三极管样子那是传感器吗

数字传感器,最高精度可测0.0625°C上面的程序可以同时驱动MAX7219,和动态数码管同步显示,
电路板上另一个端子是预留输出口可驱动继电器。可以设置报警温度LED指示灯
1S亮一次。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x
回复 支持 反对

使用道具 举报

发表于 2019-7-30 17:54:47 | 显示全部楼层
我做开的产品用18B20 , 基本为了省事后续都用这货 . 显示用TM1650驱动可以省去好多代码和程序运行时间,这对功能多的系统有大帮助.
回复 支持 反对

使用道具 举报

发表于 2019-7-30 20:35:32 | 显示全部楼层
qwer1415926 发表于 2019-7-30 09:29
数字传感器,最高精度可测0.0625°C上面的程序可以同时驱动MAX7219,和动态数码管同步显示,
电路板上另一 ...

本人觉得max7219并不好用。我用的是另一款芯片。
回复 支持 反对

使用道具 举报

发表于 2019-7-30 22:33:18 | 显示全部楼层
人艰不拆了 发表于 2019-7-30 09:15
三极管样子那是传感器吗

18B20,单总线数字温度传感器。
回复 支持 反对

使用道具 举报

发表于 2019-7-30 23:28:20 | 显示全部楼层
不错不错,有时间仿制一个
回复 支持 反对

使用道具 举报

发表于 2019-7-30 23:29:42 | 显示全部楼层
温度探头是哪个啊?不需要温度探头吗?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-7-31 08:06:32 | 显示全部楼层
digitliferr 发表于 2019-7-30 23:29
温度探头是哪个啊?不需要温度探头吗?

[url=DS18B20中文资料 - 百度文库  https://wenku.baidu.com/view/df6db6a327d3240c8447efda.html]18b20[/url]
回复 支持 反对

使用道具 举报

发表于 2019-8-1 22:03:09 | 显示全部楼层
谢谢分享,以次鼓励。。。。。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-8-2 09:27:52 | 显示全部楼层
603599910 发表于 2019-7-30 17:54
我做开的产品用18B20 , 基本为了省事后续都用这货 . 显示用TM1650驱动可以省去好多代码和程序运行时间,这对 ...

TM1650驱动代码没写好,显示不了,可以发个示例吗
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-8-6 19:02:51 来自手机浏览器 | 显示全部楼层
mengsiu 发表于 2019-7-30 20:35
本人觉得max7219并不好用。我用的是另一款芯片。

TM1650驱动可以给发一下吗?自己写了没有显示。
回复 支持 反对

使用道具 举报

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

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-7-21 22:09 , Processed in 0.124800 second(s), 12 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

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