📄 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 + -