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

📄 text1.c

📁 实现51单片机的温度控制系统!传感器采用DS18B20!实现精度可达0.001摄氏度!
💻 C
字号:
/******************************************************** 
file name: temprature control system
date     :  2007-8-9
author   :  dalfer
instruction:关于温度显示的简单程
序为ds18b20单总线温度传感器,dq端接这p1.7, 
*********************************************************/
#include  <reg51.h>
#include  <stdio.h>
#include  <ctype.h>
#include  <intrins.h>
#include <absacc.h>
/***************************************************************/
#define  bit_add    XBYTE[0X7FFF]
#define  seg_add    XBYTE[0XBFFF]
#define	 uchar unsigned char
#define  uint unsigned  int
									
#define  SET    5000//设定
#define  K      3//比例系数
#define  TI     2//积分常数
#define  TD     1//微分常数
#define  T      1//采样周期
/***************************************************************/
char  table[]= {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
char disp_dot[11]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,0xc0};

int     ek=0;
int     ek_1=0;
int     ek_2=0;
int     pt;
int     it;
int     dt;
int     departure;
int     result;
uint   time;
uint   point;
/***************************************************************/
sbit  DQ=P1^0;
sbit  con=P1^1;//低电平加热
sbit  set_dis=P1^2;
sbit  add=P1^3;
sbit  sub=P1^4;
/***************************************************************/
bit   inc_flag=0;//增频
bit   dec_flag=0;//减频
bit   dis_flag=0;//显示设定
/***************************************************************
*函数名称(function name):       delay_18B20  
*函数功能(function funcation):  delay
*入口参数(in parameter):        i      
*出口参数(out parameter):       NO
*备注(remark):                  晶振12MHz
****************************************************************/ 
void delay_18B20(unsigned int i)
{
 while(i--);
}
/***************************************************************
*函数名称(function name):       Init_DS18B20  
*函数功能(function funcation):  Initialize DS18B20
*入口参数(in parameter):        NO      
*出口参数(out parameter):       NO
*备注(remark):                  NO
****************************************************************/
void Init_DS18B20(void) 
    {
     unsigned char x=0;
     DQ = 1;          //DQ复位
     delay_18B20(8);  //稍做延时
     DQ = 0;          //单片机将DQ拉低
     delay_18B20(80); //精确延时 大于 480us
     DQ = 1;          //拉高总线
     delay_18B20(14);
     x=DQ;            //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
     delay_18B20(20);
    }
/***************************************************************
*函数名称(function name):       ReadOneChar  
*函数功能(function funcation):  Read a byte data
*入口参数(in parameter):        NO      
*出口参数(out parameter):       NO
*备注(remark):                  NO
****************************************************************/  
int 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_18B20(4);
	 	 }
 	return(dat);
	}

/***************************************************************
*函数名称(function name):       WriteOneChar  
*函数功能(function funcation):  Write a byte data
*入口参数(in parameter):        dat      
*出口参数(out parameter):       NO
*备注(remark):                  NO
****************************************************************/ 			//写一个字节  
WriteOneChar(unsigned char dat)
{
 unsigned char i=0;
 for (i=8; i>0; i--)
   {
    DQ = 0;
    DQ = dat&0x01;
    delay_18B20(5);
    DQ = 1;
    dat>>=1;
   }
 }
/***************************************************************
*函数名称(function name):       ReadTemperature  
*函数功能(function funcation):  Read temprature
*入口参数(in parameter):        NO      
*出口参数(out parameter):       NO
*备注(remark):                  NO
****************************************************************/
int ReadTemperature(void)
{
 unsigned char a=0;
		 unsigned char b=0;
		 unsigned int  t=0;
	
		 Init_DS18B20();
		 WriteOneChar(0xCC); // 跳过读序号列号的操作
		 WriteOneChar(0x44); // 启动温度转换
		 delay_18B20(100);
		 Init_DS18B20();
		 WriteOneChar(0xCC); //跳过读序号列号的操作
		 WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
		 a=ReadOneChar();
		 b=ReadOneChar();
		 //传感器返回值除16得实际温度值
		 //为了得到2位小数位,先乘100,再除16,考虑整型数据长度,
		 //技巧处理后先乘25,再除4,除4用右移实现
         t = (b*256+a)*25;	
		 return( t >> 2 );
}
/***************************************************************
*名称(name):       time1  
*功能(funcation):  PWM
*备注(remark):     NO
****************************************************************/      
void time1(void) interrupt 3 using 3
 {  
  TR1=0;
  ET1=0;
  EA=0;
  if(dec_flag==1)//低电平变窄,高电平变宽
	{
	 ++time;
	 if(time<(point))
	   {
	    con=0;
	   }
	 if(time>=(point))
	   {
	    con=1;
	   }
	 if(time>500)
	   {
	   time=0;
	   }	 	  
    }
  TR1=1;
  ET1=1;
  TH1=0xff;//100um
  TL1=0xfe;
 }
/***************************************************************
*函数名称(function name):       disp  
*函数功能(function funcation):  Display temprature on 7SEG-LED
*入口参数(in parameter):        NO      
*出口参数(out parameter):       NO
*备注(remark):                  NO
****************************************************************/
void disp(void)
{  
 unsigned int tmp;					    
 tmp =ek;
 bit_add = 0xff;
 seg_add = table[tmp%10];
 bit_add = 0xf7;
 delay_18B20(100);
 bit_add = 0xff;
 seg_add = table[tmp/10%10];
 bit_add=0xfb;
 delay_18B20(100);
 bit_add = 0xff;
 seg_add = disp_dot[tmp/100%10];
 bit_add = 0xfd;
 delay_18B20(100);
 bit_add = 0xff;
 seg_add = table[tmp/1000];
 bit_add= 0xfe;
 delay_18B20(100);
}			 
/***************************************************************
*函数名称(function name):       control 
*函数功能(function funcation):  
*入口参数(in parameter):        NO      
*出口参数(out parameter):       NO
*备注(remark):                  NO
****************************************************************/				 
void control(void)
{		    		    
 delay_18B20(100);
 disp();
 if(ek<4500)	 //一直加热
   {con=0;
    EA=0;
    dec_flag=0;
   }
 if((ek>=4500)&&(ek<=5000))//PID
   {  
    TR1=1;
	ET1=1;
	EA=1;
	if((ek>=4500)&&(ek<5000))//pid
	  {						  
	   point=SET-ek;//5000-45**的值 						   
	   dec_flag=1;//低电平变窄,高电平变宽
	  }
    if(ek==5000)
	  {
	   con=1;
	  }
   }
 if(ek>5000)	 //保持停止加热
   {
    con=1;
	EA=0;
	dec_flag=0;			
   }
}
/***************************************************************
*函数名称(function name):       main 
*函数功能(function funcation):  realize temprature controlled
*入口参数(in parameter):        NO      
*出口参数(out parameter):       NO
*备注(remark):                  NO
****************************************************************/ 			  
void main(void)
{
 PT1=1;//中断优先
 TH1=0xff;//100um
 TL1=0xfe;
 con=0;
 while(1)
    {
	 ek=ReadTemperature();
	 control();
	 if((dec_flag==1))
	   {
	    TR1=1;
	    ET1=1;
	    EA=1;
	   }				
	 if((dec_flag==0))
	   {
	    TR1=0;
	    ET1=0;
	    EA=0;
 	   }
    }
}
				
                          
                                

⌨️ 快捷键说明

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