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

📄 dianziqin.c

📁 基于DS18B20和RS232的智能温度控制系统
💻 C
字号:
/*****************************************/
/*       基于DS18B20数字温度计           */
/*                                       */
/*              马泽民			  	     */
/*****************************************/



#include <reg52.h>			    	// 引用标准库的头文件
#include <absacc.h>
#include <stdio.h>
#include <math.h>
#include<intrins.h>


#define uchar unsigned char 
#define uint unsigned int 

sbit DIN = P1^0;					// 串行数据输入
sbit CLK = P1^1;					// 串行时钟
sbit LOAD = P1^3; 					// 显示数据锁存控制
sbit DQ = P3^3;	                   // 数据通信线DQ
sbit SQW =P3^5;					   //报警线 
sbit light=P2^0;				   //报警灯 
sbit motor_a=P3^0;
sbit motor_b=P3^1;



uchar TH0_temp,TL0_temp;
uchar tplsb,tpmsb,tplsb_f,tpmsb_f;		          // 温度值低位、高位字节 
uchar tm,tl,tm_f,tl_f,mp,tp;

#define NoOp   0x00         		// 空操作寄存器
#define Digit0 0x01         		// 数码管1寄存器
#define Digit1 0x02         		// 数码管2寄存器
#define Digit2 0x03         		// 数码管3寄存器
#define Digit3 0x04         		// 数码管4寄存器

#define DecodeMode 0x09     		// 译码模式寄存器
#define Intensity 0x0a     			// 亮度寄存器
#define ScanLimit 0x0b      		// 扫描位数寄存器
#define ShutDown 0x0c       		// 低功耗模式寄存器
#define DisplayTest 0x0f    		// 显示测试寄存器

#define ShutdownMode 0x00      		// 低功耗方式
#define NormalOperation 0x01   		// 正常操作方式
#define ScanDigit 0x04         		// 扫描位数设置,显示4位数码管
#define DecodeDigit 0xff       		// 译码设置,4位均为BCD码
#define IntensityGrade 0x0f   		// 亮度级别设置
#define TestMode 0x01          		// 显示测试模式
#define TextEnd 0x00           		// 显示测试结束,恢复正常工作模式


/* 延时t毫秒 */
void delay(uint t)
{
	uint i;														                                                                                                                                                                                        
	while(t--)
	{
		/* 对于12M时钟,约延时1ms */
		for (i=0;i<125;i++)
		{}
	}
}

/* 向MAX7219写入字节(8位)*/
void SendChar (uchar byte)
{
	uchar i,temp;
    _nop_();
    for (i=0;i<8;i++)
    {
		temp=byte&0x80;
    	byte=byte<<1;
        if(temp)
        {
        	DIN=1;	 //写1 
           	CLK=0;
        	CLK=1;
        }
        else
        {
        	DIN=0;	   //写0 
        	CLK=0;
        	CLK=1;
        }
    }
}

/* 向MAX7219写入字(16位)*/
void WriteWord (uchar addr,uchar num)
{
    LOAD=0;
    _nop_();
    SendChar(addr);
    _nop_();
    SendChar(num);
    _nop_();
    LOAD=1;				// 锁存进相应寄存器
}

/* MAX7219初始化 */
void InitDisplay (void)
{
    WriteWord (ScanLimit,ScanDigit);         // 设置扫描界限
    WriteWord (DecodeMode,DecodeDigit);      // 设置译码模式
    WriteWord (Intensity,IntensityGrade);    // 设置亮度
    WriteWord (ShutDown,NormalOperation);    // 设置为正常工作模式
}

/* 产生复位脉冲初始化DS18B20 */
void TxReset(void)
{
	uint i;
	DQ = 0;

	/* 拉低约900us */
	i = 100;
	while (i>0)	i--;	
	
	DQ = 1;				// 产生上升沿
	i = 4;
	while (i>0)	i--;
}

/* 等待应答脉冲 */
void RxWait(void)
{
	uint i;
	while(DQ);
	while(~DQ);			// 检测到应答脉冲 
	i = 4;
	while (i>0)	i--;
}

