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

📄 main.c

📁 c51控制ds1820在1602上显示温度
💻 C
字号:
#include <reg51.h>
#include <intrins.h>
#define   uchar	unsigned char

/////////////////////////////
//1602液晶线定义
//////////////////////////////
#define  E  INT0        //液晶控制线定义
#define  RS  RXD
#define  RW  TXD		//液晶控制线定义


 
sbit    D0=P2^7;        //传感器数据线定义
bit status;

code uchar ANSC[]={'0','1','2','3','4','5','6','7','8','9'};
code uchar error[]="NO DEVICE!";
code uchar table[]="The temper is:";
     uchar Temper[2];

void delay1(uchar del)
{
	uchar i;
	for(i=0;i<del;i++);
}	



void delay2(unsigned int i)
{
	 while(--i);
}




void delay(uchar del)
{
	uchar i,j;
	for(i=del;i>0;i--)
		for(j=0;j<110;j++);
}






//*******************************************************
void Write_Com(uchar com)
{
	
	RS=0;
	P0=com;
	delay(1);
	E=1;
	delay(1);	
	E=0;
}

void Write_Data(uchar date)
{
	RS=1;
	P0=date;
	delay(1);
	E=1;
	delay(2);
	E=0;
}
//*******************************************************



//*******************一线总线的写操作********************



void write_command(uchar com1)      //一线总线写命令
{
	unsigned char i=0;
	for (i=8; i>0; i--)
	{
	   	D0 = 0;
		_nop_();_nop_();
		D0=1;
		D0 = com1&0x01;
	    delay2(5);
	    D0 = 1;
	    com1>>=1;
    }
}
//********************************************************







unsigned char read_data()
{
		unsigned char i=0;
		unsigned char temp=0;
		for (i=8;i>0;i--)
		 {
		  	D0 = 0; 
			_nop_();_nop_();
		  	temp>>=1;
		  	D0 = 1; 
			_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
		  	if(D0)	temp|=0x80;
		  	delay2(4);
		 }
		_nop_();_nop_();_nop_();
		 return(temp);
}



void reset()
{
	uchar i;
	D0=1;
	D0=0;
	for(i=0;i<60;i++)
		_nop_();
	for(i=0;i<61;i++)
		_nop_();	
	D0=1;
	delay1(9);
	status=D0;
	D0=1;
	for(i=0;i<60;i++)
		_nop_();
	for(i=0;i<61;i++)
		_nop_();	
}


void init1()
{
	uchar i;
	reset();				//传感器初始化和错误处理				
	while(status)
	{
		reset();
		if(status)
			{
				reset();
				if(status)
					{
						i=0;
						Write_Com(0x01);
						delay(5);
						Write_Com(0x80);
						while(error[i]!='\0')
						{
							Write_Data(error[i]);
							i++;
						}
						while(1);		
					}
			}
		break;	             //传感器初始化和错误处理
	}	
}




void Init()
{	
	D0=1;
	E=0;                     //液晶初始化	
	RW=0;
	Write_Com(0x38);
	Write_Com(0x0c);
	Write_Com(0x06);
	Write_Com(0x01);
	delay(5);		//液晶初始化
	
}				



//*******************************************************

void main()
{	
	uchar	MSB,LSB,shiwei,gewei,xiaoshu0,xiaoshu1,xiaoshu2,xiaoshu3;
	
	unsigned char i;
	Init();
	Write_Com(0x80);
	i=0;
	while(table[i]!='\0')
	{
		Write_Data(table[i]);
		i++;
		delay(1);
	}	
	


loop:init1();
	write_command(0xcc);          //跳过ROM匹配
	write_command(0x44);          //启动温度转换
	delay(255);
	delay(255);
    init1();                       //复位传感器
	write_command(0xcc);          //跳过ROM匹配
	write_command(0xbe);          //读取温度指令
	LSB=read_data();     //温度的小数位
	MSB=(read_data()<<4)|(LSB>>4);//温度的整数位
	shiwei=MSB/10;
	gewei=MSB%10;
	xiaoshu0=(LSB&0x0f)*625/1000;
	xiaoshu1=(((LSB&0x0f)*625)%1000)/100;
	xiaoshu2=(((LSB&0x0f)*625)%100)/10;
	xiaoshu3=((LSB&0x0f)*625)%10;
	Temper[0]=ANSC[shiwei];
	Temper[1]=ANSC[gewei];
	Temper[2]='.';	
	Temper[3]=ANSC[xiaoshu0];
	Temper[4]=ANSC[xiaoshu1];
	Temper[5]=ANSC[xiaoshu2];
	Temper[6]=ANSC[xiaoshu3];
	Temper[7]=0xdf;
	Temper[8]='C';
	Write_Com(0x80+0x45);
	Write_Data(Temper[0]);
	Write_Data(Temper[1]);
	Write_Data(Temper[2]);
	Write_Data(Temper[3]);
	Write_Data(Temper[4]);
	Write_Data(Temper[5]);
	Write_Data(Temper[6]);
	Write_Data(Temper[7]);
	Write_Data(Temper[8]);
	goto	loop;
}

⌨️ 快捷键说明

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