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

📄 ds18b20.c

📁 ds18b20和1602结合
💻 C
字号:
#include <reg52.h>
#include <absacc.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char

sbit DQ=P3^4;    //单总线数据接口
bit sflag;       //正负号标志
uchar readdata[2]={0,0};//从1820中的两个数据存储中读出的两个值
uchar code decimal[17]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};//十六进制和十进制的转换,液晶显示时用
uchar code asccode[10]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};//10个数字液晶显示码
uchar textreal[2][16];  //液晶显示时两行字的数组,其内容直接显示到液晶屏上
void LCDdisplay(uchar textvar[2][16]); //液晶显示函数定义
sbit rs=P3^7;    //液晶显示的三个控制管脚 
sbit rw=P3^6;
sbit e=P3^5;
sbit busy=P1^7;
void enable(void);
void delay(void);


bit resetpulse(void)   //1820初始化函数
{
	uchar i;
	DQ=0;                   
    for(i=255;i>0;i--){;}   
    DQ=1; 
    for(i=60;i>0;i--){;}    
    return(DQ); 
    for(i=200;i>0;i--){;}     
}


void writecommandtods18b20(uchar command) //写命令函数
{ 
	uchar i,j; 
  
  	for(i=0;i<8;i++) 
    { 
      	if((command & 0x01)==0) 
        { 
          	DQ=0; 
          	for(j=35;j>0;j--); 
          	DQ=1; 
        } 
        else 
     	{ 
            DQ=0; 
            for(j=2;j>0;j--); 
            DQ=1; 
            for(j=33;j>0;j--); 
      	} 
      	command=_cror_(command,1);  //循环右移库函数,在intrins.h中定义    
    } 
} 


uchar readdatafromds18b20(void) //读数据函数
{ 
  	uchar i,j,temp; 
  	  
  	temp=0; 
  	for(i=0;i<8;i++) 
    { 
      	temp=_cror_(temp,1); 
      	DQ=0; 
      	_nop_();                  // 相当于nop指令
      	_nop_(); 
      	DQ=1; 
      	for(j=10;j>0;j--); 
      	if(DQ==1) 
        { 
          	temp=temp | 0x80; 
        } 
        else 
        { 
            temp=temp | 0x00; 
        } 
      	for(j=200;j>0;j--); 
    } 
  	return(temp); 
} 


void main(void)
{
	TMOD=0x01;                 //使用定时器来定期读数据并进行数据转化和输出显示
  	TH0=(65536-60000)/256; 
  	TL0=(65536-60000)%256; 
  	ET0=1; 
  	EA=1; 
  
  	while(resetpulse()); 
  	writecommandtods18b20(0xcc);   //跳过rom命令 
  	writecommandtods18b20(0x44);   //
  	TR0=1;  
	while(1){;}
}


void t0(void) interrupt 1 using 0 
{ 
	uchar i,j,convert0,convert1,decimaldata,a,b,c; 
  	uint result; 
  
  	TH0=(65536-60000)/256; 
 	TL0=(65536-60000)%256; 

    while(resetpulse()); 
    writecommandtods18b20(0xcc); 
    writecommandtods18b20(0xbe); 
    readdata[0]=readdatafromds18b20(); 
    readdata[1]=readdatafromds18b20(); 
    if((readdata[1] & 0xf8)!=0x00) 
    { 
      	sflag=1; 
        readdata[1]=~readdata[1]; 
        readdata[0]=~readdata[0]; 
        result=readdata[0]+1; 
        readdata[0]=result; 
     } 
    readdata[1]=readdata[1]<<4; 
    readdata[1]=readdata[1] & 0x70; 
	readdata[0]=readdata[0]>>4; 
    readdata[0]=readdata[0]&0x0f; 
  	readdata[1]=readdata[1]|readdata[0]; 
    result=readdata[1]; 
	convert1=readdata[1]>>4;
	i=convert1;
	convert0=readdata[0];
	j=convert0;
	decimaldata=decimal[i]*16+decimal[j];
	a=decimaldata/100;
	b=(decimaldata%100)/10;
	c=(decimaldata%100)%10;

	textreal[0][0]=asccode[a];
	textreal[0][1]=asccode[b];
	textreal[0][2]=asccode[c];
	LCDdisplay(textreal);
   	while(resetpulse()); 
   	writecommandtods18b20(0xcc); 
	writecommandtods18b20(0x44); 
} 


void LCDdisplay(uchar textvar[2][16])
{
	uchar i,j,adress=0x80;
    P1=0x01;  //清显示
	enable();
	P1=0x38;
	enable();
	P1=0x0f;
	enable();
	P1=0x06;
	enable();
    for(i=0;i<2;i++)               
	{
		for(j=0;j<16;j++)
		{
			P1=adress;
			enable();
			if(textvar[i][j]==0x00)//判断如果数组中的内容为空则填补空格
			{
			textvar[i][j]=' ';
			}
			P1=textvar[i][j];
			rs=1;
			rw=0;
			e=0;
			delay();
			e=1;
			adress++;	
		}
		adress=0xc0;
			
	}
	adress=0x80;	
}

void enable(void)
{
	rs=0;
	rw=0;
	e=0;
	delay();
	e=1;
}

void delay(void)   //判断液晶是否为忙
{
    do             //注意do while和while的区别
	{
		P1=0xff;   //读数前首先发高点电平,将CMOS截止
		rs=0;
		rw=1;
		e=0;
		e=1;
	}while(busy==1);  
}


⌨️ 快捷键说明

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