⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tempc.c

📁 温度传感器程序
💻 C
字号:
#include <reg51.h>
#include <intrins.h>

sbit P3_0=P3^0;
sbit P3_1=P3^1;
sbit P3_2=P3^2;
sbit P3_3= P3^3;
sbit P3_4= P3^4;
sbit P3_5= P3^5;
sbit P3_6= P3^6;
sbit P3_7= P3^7;

#define LEDPort           P1      //LED控制口
#define LEDf           P3_0    //LEDf
#define LED1           P3_1    //LED1
#define LED2           P3_2    //LED2
#define LED3           P3_3    //LED3
#define LED4           P3_4    //LED4
#define Key_jd            P3_5    //上调温度
#define TMPort	P3_7		//DS1820 DataPort


unsigned char code LEDDis[]={0x5f,0x06,0x3b,0x2f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //0-9的LED笔划,0xFF为空,0xF7为负号

static unsigned char bdata StateREG;	//可位寻址的状态寄存器
sbit DS18B20ON = StateREG^0;	          //DS1820是否存在
sbit SetTF = StateREG^1;              //是否是在温度设置状态

static signed char LED_f,LED_1,LED_2,LED_3,LED_4;  //LED的显示位 LED_One为十位,LED_Two为个位
static signed char L_1,L_2,L_3,L_4,L_5;  //LED的显示位 LED_One为十位,LED_Two为个位
static unsigned char Sign; //负号标识
static unsigned char sign_jd; //精度标识
static unsigned char KeyV,TempKeyV;      //键值

static unsigned char bdata TLV _at_ 0x0029;         //温度变量高低位
static unsigned char bdata THV _at_ 0x0028;
static signed char TMV;       //转换后的温度值
static signed char TM;       //转换后的温度值
static signed int wd;       //转换后的温度值
static signed int zd;       //转换后的温度值

void Delay_10ms(void);
void InitDS1820(void);
void ROMDS1820(void);
void TMVDS1820(void);
void Delay_510(void);
void TMRDS1820(void);
void ReadDS1820(void);
void V2ToV(void);
void Delay_110(void);



void main(void)
{
    THV = 0;
	TLV = 0;
	TMV = 0;
	TM=0;
	KeyV = 0;
	TempKeyV = 0;
    zd=50;

	InitDS1820(); //初始化
	ROMDS1820(); 	//跳过ROM
	TMRDS1820(); 	//读出温度指令
	ReadDS1820(); //读出温度值和上限值

	EA = 1;					//允许CPU中断
	ET0 = 1; 				//定时器0中断打开
	TMOD = 0x1;			//设定时器0为模式1,16位模式
	TH0=0xB1;
	TL0=0xDF;				//设定时值为20000us(20ms)
	TR0 = 1;				//开始定时
	while(1);
}

//定时器0中断外理中键扫描和显示
void KeyAndDis_Time0(void) interrupt 1 using 2
{
  TH0=0xb1;
  TL0=0xDF;				//设定时值为20000us(20ms)
  Key_jd=1;
  LEDPort = 0x00;
  zd++;
  if (zd>50)
   {
  if (!Key_jd)
    KeyV = 1;

  if (KeyV != 0)      //有键按下
    {
      Delay_10ms();   //延时防抖  按下10ms再测
      if (!Key_jd)
        TempKeyV = 1;
      if (KeyV == TempKeyV)   //两次值相等为确定接下了键
        {
          sign_jd=!sign_jd;
		  zd=0;
        }
    }
   }
  KeyV = 0;
  TempKeyV = 0;   //清空变量准备下次键扫描

  if (DS18B20ON)
    {
      InitDS1820();	//初始化
      ROMDS1820(); 	//跳过ROM
      TMVDS1820();  //温度转换指令

      Delay_510();
      Delay_510();  //延时等待转换完成

      InitDS1820(); //初始化
      ROMDS1820(); 	//跳过ROM
      TMRDS1820(); 	//读出温度指令
      ReadDS1820(); //读出温度值
      V2ToV(); 
      if (LED_f==1)//转换显示值
      LEDf=0;
	  else
	  LEDf=1;
	  LEDPort = ~LED_1;
      LED1 = 0;
      Delay_510();
      Delay_510();
      LED1 = 1;    //显示百位数
      LEDPort = ~LED_2;
      LED2 = 0;
      Delay_510();
      Delay_510();
      LED2 = 1;    //显示百位数
      LEDPort = ~LED_3;
      LED3 = 0;
      Delay_510();
      Delay_510();
      LED3 = 1;    //显示百位数
      LEDPort = ~LED_4;
      LED4 = 0;
      Delay_510();
      Delay_510();
      LED4 = 1;    //显示百位数

    }
}





void V2ToV(void)	//数值转换
{
  TM=TLV<<4;
  TLV = TLV >> 4;			
  THV = THV << 4;			//读出的高低位数值移位
  TMV = TLV | THV;		//合并高低位放入TM为实际温度值
  Sign = 0;
  Sign = TMV >> 7;
  if (Sign)
		{
    		L_1= (~(TMV-1)) / 100;							//转换百位值		
			L_2= ((~(TMV-1)) - L_1 * 100)/10;
			L_3 = (~(TMV-1)) - L_1 * 100 - L_2 * 10;
		}
	else
		{ 
    		L_1= (TMV) / 100;							//转换百位值		
			L_2= (TMV - L_1 * 100)/10;
			L_3 = TMV - L_1 * 100 - L_2 * 10;
		}
  if (Sign)
		{
    		TM=~(TM-1);
			LED_f=1;
		}
	  else
	   {

	   LED_f=0;
	    }
  wd=0;	 
  if (TM & 0x80){wd=wd+5000;}
  if (TM & 0x40){wd=wd+2500;}
  if (TM & 0x20){wd=wd+1250;}
  if (TM & 0x10){wd=wd+625;}
  L_4=wd/1000;
  L_5=(wd-L_4*1000)/100;
  if (sign_jd)
    {
     LED_1=LEDDis[L_2];		
     LED_2=LEDDis[L_3]|0x80;	
     LED_3=LEDDis[L_4];	
     LED_4=LEDDis[L_5];				
    }
  else
    {
     LED_1=LEDDis[L_1];		
     LED_2=LEDDis[L_2];	
     LED_3=LEDDis[L_3]|0x80;	
     LED_4=LEDDis[L_4];				
	}
}


void InitDS1820(void)		//初始化DS1820
{
  TMPort=1;		//拉高TMPort
	_nop_();      //保持一个周期
	TMPort = 0;		//拉低TMPort
  Delay_510();  //延时  DS1820复位时间要500us的低电平
  TMPort = 1;   //拉高TMPort
	_nop_();      //保持  
	_nop_();
	_nop_();

  Delay_110();  //延时110us 等待DS1820回应
  if (!TMPort)  //回应信号为低电平
    DS18B20ON = 1;
  else
    DS18B20ON = 0;
  Delay_110();  //延时
  Delay_110();
  TMPort = 1;   //拉高TMPort
}


void Delay_510(void)	//延时510微秒
{
#pragma asm
	MOV R0,#7DH
	MOV R1,#02H
	TSR1:
	DJNZ R0,TSR1
	MOV R0,#7DH
	DJNZ R1,TSR1
#pragma endasm
}

void Delay_110(void)	//延时110微秒
{
#pragma asm
	MOV R0,#19H
	MOV R1,#02H
	TSR2:
	DJNZ R0,TSR2
	MOV R0,#19H
	DJNZ R1,TSR2
#pragma endasm
}

void Delay_10ms(void)	//延时10ms
{
#pragma asm
	MOV R0,#19H
	MOV R1,#0C8H
	TSR3:
	DJNZ R0,TSR3
	MOV R0,#19H
	DJNZ R1,TSR3
#pragma endasm
}

void Delay_4s(void)	//延时4s
{
#pragma asm
  MOV R2,#28H
  TSR5:
	MOV R0,#0FAH
	MOV R1,#0C8H
	TSR4:
	DJNZ R0,TSR4
	MOV R0,#0FAH
	DJNZ R1,TSR4
  DJNZ R2,TSR5
#pragma endasm
}

void ROMDS1820(void)  //跳过ROM匹配
{
#pragma asm
  MOV A,#0CCH
  MOV R2,#8
  CLR C
  WR1:
  CLR P3_7
  MOV R3,#6
  DJNZ R3,$
  RRC A
  MOV P3_7,C
  MOV R3,#23
  DJNZ R3,$
  SETB P3_7
  NOP
  DJNZ R2,WR1
  SETB P3_7
#pragma endasm
}

void TMVDS1820(void)  //温度转换指令
{
#pragma asm
  MOV A,#44H
  MOV R2,#8
  CLR C
  WR2:
  CLR P3_7
  MOV R3,#6
  DJNZ R3,$
  RRC A
  MOV P3_7,C
  MOV R3,#23
  DJNZ R3,$
  SETB P3_7
  NOP
  DJNZ R2,WR2
  SETB P3_7
#pragma endasm
}

void TMRDS1820(void)  //读出温度指令
{
#pragma asm
  MOV A,#0BEH
  MOV R2,#8
  CLR C
  WR3:
  CLR P3_7
  MOV R3,#6
  DJNZ R3,$
  RRC A
  MOV P3_7,C
  MOV R3,#23
  DJNZ R3,$
  SETB P3_7
  NOP
  DJNZ R2,WR3
  SETB P3_7
#pragma endasm
}

void TMWDS1820(void)  //写入温度限制指令
{
#pragma asm
  MOV A,#04EH
  MOV R2,#8
  CLR C
  WR13:
  CLR P3_7
  MOV R3,#6
  DJNZ R3,$
  RRC A
  MOV P3_7,C
  MOV R3,#23
  DJNZ R3,$
  SETB P3_7
  NOP
  DJNZ R2,WR13
  SETB P3_7
#pragma endasm
}

void TMREDS1820(void)		//COPY RAM to E2PRAM
{
#pragma asm
  MOV A,#48H
  MOV R2,#8
  CLR C
  WR33:
  CLR P3_7
  MOV R3,#6
  DJNZ R3,$
  RRC A
  MOV P3_7,C
  MOV R3,#23
  DJNZ R3,$
  SETB P3_7
  NOP
  DJNZ R2,WR33
  SETB P3_7
#pragma endasm
}

void TMERDS1820(void)		//COPY E2PRAM to RAM
{
#pragma asm
  MOV A,#0B8H
  MOV R2,#8
  CLR C
  WR43:
  CLR P3_7
  MOV R3,#6
  DJNZ R3,$
  RRC A
  MOV P3_7,C
  MOV R3,#23
  DJNZ R3,$
  SETB P3_7
  NOP
  DJNZ R2,WR43
  SETB P3_7
#pragma endasm
}

void WriteDS1820(void)	//写入温度限制值
{
#pragma asm
	MOV A,26H					//发出4EH写ROM指令后连发两个字节分别为上下限
  MOV R2,#8
  CLR C
  WR23:
  CLR P3_7
  MOV R3,#6
  DJNZ R3,$
  RRC A
  MOV P3_7,C
  MOV R3,#23
  DJNZ R3,$
  SETB P3_7
  NOP
  DJNZ R2,WR23
  SETB P3_7       
#pragma endasm
}

void ReadDS1820(void) //读出温度值
{
#pragma asm
  MOV R4,#2 ; 将温度高位和低位,高温限制位从DS18B20中读出
  MOV R1,#29H ; 低位存入29H(TEMPER_L),高位存入28H(TEMPER_H),高温限制位存入27H(TMRomV)
  RE00:
  MOV R2,#8
  RE01:
  CLR C
  SETB P3_7
  NOP
  NOP
  CLR P3_7
  NOP
  NOP
  NOP
  SETB P3_7
  MOV R3,#09
  RE10: 
  DJNZ R3,RE10
  MOV C,P3_7
  MOV R3,#23
  RE20: 
  DJNZ R3,RE20
  RRC A
  DJNZ R2,RE01
  MOV @R1,A
  DEC R1
  DJNZ R4,RE00
#pragma endasm
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -