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

📄 程序.c

📁 ds18b20测温系统+proteus仿真全套
💻 C
字号:
#include<reg52.h>

#define uchar unsigned char
#define uint  unsigned int
/*******************************DS18B20模块****************************************/
sbit DQ=P3^7;


/***********ds18b20延迟子函数(晶振12MHz )*******/ 
void delay_18B20(unsigned int i){
	while(i--);
}

/**********ds18b20初始化函数**********************/
void reset() {
	 uchar 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);
}

/***********ds18b20读一个字节**************/  	
unsigned char rbyte(){
	uchar i=0;
	uchar dat = 0;
	for (i=8;i>0;i--){
		  DQ = 0; // 给脉冲信号
		  dat>>=1;
		  DQ = 1; // 给脉冲信号
		  if(DQ)
		     dat|=0x80;
		  delay_18B20(4);
	}
 	return(dat);
}

/*************ds18b20写一个字节****************/  
void wbyte(uchar dat){
 	uchar i=0;
 	for (i=8; i>0; i--){
  		DQ = 0;
 		DQ = dat&0x01;
    	delay_18B20(5);
 		DQ = 1;
    	dat>>=1;
 }
}

/**************读取ds18b20当前温度************/
void rTempetuare(uchar tmp[]){
			uchar a=0,b=0,temp;

			reset();
			wbyte(0xCC); //跳过读序号列号的操作
			wbyte(0x44); //启动温度转?
			reset();
			wbyte(0xCC); //跳过读序号列号的操作
			wbyte(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
			a=rbyte();   //读取温度值低位
			b=rbyte();   //读取温度值高位
			temp=b;
			temp&=0xf0;
			if(temp){	 	//负温
				if(a==0){
					a=~a+1;	  //bit7向bit8位产生进位
					b=~b+1; 
				}
				else{				   
					a=~a+1;	  
					b=~b;
				}
				tmp[0]='-';
			}
			else
				tmp[0]=' ';

			temp=(b<<4)|(a>>4);	      //组合

		 //tmp[0]=temp/100    | 0x30;     //取百位
			tmp[1]=temp%100/10 | 0x30;   //取十位
			tmp[2]=temp%100%10 | 0x30;  //取个位
			tmp[3]=0x01;              //字符℃
			tmp[4]='\0';
}

/************************************LCD1602模块**********************************************/
sbit rs=P2^0;
sbit rw=P2^1;
sbit  e=P2^2;

void delay_ms(uchar ms){
    uint i,j;
    for(i=0;i<ms;i++)
    for(j=0;j<120;j++);	
}

void lcd_wcmd(uchar cmd){	 //写指令
	rs=0;rw=0;
	e=0;
	P0=cmd;
	e=1;
	e=0;
	delay_ms(5);
}

void lcd_wdat(uchar dat){	 //写数据
	rs=1;rw=0;
	e=0;
	P0=dat;
	e=1;
	e=0;
	delay_ms(5);	
}

void lcd_dis(uchar post,uchar *p){
	lcd_wcmd(0x80 | post);	//设置数据地址指针
	while(*p!='\0'){
		lcd_wdat(*p++);
	}		
}

uchar code def_char0[]={0x10,0x06,0x09,0x08,0x08,0x09,0x06,0x00}; //字符℃
void lcd_wcgram(uchar adress,uchar tmp[]){
	uchar i;
	for(i=0;i<8;i++){
		lcd_wcmd(adress+i);
		lcd_wdat(tmp[i]);
	}
}

void lcd_inti(){
	delay_ms(15);
	lcd_wcmd(0x38);	//16X2字符,5X7点阵,8位数据接口
	lcd_wcmd(0x38);	
	lcd_wcmd(0x08);	//关闭显示
	lcd_wcmd(0x01);	//清屏
	lcd_wcmd(0x06);	//设置光标工作方式
	lcd_wcmd(0x0c);	//开显示,设置光标显示方式

	lcd_wcgram(0x48,def_char0);  //载入用户自定义字符
}
/*******************************************************************************************/

void main(){
	uchar tmp[5];
		
	lcd_inti();

	while(1){
		rTempetuare(tmp);
		lcd_dis(0x00,tmp);
	}
}






⌨️ 快捷键说明

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