精华内容
下载资源
问答
  • 包含有C8051F单片机采集颜色传感器信号。并通过12864将采集的信号进行显示。。程序在硬件电路上调试通过。。
  • 传统的温度控制系统采用热敏电阻器或热电偶测量温度,但是由于模拟温度传感器输出的是模拟信号,必须经过A/D转换等环节才能获得数字信号,再加上这种温度采集电路有时需要冷端补偿电路,这样增加了电路的复杂性,且...
  • 传感器包括一个电阻式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。因此该产品具有品质卓越、超快响应、抗干扰能力强、性价比极高等优点。每个DHT11传感器都在极为精确的湿度校验室中进行校准。校准...
  • 0 引言  在工业生产中,电流、电压、温度、压力、流量、流速和开关量都是常用的主要被控参数。其中,温度控制也越来越重要。...这种温度采集系统需要大量的测温电缆,才能把现场传感器的信号送到采集卡上.安装和拆
  • 0 引言  在工业生产中,电流、电压、温度、压力、流量、流速和开关量都是常用的主要被控参数。其中,温度控制也越来越重要。...这种温度采集系统需要大量的测温电缆,才能把现场传感器的信号送到采集卡上.安装和拆
  • PT100温度传感器恒流源式采集电路

    千次阅读 2019-09-24 14:41:00
    相较于常见的DS18B20温度传感器,PT100的测温范围更为广阔(为-200-680℃),而DS18B20的测温范围仅为-55℃~+125℃。我们采用的是如图1所示的两线制PT100温度传感器。 图 1 重新封装的PT100温度传感器 这里采用...

    相较于常见的DS18B20温度传感器,PT100的测温范围更为广阔(为-200-680℃),而DS18B20的测温范围仅为-55℃~+125℃。我们采用的是如图1所示的两线制PT100温度传感器。
    在这里插入图片描述

    图 1 重新封装的PT100温度传感器

    这里采用的是如图2所示的恒流源式测温电路对该传感器信号进行处理。

    在这里插入图片描述

    图 2恒流源式PT100测温电路示意图

    其原理为:

    通过运放U1A将基准电压4.096V转换为恒流源,电流流过Pt100时在其上产生压降,再通过运放U1B将该微弱压降信号放大,即输出期望的电压信号,该信号可直接连AD转换芯片。由运放的“虚短”和“虚断”可知:
    V 2 = V r e f ( 1 ) {{V}_{2}}={{V}_{ref}}\tag{ 1 } V2=Vref( 1 )

    V 5 = V 6 ( 2 ) {{V}_{5}}={{V}_{6}}\tag{ 2 } V5=V6( 2 )

    根据分压:
    V 5 = V o u t 1 ⋅ R 6 R 5 + R 6 ( 3 ) {{V}_{5}}={{V}_{out1}}\cdot \frac{{{R}_{6}}}{{{R}_{5}}+{{R}_{6}}}\tag{ 3 } V5=Vout1R5+R6R6( 3 )

    V 6 = V o u t 7 − ( V o u t 7 − V 2 ) ⋅ R 3 R 3 + R 4 ( 4 ) {{V}_{6}}={{V}_{out7}}-({{V}_{out7}}-{{V}_{2}})\cdot \frac{{{R}_{3}}}{{{R}_{3}}+{{R}_{4}}}\tag{ 4 } V6=Vout7(Vout7V2)R3+R4R3( 4 )

    对于点A出的电流总和为0,故有:
    V 2 R 1 = V o u t 1 − V 2 R p t 100 − ( V o u t 7 − V 2 ) R 3 + R 4 ( 5 ) \frac{{{V}_{2}}}{{{R}_{1}}}=\frac{{{V}_{out1}}-{{V}_{2}}}{{{R}_{pt100}}}-\frac{({{V}_{out7}}-{{V}_{2}})}{{{R}_{3}}+{{R}_{4}}}\tag{ 5 } R1V2=Rpt100Vout1V2R3+R4(Vout7V2)( 5 )

    联立(1)~(5),并代入具体数值,可解得:
    R p t 100 R 1 V r e f = 34 866 V o u t 7 + R p t 100 34 k + 866 k ( V o u t 7 − V r e f ) ( 6 ) \frac{{{R}_{pt100}}}{{{R}_{1}}}{{V}_{ref}}=\frac{34}{866}{{V}_{out7}}+\frac{{{R}_{pt100}}}{34k+866k}({{V}_{out7}}-{{V}_{ref}})\tag{ 6 } R1Rpt100Vref=86634Vout7+34k+866kRpt100(Vout7Vref)( 6 )

    因PT100阻值为百位级,故等式(6)右边第二项可忽略不计。于是有:
    V o u t 7 = 866 34 ⋅ V r e f R 1 ⋅ R p t 100 ( 7 ) {{V}_{out7}}=\frac{866}{34}\cdot \frac{{{V}_{ref}}}{{{R}_{1}}}\cdot {{R}_{pt100}}\tag{ 7 } Vout7=34866R1VrefRpt100( 7 )

    由式(7)可见,等效恒流源的电流为Vref/R1,放大倍数为866/34≈24.7428。对于PT100而言,电流大使得自身发热造成测量温度不准确。等效恒流源输出的电流不能太大,以不超过 1mA 为准,因此设定为Vref=4.096V,R1=4.12k(精度1%),等效电流约为0.9942mA。对应到具体温度(-50~200℃)范围时,Vout7输出电压变化范围为:2.03~4.45V。这个范围落在0~5V的可采电压范围内。
    在这里插入图片描述

    图 3 PT100测温电路原理图

    这里提供本电路原理图AD文件的下载:点击这里直达下载页面

    展开全文
  • 温度传感器PT100是一种稳定性和线性都比较好的铂丝热电阻传感器,可以工作在 -200℃ 至 650℃ 的范围....整个电路分为两部分,一是传感器前置放大电路,一是单片机 A/D 转换和显示,控制,软件非线性校正等部分.
  • 基于51单片机无线多路温度采集系统电路设计 电源模块 可选用 RS232电路设计 无线传输 具体电路设计见附件
  • 51单片机DS18B20温度传感器及数码管显示温度 大家好,今天给大家带来的代码及原理解释是,在51单片机在接收DS18B20温度传感器数据,并且在数码管上实时显示温度 DS18B20及数码管显示温度介绍51单片机DS18B20温度...

    51单片机DS18B20温度传感器及数码管显示温度

    大家好,今天给大家带来的代码及原理解释是,在51单片机在接收DS18B20温度传感器数据,并且在数码管上实时显示温度

    DS18B20作用

    								我们常用的DS18B20长什么样呢
    

    它一共有3个角,分别是
    GND(接地)
    DQ(数据总线,与单片机的一个IO口相连)
    Vdd(电源供应)
    在这里插入图片描述
    我使用的单片机是清翔的V3.21 单片机,采用的芯片是STC89C52

    DS18N20的电路原理图
    

    在这里插入图片描述
    因此,我会在C语言中用 sbit DS = P2^2 声明这个IO口叫做DS(DS18B20的数据总线),也就是我们可以写DS为 1或0 来控制它为低电平还是高电平

    在这里插入图片描述
    传感器输出的信号不可能是一个我们人类一眼就看的出的十进制数字,因此,我们需要将DS18B20输出的数字信号转换成一个十进制数字,让我们人类看的懂

    那么,我们应该怎样去读出DS18B20的数字信号呢,前提当然是我们首先得发出指令,让DS18B20知道我们要让它做什么

    怎么读取DS18B20的“1”和“0”

    DS18B20采用1-wire Bus(单总线时序),与之前的I2C和SPI(ADDA中光敏电阻和热敏电阻)不同,它只有一条线,因此,我们在给DS18B20发出和接收信号时,任何时序都必须非常严格以确保读出数据的准确,对我个人而言,SPI总线让我觉得非常舒服,因为它只有三个函数(89C52),虽然1-wire也只有三个函数,但它有非常严格的时序要求,写或读data要多少微秒以内才可以成功不出差错运行等等,待会大家就明白为什么了

    我先给大家看三个步骤,然后告诉大家怎么在C语言上实现这三个步骤

    1. 初始化DS18B20
    2. 写入ROM操作指令(在初学中我们一般只使用忽略ROM指令)
    3. 写入DS18B20功能指令(一般用温度准换指令和读取快速暂存器指令)

    如何初始化DS1820呢

    bit DSInit()
    {
      bit i;
      DS = 1;
      _nop_();
      DS = 0;
      delay_us(75);//拉低总线499.45us延时,在DQ总线上的DS18B20全部被复位
      DS = 1; //释放总线
      delay_us(4);  //37.95us
      i = DS;
      delay_us(20);   //141.95us,等待18b返回低电平存在信号
      DS = 1;//释放总线
      _nop_();
      return (i);
    }
    //us执行函数,执行一次us所需6.5us进入一次11.95us
    void delay_us(uchar us)
    {
      while(us--);
    }
    
    图为初始化时序
    

    在这里插入图片描述
    初始化时序里面包含了复位DS18B20和接收DS218B20的存在信号

    主机和DS18B20做任何通讯前都需要对其初始化,初始化期间,总线控制器拉低总线并保持480us以上,挂在总线上的器件将被复位,然后释放总线,等到15-60us,此时18B20将返回一个60-240us的低电平存在信号,我们需要等待60-240us,来接收完这个低电平存在信号
    如何进行写时序和读时序操作

    void DSWriteByte(uchar dat)    //总线每次只能写一位进去
    {
      uchar i;
      for(i = 0;i<8;i++)
      {
        DS = 0;   //下拉总线
        _nop_();    //产生一点时序
        DS = dat & 0x01;    //0x01  00000001
        delay_us(10);   //76.95us
        DS = 1;   //上拉总线
        _nop_();
        dat >>= 1;    //dat右移一位
      }
    }
    //读一个字节
    uchar DSReadByte()
    {
      uchar i,dat,j;
      for(i = 0;i<8;i++)
      {
        DS = 0;
        _nop_();    //产生读时序
        DS = 1;     //释放总线
        _nop_();
        j = DS;
        delay_us(10);   //76.95us
        DS = 1;
        _nop_();
        dat = ((j<<7)|(dat>>1) );
      }
      return (dat);
    }
    
    图为写时序和读时序
    

    在这里插入图片描述
    在这里插入图片描述

    1. 写时序分为写0时序和写1时序
    2. 总线控制器通过控制单总线高低电平持续时间从而把逻辑1或0写DS18B20中。
    3. 总线控制器要产生一个写时序,必须将总线拉低最少1us,产生写0时序时总线必须保持低电平60~120us之间,然后释放总线,产生写1时序时在总线产生写时序后的15us内允许把总线拉高。注意:2次写周期之间至少间隔1us(完成一个for循环大概就1us)
    4. 各位谨记上拉总线电压来释放总线
    5. 每一次 DS18B20 的操作都必须满足以上步骤,若是缺少步骤或是顺序混乱,器件
      将不会返回值。例如这样的顺序:发起 ROM 搜索指令[F0h]和报警搜索指令[ECh]
      之后,总线控制器必须返回步骤 1。

    因为我本身也是一个初学者,所以我对SPI总线和I2C还有UART串口通信,还比较模糊,我也建议各位认真,并且重复揣摩芯片手册,或者能读懂芯片手册,按照芯片手册来写出我们想要的效果,这样,我觉得我们才能成为一名合格的单片机学习者


    怎么让数码管显示在单片机的数码管上

    这里就直接给大家上代码吧!

    代码很长,但希望大家能够仔细对照着时序图阅读

    /*DS18B20只在一根通信线上 1-Wire
    只有唯一的64位序列码储存在板载ROM(方便识别DS18B20)
    12位分辨率对应为0.0625度*/
    #include<reg52.h>
    #include<intrins.h>
    
    #define uchar unsigned char
    #define uint  unsigned int
    
    //共阴数码管段选表0-9
    uchar code SMGduan[]= {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F,};
    //数码管位选码
    uchar code SMGwei[] = {0xfe, 0xfd, 0xfb, 0xf7};
    
    sbit DS = P2^2;     //DS18B20  DQ数据角
    sbit DU= P2^6;
    sbit WE = P2^7;
    
    void delay_us(uchar);
    /*1.初始化
      2.ROM操作指令
      3.功能指令*/
    
    /*if i == 0 那么18b20在总线上并且准备就绪*/
    bit DSInit()
    {
      bit i;
      DS = 1;
      _nop_();
      DS = 0;
      delay_us(75);//拉低总线499.45us延时,在DQ总线上的DS18B20全部被复位
      DS = 1; //释放总线
      delay_us(4);  //37.95us
      i = DS;
      delay_us(20);   //141.95us,等待18b返回低电平存在信号
      DS = 1;//释放总线
      _nop_();
      return (i);
    }
    //写一个字节
    void DSWriteByte(uchar dat)    //总线每次只能写一位进去
    {
      uchar i;
      for(i = 0;i<8;i++)
      {
        DS = 0;   //下拉总线
        _nop_();    //产生一点时序
        DS = dat & 0x01;    //0x01  00000001
        delay_us(10);   //76.95us
        DS = 1;   //上拉总线
        _nop_();
        dat >>= 1;    //dat右移一位
      }
    }
    //读一个字节
    uchar DSReadByte()
    {
      uchar i,dat,j;
      for(i = 0;i<8;i++)
      {
        DS = 0;
        _nop_();    //产生读时序
        DS = 1;     //释放总线
        _nop_();
        j = DS;
        delay_us(10);   //76.95us
        DS = 1;
        _nop_();
        dat = ((j<<7)|(dat>>1) );
      }
      return (dat);
    }
    //us执行函数,执行一次us所需6.5us进入一次11.95us
    void delay_us(uchar us)
    {
      while(us--);
    }
    void display(uint i)
    {
    	uchar b, s, g;
    	static uchar wei;
    	b = i / 100;
    	s = i % 100 / 10;
    	g = i % 10;
    	P0 = 0XFF;//清除断码
    	WE = 1;//打开位选锁存器
    	P0 = SMGwei[wei];
    	WE = 0;//锁存位选数据
    	P0 = 0XFF;//清除断码
    	switch(wei)
    	{
    		case 0: DU = 1; P0 = SMGduan[b]; 	DU = 0; break;
    		case 1: DU = 1; P0 = SMGduan[s]|0x80; 	DU = 0; break;
    		case 2: DU = 1; P0 = SMGduan[g]; 	DU = 0; break;
    	}
    	wei++;
    	if(wei == 3)
    		wei = 0;
    }
    void main()
    {
      uchar L,M;
    	uint i;
      while(1)
      {
        DSInit();   //初始化
        DSWriteByte(0xcc);    //发送忽略ROM指令
        DSWriteByte(0x44);    //发送完指令后,DS18B20开始转换并且存储到高速寄存器
        DSInit();
        DSWriteByte(0xcc);    //发送忽略ROM指令
        DSWriteByte(0xbe);    //读取DS18B20暂存器指令
        L = DSReadByte();   //读取LS BYTE
        M = DSReadByte();   //读取MS BYTE
        i = M;
        i<<=8;
        i |= L;		//效果为	假设M为00000111 左移八位变为 0000011100000000(<<自动补全0)然后或上L,相当于M+L 
        i = i*0.0625*10 +0.5;   //+0.5 为了四舍五入。因为if为int型,自动抛掉小数点后面
    		display(i);
      }
    }
    
    

    大家有不懂的都可以私信博主!

    代码成功运行图:  				 坐标苏州,室内温度20度左右
    

    坐标苏州,室内温度20度左右

    展开全文
  • DS18B20是DALLAS公司生产的一线式数字温度传感器,可直接将温度转化成串行数字信号给单片机处理,因而可省去传统的信号放大、A/D转换等外围电路。测量温度范围为-55~+125℃,在-10~+85℃范围内,精度为±0.5℃。 ...

    1.DS18B20简介

    DS18B20是DALLAS公司生产的一线式数字温度传感器,可直接将温度转化成串行数字信号给单片机处理,因而可省去传统的信号放大、A/D转换等外围电路。测量温度范围为-55~+125℃,在-10~+85℃范围内,精度为±0.5℃。

    1.1 内部结构

    DS18B20的内部结构如图所示,主要由4部分组成:64位ROM、温度敏感元件、非易失性温度报警触发器TH和TL、配置寄存器。图中,DQ为数字信号输入/输出端;VDD为外接供电电源输入端。
    在这里插入图片描述
    1)ROM(Read-Only Memory)
    ROM中的64位序列号是出厂前就被光刻好的,可看做是DS18B20的地址序列码,其作用是使每一个DS18B20的地址都不相同。这样就可以实现在一根总线上挂接多个DS18B20的目的。
    2)高速暂存器
    高速暂存器是一个9字节的存储器,其分配如下:
    在这里插入图片描述
    当温度转换命令发布后,经转换所得的温度值以2字节补码形式存放在高速暂存寄存器的第0和第1字节。单片机通过单总线接口读到该数据,读取时低位在前,高位在后。第3、4、5字节分别是TH、TL、配置寄存器的临时副本,每一次上电复位时被刷新;第6、7、8字节未用,表现为全逻辑1;第9字节读出的是前面所有8字节的CRC码,用来保证通信的正确性。一般情况下,用户只使用第0和第1字节。
    高速暂存器中的第5字节为配置寄存器,对其进行设置可更改DS18B20的测温分辨率以获得所需精度的数值,其数据格式如下:
    在这里插入图片描述
    TM是测试模式位,用于设置DS18B20为工作模式还是在测试模式。在DS18B20出厂时该位被写入0,用户不能改变。低5位一直都是1。R1和R0用来设置分辨率,配置寄存器与分辨率关系如下表所示。出厂时R0、R1被写入默认值:R0=1,R1=1(12位分辨率),用户可以根据需要改写配置寄存器,以获得合适的分辨率。
    在这里插入图片描述

    1.2工作时序

    DS18B20的工作协议流程是初始化→ROM操作指令→存储器操作指令→数据交换。对ROM的操作主要是读取DS18B20的序列号,以确定其地址以使待操作的DS18B20能对后续的存储器操作指令作出响应。对存储器的操作主要是对DS18B20进行读/写及完成温度转换等。
    初始化:单片机将数据线拉低480~960μs后释放,等待15~60μs,单总线器件即可输出持续60~240μs的低电平(存在脉冲),单片机收到此应答后即可对其进行操作。写时序:当主机将数据线从高拉到低时,形成写时序,有写“0”和写“1”两种。写时序开始后,DS18B20在15~60μs期间从数据线上采样,采样到低电平,则向DS18B20写“0”。采样到高电平,则向DS18B20写“1”。两个独立的时序间至少需要1μs的恢复时间(拉高总线电平)。读时序:当主机从DS18B20读取数据时,产生读时序。此时,主机将数据线从高拉到低位使读时序被初始化。如果此后15μs内,主机在总线上采样到低电平,则从DS18B20读“0”。而如果此后15μs内,主机在总线上采样到高电平,则从DS18B20读“1”。
    在这里插入图片描述

    1.3 功能命令

    DS18B20的功能是通过向ROM和存储器写命令实现的,所有的功能命令均为8位,常用命令代码如下表所示。
    在这里插入图片描述

    2.温度采集及其数码管显示程序

    #include <reg52.h>
    #include <intrins.h>
    #define MAIN_Fosc	11059200UL	//宏定义主时钟HZ  UL为unsigned long
    /*====================================
     自定义类型名
    ====================================*/
    typedef unsigned char INT8U;
    typedef unsigned char uchar;
    typedef unsigned int INT16U;
    typedef unsigned int uint;
    /*====================================
     硬件接口位声明
    ====================================*/
    sbit DS  = P2^2;   //DS18B20单总线
    sbit DU  = P2^6;   //数码管段选
    sbit WE  = P2^7;   //数码管位选
    /*====================================
    共阴极数码管段选码:code是keil C51里面的关键字,一般用于定义常量数组,意思是告诉编译说把这个数组放在ROM存储。使用ROM(程序存储器)的好处是加快读取速度,不占用系统资源 [2]  。
    unsigned char code table[]; 表示分配一个指向code区的指针,指针本身在默认存储区。
    code unsigned char table[]; 表示分配一个指向默认存储区的指针,指针本身在code区。
    ====================================*/
    uchar code table[]={ 
    //0		1	 2     3     4     5     6     7     8
    0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F,
    //9     A     B	   C	 D	   E	 F		-	 .	  关显示
    0x6F, 0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71, 0x40, 0x80, 0x00
                       };
    /*====================================
    数码管位选码
    ====================================*/
    				  //第1位	2位	  3位	 4位   5位	6位	  7位	8位
    uchar code T_COM[] = {0xfe, 0xfd, 0xfb, 0xf7, 0xef, 0xdf, 0xbf, 0x7f};//数码管位码
    /*====================================
    函数:void Delay_Ms(INT16U ms)
    参数:ms,毫秒延时形参
    ====================================*/
    void Delay_Ms(INT16U ms)
    {
         INT16U i;
    	 do{
    	      i = MAIN_Fosc / 96000; //11059200/96000=115
    		  while(--i);   //96T per loop:--i是先执行i=i-1,再使用i-1的值
         }while(--ms);
    }
    /*us延时函数,执行一次US--所需6.5us进入一次函数需要11.95us*/
    void Delay_us(uchar us)
    {
    	while(us--);	
    }
    /*====================================
    函数:void Display(INT16U Value)
    参数:Value,显示值 取值0-65535
    描述:共阴极数码管显示函数可显示一个字节的数
    ====================================*/
    void Display(INT16U Value)			//注意由于需要显示的数大于一个字节所有形参需为int型
    {	
    //------------------------------
    	DU = 0;							//关闭段选
    	P0 = table[Value/100];		//数码管显示百位
    	DU = 1;							//打开段选
    	DU = 0;							//关闭段选
    
    	WE = 0;						//关闭位选
    	P0 = T_COM[0];				   //第一位数码管
    	WE = 1;						//打开位选
    	WE = 0;						//关闭位选
    	Delay_Ms(3);
    //-------------------------------
    	DU = 0;
    	P0 = table[Value%100/10]|0x80; //显示十位
    	DU = 1;
    	DU = 0;
    
    	WE = 0;
    	P0 = T_COM[1];			  //第二位数码管
    	WE = 1;
    	WE = 0;
    	Delay_Ms(3);
    //-------------------------------
    	DU = 0;
    	P0 = table[Value%10];		//显示个位
    	DU = 1;
    	DU = 0;
    
    	WE = 0;
    	P0 = T_COM[2];				//第三位数码管
    	WE = 1;
    	WE = 0;
    	Delay_Ms(3);
    }
    /*单总线初始化时序*/
    bit ds_init()
    {
    	bit i;
    	DS = 1;
    	_nop_();
    	DS = 0;
    	Delay_us(75); //拉低总线499.45us 挂接在总线上的18B20将会全部被复位,即拉低总线480-960us
    	DS = 1; //释放总线
    	Delay_us(4); //延时37.95us 等待18B20发回存在信号  即等待15-60微秒
    	i = DS;
    	Delay_us(20); //141.95us
    	DS = 1;
    	_nop_();
    	return (i);
    }
    /*写一个字节,从低位开始*/
    void write_byte(uchar dat)
    {
    	uchar i;
    	for(i=0;i<8;i++)
    	{
    		DS = 0;
    		_nop_();//产生些时序
    		DS = dat & 0x01;
    		Delay_us(10);//76.95us
    		DS = 1; //释放总线准备下一次数据写入
    		_nop_();
    		dat >>= 1;
    	}
    }
    
    uchar read_byte()
    {
    	uchar i, j, dat;
    	for(i=0;i<8;i++)
    	{
    		DS = 0;
    		_nop_();//产生读时序
    		DS = 1;
    		_nop_();//释放总线
    		j = DS;
    		Delay_us(10);//76.95us
    		DS = 1;
    		_nop_();
    		dat = (j<<7)|(dat>>1);	
    	}
    	return (dat);
    }
    void main()
    {
    	uint i;
    	uchar L, M;
    	while(1)
    	{
    		ds_init();//初始化DS18B20
    		write_byte(0xcc);//发送跳跃ROM指令(跳过读序列号)
    		write_byte(0x44);//发送温度转换指令
    		ds_init();//初始化DS18B20
    		write_byte(0xcc);//发送跳跃ROM指令(跳过读序列号)
    		write_byte(0xbe);//读取DS18B20暂存器值
    		L = read_byte();
    		M = read_byte();
    		i = M;
    		i <<= 8;
    		i |= L;						
    		i = i * 0.0625 * 10 + 0.5;
    		Display(i);
    	}
    }
    
    展开全文
  • 基于51单片机温度检测电路仿真(Proteus)

    万次阅读 多人点赞 2018-11-01 22:45:46
    温度检测采用Proteus中的TCR传感器进行,然后经过差分运算放大电路传感器信号进行放大处理,然后送到ADC0831供CPU进行采集。 高温报警电路如图所示,当温度超过设定值时,D3亮,否则D2点亮。 显示电路采用4位数...

    主电路
    温度检测电路的总体电路如上图所示,主要包括温度传感器检测电路、高温报警电路、显示电路和主CPU电路构成。各部分的详细电路如下图所示:
    温度检测电路
    温度检测采用Proteus中的TCR传感器进行,然后经过差分运算放大电路对传感器信号进行放大处理,然后送到ADC0831供CPU进行采集。
    高温报警电路
    高温报警电路如图所示,当温度超过设定值时,D3亮,否则D2点亮。
    4位数码管显示电路
    显示电路采用4位数码管,由于使用51单片机的PO端口,所以需要进行上拉处理。
    具体驱动程序如下:主要包括ADC0831驱动子程序、数码管显示子程序以及高温报警程序。
    /* Main.c file generated by New Project wizard
    *

    • Created: 周四 11月 1 2018
    • Processor: AT89C52
    • Compiler: Keil for 8051
      */

    #include <reg51.h>
    #include <stdio.h>
    #include <intrins.h>

    #define TempHigh 300

    //定义数码管的位选通道,选择那个数码管显示
    sbit w1=P2^0;
    sbit w2=P2^1;
    sbit w3=P2^2;
    sbit w4=P2^3;
    //定义继电器控制电路的IO口
    sbit TempHighControl=P2^4;

    sbit CS_n=P1^0; //IO口定义
    sbit CLK=P1^1;
    sbit DIO=P1^2;

    //用于数码管显示的码表
    unsigned char code table[]=
    {
    0x3f,0x06,0x5b,0x4f,
    0x66,0x6d,0x7d,0x07,
    0x7f,0x6f,0x77,0x7c,
    0x39,0x5e,0x79,0x71
    };
    //控制数码管显示,选择第几个数码管亮,add可取1-4
    void wei(unsigned char add)
    {
    switch(add)
    {
    case 1:
    w1=0;
    w2=1;
    w3=1;
    w4=1;
    break;
    case 2:
    w1=1;
    w2=0;
    w3=1;
    w4=1;
    break;
    case 3:
    w1=1;
    w2=1;
    w3=0;
    w4=1;
    break;
    case 4:
    w1=1;
    w2=1;
    w3=1;
    w4=0;
    break;
    }
    }
    //延时函数,用于数码管消影
    void delayms(unsigned char xms)
    {
    unsigned char i,j;
    for(i=xms;i>0;i–)
    for(j=110;j>0;j–);
    }

    unsigned char Read_ADC0831()
    {
    unsigned char i,temp;
    DIO=1;
    nop();
    nop();
    CS_n=0;
    nop();
    nop();
    CLK=0;
    nop();
    nop();
    CLK=1;
    nop();
    nop();
    CLK=0;
    nop();
    nop();
    CLK=1;
    nop();
    nop();
    CLK=0;
    nop();
    nop();
    for(i=0;i<8;i++)
    {
    CLK=1;
    nop();
    nop();

    	temp<<=1;
    	if(DIO)
    	{
    		temp++;
    	}
    	CLK=0;
    	_nop_();
    	_nop_();
    }
    CS_n=1;
    _nop_();
    _nop_();
    return (temp);
    

    }

    void main(void)
    {
    // Write your code here
    unsigned int Result;
    while (1)
    {
    Result=Read_ADC0831()*100;
    Result=Result/50;
    P0=table[Result/1000];
    wei(1);
    delayms(4);
    P0=0x00;

    	P0=table[Result/100%10];
    	wei(2);
    	delayms(4);
    	P0=0x00;
    
    	P0=table[Result/10%10];
    	wei(3);
    	delayms(4);
    	P0=0x00;
    
    	P0=table[Result%10];
    	wei(4);
    	delayms(4);
    	P0=0x00;
    
    	if(Result>TempHigh)
    		TempHighControl=1;
    	else
    		TempHighControl=0;
      }
    

    }

    展开全文
  • 检测旋转物体的温度信号,使用3V电池供电,采用TI公司低功耗MSP430AFE253单片机,CPU本身集成了3个通道的24Bit的ADC,使用集成的ADC通道,2个通道采集热电偶信号,一个通道采集冷端补偿信号,CPU进行冷端补偿计算,...
  •  1、系统结构及工作原理 温度采集显示系统电路温度采集模块、A/D转换模块、单片机控制模块、数码管显示模块和模块组成。电路工作原理是:首先由LM35 温度传感器采集外界环境的温度,经LM358 放大
  • 51单片机使用LCD1602显示DS18B20温度传感器温度

    万次阅读 多人点赞 2020-05-07 11:29:31
      使用LCD1602显示DS18B20温度传感器温度。关于DS18B20和LCD的原理,我就不再叙述了,大家自行查找,网上可以找到好多。   使用Proteus仿真。(需要仿真和Keil工程文件的可以留言,看到回复) 需要的元件:   ...
  •  针对传统测温元件(热电偶、热电阻)组成的温度测量电路复杂,软件调试繁琐等缺点,设计基于MSC-51单片机及ADC0809的温度采集控制系统。该系统利用单片机中空余的I/O接口,以中断的方式实现温度的实时采集与控制,...
  •  针对传统测温元件(热电偶、热电阻)组成的温度测量电路复杂,软件调试繁琐等缺点,设计基于MSC-51单片机及ADC0809的温度采集控制系统。该系统利用单片机中空余的I/O接口,以中断的方式实现温度的实时采集与控制,...
  • DS18B20温度传感器-51单片机控制程序

    千次阅读 2019-12-11 21:47:20
    DS18B20数字温度传感器提供9-Bit到12-Bit的摄氏温度测量精度和一个用户可编程的非易失性且具有过温和低温触发报警的报警功能。DS18B20采用的1-Wire通信即仅采用一个数据线(以及地)与微控制器进行通信,采集数据的...
  • 采用STM32F10X系列的芯片为主芯片、SH79F32为辅芯片,温度传感器DS18B20做采集工具,PTR8000无线模块做通信工具,实现无线传感器网络功能。通过Altium Designer Release 10进行原理图设计及PCB板的绘制,并制作电路...
  • 常用温度传感器采集和换算方法

    万次阅读 2018-08-16 10:40:38
    因为温度传感器使用很频繁,有必要总结一下几种最常用的温度传感器采集方式和数据换算方法。 2、DS18B20 学习单片机的时候就很早就学过DS18B20温度传感器,测量范围为 -55 ℃ ~+ 125 ℃ ; 在 -...
  • 单片机 BMP280大气压强与温度传感器使用详解 转载: https://blog.csdn.net/sunshinebooming/article/details/79637822 最近实习中一个项目要用到多种传感器,其中就包括BMP280模块,但是发现网上有用的资料非常...
  • 为了远程监控实时温度数据, 利用温度传感器DS18B20 的特点,与AT 89C51 单片机构成实时温度检测系统, 并通过LED 数码管显示。利用无线传输模块SRWF1 的特点, 与单片机构成数据传输部分, 将所测量的温度无线传输发送给...
  • 系统将传感器输出的4~20mA的标准信号通过以AD0832为核心的A/D转换电路调理后,经由单片机进行数据处理,最后由LCD显示甲醛浓度值。文中详细介绍了数据采集子系统、数据处理过程以及数据显示子系统和报警电路的设计...
  • 为了准确获取NAMUR型速度传感器信号,设计了一种基于PIC18F2480单片机的信号采集电路,并给出了该电路的软件设计流程。该信号采集电路采集到0~600 Hz的频率信号,并可在线监测传感器断线、短路或正常工作等状态。
  • 提出了一种基于ATmega16单片机温度传感器相结合的实时温度采集与分析系统。本系统介绍了以ATmega16单片机为核心,以及自动化控制装置GTJJ4-10A固态继电器和数字温度传感器DS18B20,报警与指示电路等,在分析中基于...
  • 本系统介绍了以ATmega16单片机为核心,以及自动化控制装置GTJJ4-10A固态继电器和数字温度传感器DS18B20,报警与指示电路等,在分析中基于MFC的软件处理。其中包括温度曲线的绘制,以及温度值的保存,显示历史记录等。...
  • 本系统采用ADI公司的低压温度传感器TMP35,采用低成本3引脚TO-92,利用其低输出阻抗及其线性输出和精密校准可简化与温度控制电路和ADC的接口【1】,输出直接与单电源低功耗仪表放大器AD8223输入相连进行前置放大【2...
  • 这是一个PCB图,基于STC12C5A60S2单片机温湿度检测系统,并用数码管显示数值,易于读数。用蜂鸣器做报警电路,当采集到的温湿度高于上限值或者低于下限值是,蜂鸣器做出报警提示。
  • EFM8SB1是Silabs推出的新一代低功耗51单片机,可外接ADS1120实现PT100温度传感器采集,本程序包含采集、处理标定等功能实现。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,041
精华内容 1,616
关键字:

单片机采集温度传感器电路