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

📄 lm75a.c

📁 LM75A采集的实时温度
💻 C
字号:
#include "VIIC_C51.h"
#include <reg51.h>
#include <intrins.h>
#include "lcd1602.h"
#include "type.h"
#include <string.h>
#include <stdio.h>

#define uchar unsigned char


uchar data LM75A=0x90; // LM75A 的I2C 地址
//uchar data MWD[2]={9}; //发送缓冲区
uchar data  MRD[2]={204}; //接收缓冲区
uchar data  MWD[2]={0}; 

uchar dis[16];
//long int m=0 ;

void delayms(UINT t);
Is_busy();
void WriteOrder(UCHAR Order);
void WriteData(UCHAR y,UCHAR x,unsigned char LcdData[]);
void LCD_Init(void);
int BinaryToDecimal(int bina) ;
void Decimal_Display(uchar recv[]);
void WriteSChar(UCHAR y,UCHAR x,UCHAR z);

void Binary_Display(uchar recv[])	;

void main(void)
{
	LCD_Init();	

	while(1)
	{
	
	IRcvStr(LM75A,0x00,MRD,2); //读取LM75A 温度值
	//Binary_Display(MRD);

	Decimal_Display(MRD);
	//	 while(1);
	
	}
}
//*****************二进制转换成十进制***********
//	 bina 为输入的二进制数,d用来处理该数。
//	k为标志位,当k为1时表示输入的数有问题
//为每次分解的个位数;j为二进制的权值;m为累计的十进制和;p为输入的数的位数
//超过8时,该数越界,需要重新输入,定k=1
//***********************************************

int BinaryToDecimal(int bina)
 {
 	int i=0,j=1,m=0;		

	while(bina)
	{
		i=bina%10;
	
		m+=i*j;
		j=j*2;
		bina/=10;

	}
	//if(k=1)WriteData(2,0,"over!");
	return m;
 }



//**********************二  进制显示子函数***************************//
void Binary_Display(uchar recv[])
{
	int a=1,b,c=0;
	int i;
	 	
	for(a=1;a>=0;a--)
	{
		int m=0x01;
		for(b=0;b<8;b++)
		{
			dis[c]=recv[a]&m;
			c++;
			m<<=1;
		}
	} 
	
	
  	  
	  for ( i=0;i<15;i++)
	  {
	  	if (dis[14-i]) 
			WriteSChar(1,i+1,0x31);
			//WriteData(1,i+1,"1");
		else
			 WriteSChar(1,i+1,0x30);

				//WriteData(1,i+1,"0");
	  }
	  
	 if(!dis[15])WriteData(1,0,"")  ;
	 else
	 	WriteData(1,0,"-")  ;
}
 

//**********************Last 进制显示子函数***************************//

void Decimal_Display(uchar recv[])
{
	int a=1,b,c=0;
	int i;
	int k=0;
	long int m=0,j=1;
	
	for(a=1;a>=0;a--)
	{
		int n=0x01;
		for(b=0;b<8;b++)
		{
			dis[c]=recv[a]&n;
			c++;
			n<<=1;
		}
	}
	
	if(!dis[15])WriteData(1,0,"")  ;
	else
	 	WriteData(1,0,"-")  ;	 

	for(a=5;a<=14;a++)
	{
		if(dis[a])k=1;
		else k=0;
		m+=k*j;
		j=j*2;
	
	}
	
/*		WriteSChar(1,1,(m/1000)+0x30);	
		m=m%1000;
		WriteSChar(1,2,(m/100)+0x30);	
		m=m%100;
		WriteSChar(1,3,(m/10)+0x30);	
		m=m%10;
		WriteSChar(1,4,(m%10)+0x30);	
*/


	m=(m*1000)/8;


	WriteSChar(1,1,(m/100000)+0x30);			  //3位整数,3位小数,
	m=m%100000;
	WriteSChar(1,2,(m/10000)+0x30);
	m=m%10000;
	WriteSChar(1,3,(m/1000)+0x30);
	m=m%1000;
	WriteData(1,4,".");

	WriteSChar(1,5,(m/100)+0x30);
	m=m%100;
	WriteSChar(1,6,(m/10)+0x30);
	m=m%10;
	WriteSChar(1,7,(m%10)+0x30);

	WriteData(1,8,"C");

	
 

 
}
 
//********************延时********************************

void delayms(UINT t)
{
	UCHAR i;
	while(t--)
	{
		for(i=0;i<100;i++);
	}
}


//********************************************************************
//       LCD1602 判忙函数
//********************************************************************
Is_busy()
{
	rs=1;
	rw=0;
	en=0;
	LCD_Data=0xff;
	rs=0;
	rw=1;
	en=0;
	delayms(10);
	en=1;
	while(busy);

}
//********************************************************************
//        写命令
//********************************************************************
void WriteOrder(UCHAR Order)
{
	//LCD_Data=0xff;
	//Is_busy();
	rs=0;
	rw=0;
	en=0;
    delayms(10);
	en=1;
	LCD_Data=Order;
		/*
Order=
	0X01;//清屏
	0X02;//归位
	0X38;// 8位2行5x7点阵
	0X08;//显示器关、光标关、闪烁关
	0X09;//显示器关、光标关、闪烁开
	0X0A;//显示器关、光标开、闪烁关
	0X0B;//显示器关、光标开、闪烁开
	0X0C;//显示器开、光标关、闪烁关
	0X0D;//显示器开、光标关、闪烁开
	0X0E;//显示器开、光标开、闪烁关
	0X0F;//显示器开、光标开、闪烁开
	0X06;//文字不动,光标自动右移
	0X07;//文字,光标自动右移
	0x05;//文字,光标自动左移
	0X80;//写入显示起始地址(第一行第一个位置)
	0XC0;//写入显示起始地址(第二行第一个位置)
	
	*/

}
//********************************************************************
//        写字符串
//********************************************************************
void WriteData(UCHAR y,UCHAR x,unsigned char LcdData[])//LcdData)
{
	UCHAR j,len;
	len=strlen(LcdData);
	//UCHAR D_Idx;
	//LCD_Data=0xff;
	//Is_busy();
	if(1==y) 
	{
		WriteOrder(x+0x80);
	}
	else
	{ 
		WriteOrder(x+0xC0);	
	}
	
    rs=0;
	rw=0;
	en=0;
    delayms(10);
	en=1;
	//D_Idx=len(LcdData);
	for(j=0;j<len;j++)
	{
		//LCD_Data=LCD[j];
		LCD_Data=LcdData[j];
		Is_busy();
		en=1;
	}
		
}
//********************************************************
//写单个字符
//********************************************************
void WriteSChar(UCHAR y,UCHAR x,UCHAR z)//LcdData)
{
	UCHAR j;
//	len=strlen(LcdData);
	//UCHAR D_Idx;
	//LCD_Data=0xff;
	//Is_busy();
	if(1==y) 
	{
		WriteOrder(x+0x80);
	}
	else
	{ 
		WriteOrder(x+0xC0);	
	}
	
    rs=0;
	rw=0;
	en=0;
    delayms(10);
	en=1;
	//D_Idx=len(LcdData);

		//LCD_Data=LCD[j];
	LCD_Data=z;
	Is_busy();
	en=1;

		
}

//********************************************************************
//        LCD1602初始化
//********************************************************************
void LCD_Init(void)
{
	
	WriteOrder(0X01);
	WriteOrder(0x38);
	WriteOrder(0x0C);
	WriteOrder(0x06);
	
}


⌨️ 快捷键说明

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