SHT21 LCD1602 C51例程代码

weixin_44932359 2019-04-17 02:33:06
SHT21.C
#include<reg52.h>
#include<intrins.h>
#include<math.h>
#include<SHT21.h>
#include<LCD1602.h>
sbit SCL=P2^6;
sbit SDA=P2^7;
sbit LED=P1^7;
//bit ACK;
int TEMP,HUMI;
unsigned int i;
unsigned char DATAT,DATAH;
float T=0,H=0;
/************************延时*************************/
void Delay15us()
{
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();
}
/************************启动I2C**********************/
void StartI2C()
{
SDA=1;
SCL=1;
_nop_();
SDA=0;
_nop_();
SCL=0;
}
/************************停止I2C**********************/
void StopI2C()
{
SDA=0;
_nop_();
SCL=1;
_nop_();
SDA=1;
Delay15us();
}
/*************************应答***********************/
void Respons(bit a)
{
if(a==0)
SDA=0;
else
SDA=1;
_nop_();
SCL=1;
_nop_();
SCL=0;
}
/*****************向I2C 总线写一个字节***************/
bit SendByte(unsigned char c)
{
bit ACK=0;
unsigned char BitCnt;
for(BitCnt=0;BitCnt<8;BitCnt++)
{
if(c&0x80)
SDA=0;
else
SDA=1;
SCL=1;
c<<=1;
SCL=0;
}
SDA=1;
SCL=1;
Delay15us();
if(SDA==0)
{
ACK=0;
LED=0;
}
SCL=0;
Delay15us();
return ACK;
}
/*****************从I2C 总线读一个字节***************/
unsigned char RecByte()
{
unsigned char retc=0;
unsigned char BitCnt;
SDA=1;
for(BitCnt=0;BitCnt<8;BitCnt++)
{
SCL=0;
SCL=1;
retc=retc<<1;
if(SDA==1)
retc=retc+1;
}
SCL=0;
return(retc);
}
/*******************写SHT21*****************/
unsigned char ISendByte(unsigned char home,unsigned char mem)
{
bit ACK;
StartI2C();
ACK=SendByte(home);
if(ACK==1)
return(1);
ACK=SendByte(mem);
if(ACK==1)
return(2);
StopI2C();
return(0xff);
}
/************************读SHT21**********************/
unsigned char IRecByte(unsigned char home,unsigned int mem)
{
bit ACK;
StartI2C();
ACK=SendByte(home+1);
if(ACK==0)
return(3);
for(i=0;i<10000;i++)
{
Delay15us();
Delay15us();
if(SCL==1)
break;
}
mem=RecByte();
Respons(0);
mem=mem<<8;
mem|=RecByte();
Respons(1);
StopI2C();
return(0xff);
}
/*******************驱动SHT21*****************/
void SHT21Work()
{
ISendByte(0x80,0xe3);
IRecByte(0X80,DATAT);
ISendByte(0x80,0xe5);
IRecByte(0X80,DATAH);
DATAT&=0xfffc;
DATAH&=0xfffc;
T=DATAT*175.72/0x10000-46.85;
H=DATAH*125.0/0x10000-6;
TEMP=fabs(T)*10;
HUMI=fabs(H)*10;
}
/*******************液晶显示温湿度*****************/
void LCD_Display()
{
LCD_disp_char(6,1,TEMP/1000+'0'); //显示温度百位
LCD_disp_char(7,1,(TEMP%1000)/100+'0'); //显示温度十位
LCD_disp_char(8,1,(TEMP%100)/10+'0'); //显示温度个位
LCD_disp_char(10,1,(TEMP%10)+'0');
LCD_disp_char(6,2,HUMI/1000+'0'); //显示湿度百位
LCD_disp_char(7,2,(HUMI%1000)/100+'0'); //显示湿度十位
LCD_disp_char(8,2,(HUMI%100)/10+'0'); //显示湿度个位
LCD_disp_char(10,2,(HUMI%10)+'0');
}
/*********************主函数*******************/
void main()
{
// InitI2C();
LCD_init();
LCD_disp_str(0,1,"TEMP: . C");
LCD_disp_str(0,2,"HUMI: . %RH");
LCD_disp_char(13,1,0xdf);
while(1)
{
//InitI2C();
SHT21Work();
LCD_Display();
delay_n10us(20);
}
}
LCD1602.C
#include<reg52.h>
#include<intrins.h>
#include<LCD1602.h>
#define uint unsigned int
#define uchar unsigned char
void LCD_init(void); //初始化函数
void LCD_write_command(uchar command); //写指令函数
void LCD_write_data(uchar dat); //写数据函数
void LCD_disp_char(uchar x,uchar y,uchar dat);// 在某个屏幕位置上显示一个字符,X
(0-15),y(1-2)
void LCD_disp_str(uchar x,uchar y,uchar *str); //LCD1602 显示字符串函数
void delay_n10us(uint n); //延时函数
//********************* 第一部分LCD1602 设置
START****************************************
#define LCD_DB P0
sbit LCD_RS=P3^4;
sbit LCD_RW=P3^6;
sbit LCD_E=P3^7;
/*--------------------------------------
模块名称:LCD_init();
功能:初始化LCD1602
-------------------------------------*/
void LCD_init(void)
{
delay_n10us(10);
LCD_write_command(0x38);//设置8 位格式,2 行,5x7
delay_n10us(10);
LCD_write_command(0x0c);//整体显示,关光标,不闪烁
delay_n10us(10);
LCD_write_command(0x06);//设定输入方式,增量不移位
delay_n10us(10);
LCD_write_command(0x01);//清除屏幕显示
delay_n10us(100); //延时清屏,延时函数,延时约n 个10us
}
/*--------------------------------------
模块名称:LCD_write_command();
功能:LCD1602 写指令函数
-------------------------------------*/
void LCD_write_command(uchar dat)
{
delay_n10us(10);
LCD_RS=0; //指令
LCD_RW=0; //写入
LCD_E=1; //允许
LCD_DB=dat;
delay_n10us(10);
LCD_E=0;
delay_n10us(10);
}
/*--------------------------------------
模块名称:LCD_write_data();
功能:LCD1602 写数据函数
-------------------------------------*/
void LCD_write_data(uchar dat)
{
delay_n10us(10);
LCD_RS=1; //数据
LCD_RW=0; //写入
LCD_E=1; //允许
LCD_DB=dat;
delay_n10us(10);
LCD_E=0;
delay_n10us(10);
}
/*--------------------------------------
模块名称:LCD_disp_char();
功能:LCD1602 显示一个字符函数,在某个屏幕位置上显示一个字符,X(0-15),y(1-2)。
-------------------------------------*/
void LCD_disp_char(uchar x,uchar y,uchar dat)
{
uchar address;
if(y==1)
address=0x80+x;
else
address=0xc0+x;
LCD_write_command(address);
LCD_write_data(dat);
}
/*--------------------------------------------------------------
;模块名称:LCD_disp_str();
功能:LCD1602 显示字符串函数,
在某个屏幕起始位置{X(0-15),y(1-2)}上显示一个字符串。
---------------------------------------------------------------*/
void LCD_disp_str(uchar x,uchar y,uchar *str)
{
uchar address;
if(y==1)
address=0x80+x;
else
address=0xc0+x;
LCD_write_command(address);
while(*str!='\0')
{
LCD_write_data(*str);
str++;
}
}
/*--------------------------------------
模块名称:delay_n10us();
功能:延时函数,延时约n 个10us
-------------------------------------*/
void delay_n10us(uint n) //延时n 个10us@12M 晶振
{
uint i;
for(i=n;i>0;i--)
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
}
...全文
161 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