|
发表于 2008-4-17 23:19:42
|
显示全部楼层
这个当初我也做过, 其实主要是他的datasheet中时序图有错误,
也传一个我做过的SHT10的小东东吧....
还是我毕业的时候编的,现在都编不出这么好的。。
时序图如下:
SHT10时序图 (原文件名:SpxImage1.jpg)
仔细看图中的三个ACK应答信号 第一个没有抬高,而第2。3个都抬高处理了...........
(原文件名:TEMP_10-19.jpg)
汇编源程序 实测通过
SCL BIT P1.0
SDA BIT P1.1
CRC EQU 50H
ORG 0000H
AJMP MAIN
ORG 0030H
MAIN: MOV SP,#5FH
;-----------显示缓冲区---------------
MOV 30H,#13
MOV 31H,#15
MOV 32H,#0
MOV 33H,#0
MOV 34H,#0
MOV 35H,#0
MOV 36H,#0
MOV 37H,#0
ACALL PROCECC
ACALL DISPLAY
START: ACALL WRITE
ACALL READ
ACALL HB2
ACALL HBCD2
ACALL DISPLAY
ACALL D500MS
AJMP START
SJMP $
;-------写控制字--------------------------------
WRITE: ACALL BEGIN
MOV A,#05H ;控制字05表示测量湿度
ACALL SENT
SETB SCL
WAITW: JB SDA,WAITW
CLR SCL
RET
;-------读数据----------------------------------
READ: JB SDA,READ
ACALL RECEIVE ;接收高位
MOV R6,A
;SETB SDA
ACALL RECEIVE ;接收低位
MOV R7,A
;SETB SDA
ACALL RECRC ;接收CRC效验位
MOV CRC,A
RET
;-------起始位--------------------------------------
BEGIN: CLR SCL
NOP
NOP
SETB SCL
CLR SDA
NOP
CLR SCL
NOP
NOP
SETB SCL
SETB SDA
NOP
CLR SCL
NOP
NOP
RET
;-------发送8位数据----------------------------
SENT: MOV R2,#8
S8: CLR SCL
RLC A
MOV SDA,C
SETB SCL
DJNZ R2,S8
CLR SCL
RET
;-------接收8位数据----------------------------
RECEIVE:MOV R2,#8
R8: SETB SCL
MOV C,SDA
RLC A
CLR SCL
DJNZ R2,R8
CLR SDA
SETB SCL
NOP
NOP
CLR SCL
SETB SDA
RET
;-------接收CRC效验位---------------------------
RECRC: MOV R2,#8
RE8: SETB SCL
MOV C,SDA
RLC A
CLR SCL
DJNZ R2,RE8
SETB SDA
SETB SCL
NOP
NOP
CLR SCL
SETB SDA
RET
;-------10MS延时---------------------------------
D10MS: MOV R6,#50
L2: MOV R7,#50
L1: DJNZ R7,L1
DJNZ R6,L2
RET
;-------500MS延时--------------------------------
D500MS: mov r5,#30
L30: MOV R6,#150
L20: MOV R7,#150
L10: DJNZ R7,L10
DJNZ R6,L20
DJNZ R5,L30
RET
;-------双16转10----入R6R7-出R3R4R5--------------
HB2: CLR A ;BCD码初始化
MOV R3,A
MOV R4,A
MOV R5,A
MOV R2,#10H ;转换双字节十六进制整数
HB3: MOV A,R7 ;从高端移出待转换数的一位到CY中
RLC A
MOV R7,A
MOV A,R6
RLC A
MOV R6,A
MOV A,R5 ;BCD码带进位自身相加,相当于乘2
ADDC A,R5
DA A ;十进制调整
MOV R5,A
MOV A,R4
ADDC A,R4
DA A
MOV R4,A
MOV A,R3
ADDC A,R3
MOV R3,A ;双字节十六进制数的万位数不超过6,不用调整
DJNZ R2,HB3 ;处理完16bit
RET
;-------压缩BCD转BCD-----------------------------------
HBCD2: MOV A,R3
MOV B,#10H
DIV AB
MOV 32H,A
MOV 33H,B
MOV A,R4
MOV B,#10H
DIV AB
MOV 34H,A
MOV 35H,B
MOV A,R5
MOV B,#10H
DIV AB
MOV 36H,A
MOV 37H,B
RET
;-------MAX7219初始化子程序-----------------------
CLK BIT P2.7
DIN BIT P2.6
CS BIT P2.4
PROCECC:MOV A,#09H
MOV B,#0FFH
LCALL W_7219
MOV A,#0AH
MOV B,#0BH
LCALL W_7219
MOV A,#0BH
MOV B,#07H
LCALL W_7219
MOV A,#0CH
MOV B,#01H
LCALL W_7219
RET
;-------MAX7219显示子程序---------------------------
DISPLAY:MOV R0,#30H ;数据缓冲区地址
MOV R4,#08 ;数字寄存器位置
MOV R3,#08 ;显示的位数
C_DISP: MOV A,@R0
MOV B,A
MOV A,R4
LCALL W_7219
INC R0
DEC R4
DJNZ R3,C_DISP
RET
W_7219: CLR CS
LCALL SD_7219
MOV A,B
LCALL SD_7219
SETB CS
RET
SD_7219:MOV R6,#08H
C_SD: NOP
CLR CLK
RLC A
MOV DIN,C
NOP
SETB CLK
DJNZ R6,C_SD
RET
END
-------------------------------------------------------------------------------------------------------
我毕业设计中的一部份 好久以前的,看到楼主发了个贴子,实在忍不住就也贴了出来
(原文件名:SpxImage2.jpg)
[sht.h]
--------------------------------------------------------------------------------------------------------
extern void BeginBitSHT (void); /* 发送 SHT_10 起始位 */
extern void SentBitSHT(unsigned char data1); /* 发送8位数据 */
extern unsigned char ReceiveBitSHT(void); /* 接收8位数据 */
extern unsigned char ReceiveCRC_SHT (void); /* 接收CRC效验数据 */
extern void writeSHT (unsigned char Conbit); /* 写入控制字 03代表测温度 05代表测湿度 */
extern unsigned int readSHT (void); /* 读回湿度/湿度值 */
--------------------------------------------------------------------------------------------------------
[main.c]
--------------------------------------------------------------------------------------------------------
#include <reg51.h>
#include "Nokia3310.h"
#include "sht.h"
#include "stcAD.h"
#include "communication.h"
extern void delay(unsigned int time);
extern void delay_us(unsigned int time);
sbit sp = P3^7;
sbit led1 = P3^2;
sbit led2 = P3^3;
#define NET 0x08 //节点号
unsigned char LCD3310DispDat[] = {0x00,0x00,0x00,0x00,0x00};
struct
{
//unsigned char net; //节点号
union
{
int inte;
unsigned char u[2];
}temperature,humidity; //温度.湿度
unsigned char brightness; //% 亮度
}SendSHTdat;
unsigned char Receive; //接收数据缓冲区
/*--------------------------------------
;模块名称:Berrer();
;功 能:蜂呜器提示
;占用资源:P2.3
;创建日期:2007.01.14
;版 本:VER 1.0 ★STALI☆
;-------------------------------------*/
void berrer(unsigned char s)
{
unsigned char t,j;
for (j=0;j<s;j++)
{
for(t=0;t<200;t++)
{
sp = 1;
delay_us(30);
sp = 0;
delay(4);
}
delay(150);
}
}
/*--------------------------------------
;模块名称:CXTX();
;功 能:中断接收数据
;占用资源:
;创建日期:2007.05.19
;版 本:VER 1.0 ★STALI☆
;-------------------------------------*/
void CXTX () interrupt 4 using 3
{
if (RI)
{
Receive = SBUF;
RI = 0;
}
if(TI)
{
TI = 0;
}
}
/*--------------------------------------
;模块名称:DatMove();
;功 能:数的分离
;占用资源:--
;参数说明:待分离的数 [num]分离成num位
;创建日期:2007.01.15
;版 本:VER 1.0 ★STALI☆
;-------------------------------------*/
void DatMove (unsigned int s,unsigned char num)
{
unsigned char i;
for(i=0;i<num;i++)
{
LCD3310DispDat[3 - i] = s % 10;
s /= 10;
}
}
/*--------------------------------------
;模块名称:void disp(unsigned char line,unsigned int s)
;功 能:显示数据
;占用资源:--
;参数说明:unsigned char line 在第line行显示,unsigned int s 显示的数据
;创建日期:2007.01.21
;版 本:VER 1.0.1 ★STALI☆
;-------------------------------------*/
void disp(unsigned char line,unsigned int s)
{
DatMove(s,4);
Display_number(25,line,11);
Display_number (30,line,LCD3310DispDat[0]);
if (line == 0)
{
LCD3310DispDat[0] -= 4;
Display_number (30,line,LCD3310DispDat[0]);
}
Display_number (36,line,LCD3310DispDat[1]);
Display_number(43,line,10);
Display_number (48,line,LCD3310DispDat[2]);
Display_number (54,line,LCD3310DispDat[3]);
}
/*--------------------------------------
;模块名称:disp0();
;功 能:显示 [系统连接中]
;占用资源:
;创建日期:2007.05.16
;版 本:VER 1.0 ★STALI☆
;-------------------------------------*/
void disp0(void)
{
Display_word(0,2,4);
Display_word(13,2,5);
Display_word(25,2,6);
Display_word(37,2,7);
Display_word(49,2,8);
Display_number(76,4,NET);
}
/*--------------------------------------
;模块名称:disp1();
;功 能:显示 [温度: ]
[温度: ]
[亮度: net ]
;占用资源:
;创建日期:2007.05.16
;版 本:VER 1.0 ★STALI☆
;-------------------------------------*/
void disp1(void)
{
Display_word(0,0,0);
Display_word(13,0,3);
Display_number(60,0,12);
Display_word(0,2,1);
Display_word(13,2,3);
Display_number(60,2,13);
Display_word(0,4,2);
Display_word(13,4,3);
Display_number(60,4,13);
Display_number (76,4,NET);
}
/*--------------------------------------
;模块名称:DisplayRhTemp();
;功 能:显示温度、湿度、亮度 数据
;占用资源:
;创建日期:2007.05.16
;版 本:VER 1.0 ★STALI☆
;-------------------------------------*/
void DisplayRhTemp(void)
{
unsigned int light,ShtTempDat;
led1 = 1;
led2 = 1;
writeSHT(0x03);
delay(50);
ShtTempDat = (readSHT()-500);
SendSHTdat.temperature.inte = ShtTempDat; //存入温度
disp(0,ShtTempDat);
while (ShtTempDat>7000) //温度报警上限 30度
{
berrer(3);
led1 = 0;
break;
}
while (ShtTempDat<5000) //温度报警下限 20度
{
berrer(3);
led2 = 0;
break;
}
writeSHT(0x05);
delay(50);
SendSHTdat.humidity.inte = readSHT(); //存入湿度
disp(2,SendSHTdat.humidity.inte);
delay(500);
SendSHTdat.brightness = GetAdResult(2,0x04); //存入亮度
light = (255 - SendSHTdat.brightness);
light *= 39;
disp(4,light);
}
/*--------------------------------------
;模块名称:SendAllDate();
;功 能:向主控MCU发送数据
;占用资源:
;创建日期:2007.05.19
;版 本:VER 1.0 ★STALI☆
;-------------------------------------*/
void SendAllDate (void)
{
Send(0xf0);
Send(SendSHTdat.temperature.u[0]);
Send(SendSHTdat.temperature.u[1]);
Send(SendSHTdat.humidity.u[0]);
Send(SendSHTdat.humidity.u[1]);
Send(SendSHTdat.brightness);
Send(0x0f);
}
void main()
{
AUXR = 0x00;
initNokia3310();
clearNokia3310();
Initsbuf();
disp0();
//
while(Receive != NET);
Receive = 0x00;
berrer(1);
Send(NET);
clearNokia3310();
disp1();
//berrer(1);
while(1)
{
DisplayRhTemp();
if(Receive == NET)
{
Send(NET);
SendAllDate();
Receive = 0x00;
}
}
}
--------------------------------------------------------------------------------------------------------
(原文件名:zz-0015.jpg) |
|