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

📄 dzz_t.c

📁 51单片机控制温度采集芯片DS18B20
💻 C
字号:
#include<reg51.h>
#include <stdio.h>
#include <string.h>
#include <INTRINS.H>

#define uchar unsigned char
#define uint unsigned int

#define data  P0
#define Busy 0x80      //用于检测LCD状态字中的Busy标识

sbit RS=P1^5;
sbit RW=P1^6;
sbit E=P1^7;
sbit DQ=P2^1;

uchar msg[]="T:   C";
uchar bcddis[2];
uchar imm;
bit tempflag;
union{
	uchar c[2];
	uint x;
	}temp;
/******************LCD函数声明*********************/ 			
void LCDInit(void);
void WritedataLCD(uchar WDLCD);
void WriteCommandLCD(uchar WCLCD,bit uBusyC);
void ReadStatusLCD(void);
void ReaddataLCD(uchar RDLCD);
void DisplayOneChar(uchar X, uchar Y, uchar Ddata);
void DisplayListChar(uchar x,uchar y, uchar *listdata);
/********************LCD函数**********************/
//读数据函数: E=高脉冲 RS=1 RW=1
void ReaddataLCD(uchar RDLCD)
{
	ReadStatusLCD(); //检测忙
	RS=1;
 	RW=1;
 	data=RDLCD;
	E=1; //若晶振速度太高可以在这后加小的延时
 	_nop_();
 	_nop_();
 	_nop_();
 	E=0;//重设E=0
}

//写数据函数: E=高脉冲 RS=1 RW=0
void WritedataLCD(uchar WDLCD)
{
 	ReadStatusLCD(); //检测忙
 	RS=1;
 	RW=0;
 	data=WDLCD;
 	E=1; //若晶振速度太高可以在这后加小的延时
 	_nop_();
 	_nop_();
 	_nop_();
 	E=0;//重设E=0
}
//写指令函数: E=高脉冲 RS=0 RW=0
void WriteCommandLCD(uchar WCLCD,bit BusyC) //BusyC为0时忽略忙检测
{
 	if(BusyC) ReadStatusLCD(); //根据需要检测忙
 	RS=0;
	RW=0;
	data=WCLCD;
	E=1; //若晶振速度太高可以在这后加小的延时
 	_nop_();		 
 	E=0;//重设E=0
}
//正常读写操作之前必须检测LCD控制器状态:E=1 RS=0 RW=1;DB7: 0 LCD控制器空闲,1 LCD控制器忙。
//检测忙信号,等待LCD空闲函数
void  ReadStatusLCD(void)
{
	data=0xFF;
	E=1;
 	RS=0;
 	RW=1;
 	_nop_();
 	_nop_();
 	_nop_();	 
	while(data&Busy); //检测忙信号
 	E=0;
}

void LCDInit(void) //LCD初始化
{
 	WriteCommandLCD(0x38,0);
 //	delay();
 	WriteCommandLCD(0x38,1); //显示模式设置,开始要求每次检测忙信号
 //	delay();
 	WriteCommandLCD(0x08,1); //关闭显示
 //	delay();
 	WriteCommandLCD(0x01,1); //显示清屏
 //	delay();
 	WriteCommandLCD(0x06,1); // 显示光标移动设置
 //	delay();
 	WriteCommandLCD(0x0C,1); // 显示开及光标设置
 //	delay();
}
//按指定位置显示一个字符
void DisplayOneChar(uchar X, uchar Y, uchar Ddata)
{
 	Y&=0x01;
 	X&=0x0F; //限制X不能大于15,Y不能大于1
 	if(Y)X|=0x40; //当要显示第二行时地址码+0x40;
 	X|=0x80; //算出指令码
 	WriteCommandLCD(X,1); //这里检测忙信号,发送地址码
 	WritedataLCD(Ddata);
}

/**************按指定位置显示一串字符******************/	  

void DisplayListChar(uchar x,uchar y, uchar *listdata)
{
 	uchar i=0;
 	for(i=0;i<strlen(listdata);i++ )
  	{
   		if (x<=0x0F) //x坐标应小于0x0F
    		{
    	 		DisplayOneChar(x,y,listdata[i]); //显示单个字符
         		x++;
         	}
        else if(y==0)
		{
        	y++;
         	x=x-0x0F;
         	DisplayOneChar(x,y,listdata[i]);
  	  	}
	}
}

void delay(uchar x)
{
	for(;x>0;x--);
}

/***************************LCD模块结束*****************************/

uchar T_reset(void)	  //复位
{
	uchar presence;
	DQ = 0;     	 //pull DQ line low
	delay(29);    	//leave it low for 480us
	DQ = 1; 		// allow line to return high
	delay(3); 		// wait for presence
	presence = DQ; 	// get presence signal
	delay(25); 			// wait for end of timeslot
	return(presence); // presence signal returned
} 					// 0=presence, 1 = no part

uchar read_byte(void)	  //从 1-wire 总线上读取一个字节
{
	uchar i;
	uchar value = 0;
	for (i=8;i>0;i--)
	{
		value>>=1;
		DQ = 0; // pull DQ low to start timeslot
		DQ = 1; // then return high
		delay(1); //for (i=0; i<3; i++); 
		if(DQ)value|=0x80;
		delay(6); // wait for reset of timeslot
	}
	return(value);
}

void write_byte(uchar val) //向 1-WIRE 总线上写一个字节
{
	uchar j;
	for (j=8; j>0; j--) // writes byte, one bit at a time
	{
		DQ = 0; // pull DQ low to start timeslot
		DQ = val&0x01;
		delay(5); // hold value for remainder of timeslot
		DQ = 1;
		val>>=1;
	}
	delay(5);
}

void Read_Temp(void) //读取温度寄存器
{
	T_reset();
	write_byte(0xCC); //Skip ROM
	write_byte(0x44); // Start Conversion
	T_reset();
	write_byte(0xCC); // Skip ROM
	write_byte(0xBE); // Read Scratch Pad
	temp.c[1]=read_byte();
	temp.c[0]=read_byte();
}

void Show_Temp()
{
	uchar k=0;
	if((temp.c[0]&0xf8)!=0x00)   //温度为负值
 	{
  		tempflag=1; 		   //温标置一
  		 temp.x=~temp.x+1;
 	}
	temp.x&=0x07f0;
	temp.x>>=4;
	imm=temp.c[1];
	bcddis[0]=imm/10;
	bcddis[0]+=0x30;
	bcddis[1]=imm%10;
	bcddis[1]+=0x30;
	for(k=0;k<2;k++)
	{
		if(tempflag)msg[2]='-';
			else msg[2]='0';
		msg[3+k]=bcddis[k];

	}					 
	DisplayListChar(0,0,msg);

}

void main(void)
{
	LCDInit();	//LCD初始化
	tempflag=0;
	while(1)
	{
		Read_Temp();
		Show_Temp();
					
	}
 	
}

⌨️ 快捷键说明

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