/* 读取数据的一位,满足读时隙要求 */ 
bit RdBit(void)
{
	uint i;
	bit b;
	DQ = 0;
	i++;
	DQ = 1;
	i++;i++;			// 延时15us以上,读时隙下降沿后15us,DS18B20输出数据才有效
	b = DQ;
	i = 8;
	while(i>0) i--;
	return (b);
}

/* 读取数据的一个字节 */
uchar RdByte(void)
{
	uchar i,j,b;
	b = 0;
	for (i=1;i<=8;i++)
	{
		j = RdBit();
		b = (j<<7)|(b>>1);
	}
	return(b);
}

/* 写数据的一个字节,满足写1和写0的时隙要求 */
void WrByte(uchar b)
{
	uint i;
	uchar j;
	bit btmp;
	for(j=1;j<=8;j++)
	{
		btmp = b&0x01;
		b = b>>1;		// 取下一位(由低位向高位)
		if (btmp)
		{
			/* 写1 */
			DQ = 0;
			i++;i++;	// 延时,使得15us以内拉高
			DQ = 1;
			i = 8;
			while(i>0) i--;	// 整个写1时隙不低于60us 
	   	}
		else
		{
			/* 写0 */
			DQ = 0;			
			i = 8;
			while(i>0) i--;	// 保持低在60us到120us之间
			DQ = 1;
			i++;
			i++;
		}
	}
}

/* 启动温度转换 */
void convert(void)
{
	TxReset();			// 产生复位脉冲,初始化DS18B20
	RxWait();			// 等待DS18B20给出应答脉冲
	delay(1);			// 延时
	WrByte(0xcc);		// skip rom 命令
	WrByte(0x44);		// convert T 命令
}

/* 读取温度值 */
void RdTemp(void)
{
	TxReset();			// 产生复位脉冲,初始化DS18B20 
	RxWait();			// 等待DS18B20给出应答脉冲
	delay(1);			// 延时
	WrByte(0xcc);		// skip rom 命令
	WrByte(0xbe);		// read scratchpad 命令
	tplsb = RdByte();	// 温度值低位字节(其中低4位为二进制的“小数”部分)
	tpmsb = RdByte();	// 高位值高位字节(其中高5位为符号位)		
}

void INTT0() interrupt 1 
{
	TH0=TH0_temp;
	TL0=TL0_temp;
	SQW=~SQW;
}


/* 主函数 */
void main(void)
{ 

TMOD=0x01;
ET0	=1;
EA	=1;
TH0=0;
TL0=0;
TCON=0x10;
TR0=0;
InitDisplay ();							// MAX7219初始化 
WriteWord(DisplayTest,TestMode);		// 开始显示测试,点亮所有LED
delay(1000);       						// 延时约1s
WriteWord (DisplayTest,TextEnd);		// 退出显示测试模式
light=1;

while(1)
{
InitDisplay ();	
delay(1);
convert();
delay(1000);
RdTemp();											 
   
if(((tpmsb>>3)&0x1f)==0x1f)
	{
	        tplsb_f=~tplsb+0x01;
            if (tplsb==0)
			{ tpmsb_f=~tpmsb+1;}
            else
			{ tpmsb_f=~tpmsb; }
	   
	tm_f=((tpmsb_f&0x07)<<4)*16+(tplsb_f&0xf0)>>4;
    tl_f=((tplsb_f&0x0f)*10)/16;
   	WriteWord (Digit0,0x0a);
    WriteWord (Digit1,tm_f/10); 
    WriteWord (Digit2,((tm_f%10)|0x80));
    WriteWord (Digit3,tl_f);
	}
	else
    {
    tm=((tpmsb&0x07)<<4)*16+(tplsb&0xf0)>>4;
    tl=((tplsb&0x0f)*10)/16;
	WriteWord (Digit0,0);
    WriteWord (Digit1,tm/10); 
    WriteWord (Digit2,((tm%10)|0x80));
    WriteWord (Digit3,tl);
   if(tm>19)
   {  
    TH0_temp=0xFC;
    TL0_temp=0x5C;
	TR0=1;
	light=~light;
	
	}
else
  {
 TR0=0;
 SQW=0;
 }
 }
 }
}







⌨️ 快捷键说明

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