/*************端口定义********************
P1.0------SCK (SHT10)
P1.1------DATA (SHT10)
P0------DB0~DB7 (LCD1602)
P2.0------RS (LCD1602)
P2.1------RW (LCD1602)
P2.2------E (LCD1602)
*****************************************/
#include <reg52.h>
#include <intrins.h>
#include <stdio.h>
#include <string.h>
#include <absacc.h>
#include <math.h>
#define uchar unsigned char
#define uint unsigned int
//1602液晶端口定义 ******
sbit LcdRs= P2^0;
sbit LcdRw= P2^1;
sbit LcdEn= P2^2;
sbit ACC0 = ACC^0;
sbit ACC7 = ACC^7;
uchar str[7];
//向LCD写入命令或数据************************************************************
#define LCD_COMMAND 0 // Command
#define LCD_DATA 1 // Data
#define LCD_CLEAR_SCREEN 0x01 // 清屏
#define LCD_HOMING 0x02 // 光标返回原点
//设置显示模式************************************************************
#define LCD_SHOW 0x04 //显示开
#define LCD_HIDE 0x00 //显示关
#define LCD_CURSOR 0x02 //显示光标
#define LCD_NO_CURSOR 0x00 //无光标
#define LCD_FLASH 0x01 //光标闪动
#define LCD_NO_FLASH 0x00 //光标不闪动
//设置输入模式************************************************************
#define LCD_AC_UP 0x02
#define LCD_AC_DOWN 0x00 // default
#define LCD_MOVE 0x01 // 画面可平移
#define LCD_NO_MOVE 0x00 //default
unsigned char LCD_Wait(void);
void LCD_Write(bit style, unsigned char input);
/***********1602液晶显示部分子程序****************/
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void LCD_Write(bit style, unsigned char input)
{
LcdRs=style;
P0=input;
delay(5);
LcdEn=1;
delay(5);
LcdEn=0;
}
void LCD_SetDisplay(unsigned char DisplayMode)
{
LCD_Write(LCD_COMMAND, 0x08|DisplayMode);
}
void LCD_SetInput(unsigned char InputMode)
{
LCD_Write(LCD_COMMAND, 0x04|InputMode);
}
//初始化LCD************************************************************
void LCD_Initial()
{
LcdEn=0;
LCD_Write(LCD_COMMAND,0x38); //8位数据端口,2行显示,5*7点阵
LCD_Write(LCD_COMMAND,0x38);
LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR); //开启显示, 无光标
LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); //清屏
LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE); //AC递增, 画面不动
}
//液晶字符输入的位置************************
void GotoXY(unsigned char x, unsigned char y)
{
if(y==0)
LCD_Write(LCD_COMMAND,0x80|x);
if(y==1)
LCD_Write(LCD_COMMAND,0x80|(x-0x40));
}
//将字符输出到液晶显示
void Print(unsigned char *str)
{
while(*str!='\0')
{
LCD_Write(LCD_DATA,*str);
str++;
}
}
void zhuanhuan(float a)//浮点数转换成字符串函数
{
memset(str,0,sizeof(str));
sprintf (str,"%f", a);
}
void welcome()
{
LCD_Initial();
GotoXY(0,0);
Print(" Welcome! ");
GotoXY(0,1);
Print(" Code of sht10 ");
delay(200);
}
/*--------------------------------------
;模块名称:delay_n10us();
;功 能:延时函数,延时约n个10us
较精确的延时函数,"_nop_()"延时1us@12M晶振
;-------------------------------------*/
void delay_n10us(uint n) //延时n个10us@12M晶振
{
uint i;
for(i=n;i>0;i--)
{
_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();
}
}
//*********************第一部分LCD1602设置 END****************************************
//*********************第二部分DHT90设置 START****************************************
sbit SCK = P1^0; //定义通讯时钟端口
sbit DATA = P1^1; //定义通讯数据端口
typedef union
{ unsigned int i; //定义了两个共用体
float f;
} value;
enum {TEMP,HUMI}; //TEMP=0,HUMI=1
#define noACK 0 //用于判断是否结束通讯
#define ACK 1 //结束数据传输
//adr command r/w
#define STATUS_REG_W 0x06 //000 0011 0
#define STATUS_REG_R 0x07 //000 0011 1
#define MEASURE_TEMP 0x03 //000 0001 1
#define MEASURE_HUMI 0x05 //000 0010 1
#define RESET 0x1e //000 1111 0
/****************定义函数****************/
void s_transstart(void); //启动传输函数
void s_connectionreset(void); //连接复位函数
char s_write_byte(unsigned char value);//DHT90写函数
char s_read_byte(unsigned char ack); //DHT90读函数
char s_measure(unsigned char *p_value, unsigned char *p_checksum, unsigned char mode);//测量温湿度函数
void calc_dht90(float *p_humidity ,float *p_temperature);//温湿度补偿
/*--------------------------------------
;模块名称:s_transstart();
;功 能:启动传输函数
;-------------------------------------*/
void s_transstart(void)
// generates a transmission start
// _____ ________
// DATA: |_______|
// ___ ___
// SCK : ___| |___| |______
{
DATA=1; SCK=0; //Initial state
_nop_();
SCK=1;
_nop_();
DATA=0;
_nop_();
SCK=0;
_nop_();_nop_();_nop_();
SCK=1;
_nop_();
DATA=1;
_nop_();
SCK=0;
}
/*--------------------------------------
;模块名称:s_connectionreset();
;功 能:连接复位函数
;-------------------------------------*/
void s_connectionreset(void)
// communication reset: DATA-line=1 and at least 9 SCK cycles followed by transstart
// _____________________________________________________ ________
// DATA: |_______|
// _ _ _ _ _ _ _ _ _ ___ ___
// SCK : __| |__| |__| |__| |__| |__| |__| |__| |__| |______| |___| |______
{
unsigned char i;
DATA=1; SCK=0; //Initial state
for(i=0;i<9;i++) //9 SCK cycles
{
SCK=1;
SCK=0;
}
s_transstart(); //transmission start
}
/*--------------------------------------
;模块名称:s_write_byte();
;功 能:SHT10写函数
;-------------------------------------*/
char s_write_byte(unsigned char value)
//----------------------------------------------------------------------------------
// writes a byte on the Sensibus and checks the acknowledge
{
unsigned char i,error=0;
for (i=0x80;i>0;i/=2) //shift bit for masking
{
if (i & value) DATA=1; //masking value with i , write to SENSI-BUS
else DATA=0;
SCK=1; //clk for SENSI-BUS
_nop_();_nop_();_nop_(); //pulswith approx. 3 us
SCK=0;
}
DATA=1; //release DATA-line
SCK=1; //clk #9 for ack
error=DATA; //check ack (DATA will be pulled down by DHT90),DATA在第9个上升沿将被DHT90自动下拉为低电平。
_nop_();_nop_();_nop_();
SCK=0;
DATA=1; //release DATA-line
return error; //error=1 in case of no acknowledge //返回:0成功,1失败
}
/*--------------------------------------
;模块名称:s_read_byte();
;功 能:SHT10读函数
;-------------------------------------*/
char s_read_byte(unsigned char ack)
// reads a byte form the Sensibus and gives an acknowledge in case of "ack=1"
{
unsigned char i,val=0;
DATA=1; //release DATA-line
for (i=0x80;i>0;i/=2) //shift bit for masking
{ SCK=1; //clk for SENSI-BUS
if (DATA) val=(val | i); //read bit
_nop_();_nop_();_nop_(); //pulswith approx. 3 us
SCK=0;
}
if(ack==1)DATA=0; //in case of "ack==1" pull down DATA-Line
else DATA=1; //如果是校验(ack==0),读取完后结束通讯
_nop_();_nop_();_nop_(); //pulsw
没有合适的资源?快使用搜索试试~ 我知道了~
SHT10.rar_SHT10仿真_proteus_sht10 1602_温湿度1602仿真_温湿度proteus
共20个文件
bak:4个
lst:2个
obj:2个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 76 浏览量
2022-07-15
09:46:57
上传
评论
收藏 81KB RAR 举报
温馨提示
使用keil C并用PROTEUS仿真,实现8051单片机对温湿度传感器SHT10数据采集,并使用1602液晶显示。
资源推荐
资源详情
资源评论
收起资源包目录
SHT10.rar (20个子文件)
SHT10
SHT10.PWI 1KB
SHT10程序(51单片机)1602液晶显示
SHT10.c 12KB
SHT10_Opt.Bak 1KB
STARTUP.LST 14KB
SHT10.lnp 58B
SHT10.LST 20KB
SHT10.hex 12KB
STARTUP.A51 6KB
SHT10 24KB
SHT10.M51 25KB
SHT10.Uv2.bak 2KB
SHT10.opt.bak 1015B
SHT10.uvproj 13KB
STARTUP.OBJ 749B
SHT10.plg 178B
SHT10.uvopt 55KB
SHT10.OBJ 23KB
SHT10_Uv2.Bak 2KB
Last Loaded SHT10.DBK 87KB
SHT10.DSN 98KB
共 20 条
- 1
资源评论
四散
- 粉丝: 52
- 资源: 1万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功