/***********************************************************************************
;功能说明:SHT10-LED温湿度显示KeilC程序
;文件名称:mysht10.c
;微处理器:AT89C52
;编译环境:Keil uVision V3.53 、uv2.38a均通过,proteus7.4sp3仿真正常。
;作 者:Huang qianjiang
;创建日期:2009.04.15
;版 本:V1.0
;修改日期:
;修改说明:
;***********************************************************************************/
/*************定义接口********************
P0------ (高位led段)
P2------ (低位led段)
P1.1------SCK (SHT10时钟线)
P1.0------DATA (SHT10数据线)
P1.6------(温度显示片选)
P1.7------(湿度显示片选)
P1.5-------(蜂鸣器控制)
P1.4-------(控制继电器开关)
P3.0、P3.1-------(串行口)
*****************************************/
#include <reg52.h>
#include <intrins.h>
#include <math.h> //Keil library
#include <stdio.h> //Keil library
//*********************第一部分LED设置****************************************
unsigned int wendu,shidu;
unsigned char code table_h[20]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
unsigned char code table_l[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
sbit Tc = P1^7; //温度显示控制,1=关,0=开
sbit Hc = P1^6; //湿度显示控制,1=关,0=开
/*sbit Yc = P1^5; //蜂鸣器控制
sbit Jc = P1.4 //开关输出
static unsigned char bdata StateREG;//可位寻址的输出状态寄存器
sbit YC1 = StateREG^0; //是否有告警1
sbit YC2 = StateREG^1; //是否告警2
sbit YC3 = StateREG^2; //是否告警3
sbit JC1 = StateREG^3; //是否开关
sbit QM = StateREG^4; //P1.4输出一定时间后(5分钟),温度上升小于3度告警4(缺煤)
*/
/******定义函数****************/
#define uchar unsigned char
#define uint unsigned int
void LED_init(void); //LED初始化函数
void LED_xianshi(void); //LED显示函数
void delay_n10us(uint n); //延时10uS函数
//void shuchu_kz(void); //输出控制函数
//中断函数
//串口初始化函数
//void com_data(void); //串口发送数据函数
//void GJ_sheng(void); //告警声音函数
/*--------------------------------------
;模块名称:LED_init();
;功 能:初始化LED、及端口
;参数说明:
;创建日期:
;版 本:
;修改日期:
;修改说明:
;-------------------------------------*/
void LED_init(void)
{
Tc = 1;
Hc = 1;
//Yc = 1;
// Jc = 1;
//bdata StateREG = 0x00;
P0=0xff ;//data_h = 0x80;
P2=0xff ;//data_l = 0x00;
}
/*--------------------------------------
;模块名称:LED_xianshi();
;功 能:LED 显示温度、湿度
;参数说明:
;创建日期:
;版 本:
;修改日期:
;修改说明:
;-------------------------------------*/
void LED_xianshi(void)
{
uint i;
uchar a,b,c,v,w;
for(i=0;i<51;i++)
{
Hc = 1;
P0 = 0xff;
P2 = 0xff;
delay_n10us(200);
Tc = 0;
a = (wendu/1000); //温度百位
b=((wendu%1000)/100); //温度十位
c=((wendu%100)/10); //温度个位
a = a*10+b;
P0 = table_h[a];
P2 = table_l[c];
delay_n10us(1000);//延时10ms
Tc = 1;
P0 = 0xff;
P2 = 0xff;
delay_n10us(200);
Hc = 0;
v=((shidu%1000)/100); //湿度十位
w=((shidu%100)/10); //湿度个位
P0 = table_h[v];
P2 = table_l[w];
delay_n10us(1000);
Hc = 1;
}
}
/*--------------------------------------
;模块名称:delay_n10us(uint n);
;功 能:延时10uS函数
;参数说明:延时n个10us
;创建日期:
;版 本:
;修改日期:
;修改说明:
;-------------------------------------*/
void delay_n10us(uint n) //延时n个10us@12M晶振
{
uint i;
for(i=n;i>0;i--)
{
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
}
}
/*--------------------------------------
;模块名称:shuchu_kz(void);
;功 能:输出控制函数
;参数说明:
;创建日期:
;版 本:
;修改日期:
;修改说明:
;-------------------------------------*/
//void shuchu_kz(void)
/*--------------------------------------
;模块名称:com_data(void);
;功 能:通过232向PC发送当前温度、湿度、输出控制状态寄存器值等数据函数
;参数说明:固定地址01,波特率9600
;创建日期:
;版 本:
;修改日期:
;修改说明:
;-------------------------------------*/
//void com_data(void)
//*********************第二部分SHT10设置 ****************************************
sbit SCK = P1^1; //定义通讯时钟端口
sbit DATA = P1^0; //定义通讯数据端口
typedef union
{ unsigned int i; //定义了两个共用体
float f;
} value;
enum {TEMP,HUMI}; //TEMP=0,HUMI=1
#define noACK 0 //用于判断是否结束SHT10通讯
#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);//SHT10写函数
char s_read_byte(unsigned char ack); //SHT10读函数
char s_measure(unsigned char *p_value, unsigned char *p_checksum, unsigned char mode);//测量温湿度函数
void calc_dht10(float *p_humidity ,float *p_temperature);//温湿度补偿
/*--------------------------------------
;模块名称:s_transstart();
;功 能:启动传输函数
;参数说明:
;创建日期:
;版 本:
;修改日期:
;修改说明:
;-------------------------------------*/
void s_transstart(void)
// _____ ________
// DATA: |_______|
// ___ ___
// SCK : ___| |___| |______
{
DATA=1; //初始状态
SCK=0;
_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)
// 通讯复位: DATA-line=1 and at least 9 SCK cycles followed by transstart
// _____________________________________________________ ________
// DATA: |_______|
// _ _ _ _ _ _ _ _ _ ___ ___
// SCK : __| |__| |__| |__| |__| |__| |__| |__| |__| |______| |___| |______
{
unsigned char i; //初始状态
DATA=1;
SCK=0;
for(i=0;i<9;i++) //9 SCK cycles
{
SCK=1;
SCK=0;
}
s_transstart(); //启动传输
}
/*--------------------------------------
;模块名称: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
- 1
- 2
前往页