📄 shtxx_iic.lst
字号:
C51 COMPILER V7.00 SHTXX_IIC 10/10/2007 14:42:10 PAGE 1
C51 COMPILER V7.00, COMPILATION OF MODULE SHTXX_IIC
OBJECT MODULE PLACED IN SHTXX_iic.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE SHTXX_iic.c OPTIMIZE(SIZE) BROWSE DEBUG OBJECTEXTEND
stmt level source
1 //温湿度传感器SHTXX系列,I2C接口程序
2 //2007-06-06
3 //-----------------------函数声明,变量定义--------------------------------------------------------
4 #include <reg52.h>
5 #include <intrins.h>
6 sbit SDA=P1^6; // 将p1.6口模拟数据口
7 sbit SCL=P1^7; // 将p1.7口模拟时钟口
8 #define uchar unsigned char
9 #define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
10 #define BIT7 0X80
11 #define BIT6 0X40
12 #define BIT5 0X20
13 #define BIT4 0X10
14 #define BIT3 0X08
15 #define BIT2 0X04
16 #define BIT1 0X02
17 #define BIT0 0X01
18 //#define NUM 10 // 接收和发送缓存区的深度
19 //unsigned char idata sendbuf[NUM]; // 数据发送缓冲区
20 //unsigned char idata receivebuf[NUM]; // 数据接收缓冲区
21 //bit bdata SystemError; // 从机错误标志位
22 //--------------------------------------------------------------------------------------------------
23 // 函数名称: iic_start()
24 // 函数功能: 启动I2C总线子程序
25 //--------------------------------------------------------------------------------------------------
26 void iic_start(void)
27 {
28 1 //:当SCK 时钟高电平时DATA 翻转为低电平,紧接着SCK 变为低电平,随后是在SCK时钟高电平时DATA 翻转为高电平。
29 1 // EA=0;
30 1 SDA = 1;
31 1 SCL = 1;
32 1 SDA = 0;
33 1 SCL = 0;
34 1 SCL = 1;
35 1 SDA = 1;
36 1 SCL = 0;
37 1 _nop_();_nop_();
38 1
39 1 }
40 //--------------------------------------------------------------------------------------------------
41 // 函数名称: iic_reset()
42 // 函数功能: 停止I2C总线数据传送子程序
43 //--------------------------------------------------------------------------------------------------
44 /*void iic_reset(void)
45 {
46 SDA = 1; //当DATA 保持高电平时,触发SCK 时钟9 次或更多。
47 SCL = 1;SCL = 0;
48 SCL = 1;SCL = 0;
49 SCL = 1;SCL = 0;
50 SCL = 1;SCL = 0;
51 SCL = 1;SCL = 0;
52 SCL = 1;SCL = 0;
53 SCL = 1;SCL = 0;
54 SCL = 1;SCL = 0;
55 SCL = 1;SCL = 0;
C51 COMPILER V7.00 SHTXX_IIC 10/10/2007 14:42:10 PAGE 2
56 SCL = 1;SCL = 0;
57 }*/
58 //--------------------------------------------------------------------------------------------------
59 // 函数名称: iic_stop()
60 // 函数功能: 停止I2C总线数据传送子程序
61 //--------------------------------------------------------------------------------------------------
62 /*void iic_stop(void)
63 {
64 SDA = 1; //通过保持确认位ack 高电平,来中止通讯。
65 SCL = 1;SCL = 0;
66 }*/
67 //--------------------------------------------------------------------------------------------------
68 // 函数名称: slave_ACK
69 // 函数功能: 从机发送应答位子程序
70 //--------------------------------------------------------------------------------------------------
71 void slave_ACK(void)
72 {
73 1 SDA = 0;
74 1 SCL = 1;SCL = 0;
75 1 }
76 //--------------------------------------------------------------------------------------------------
77 // 函数名称: slave_NOACK
78 // 函数功能: 从机发送非应答位子程序,迫使数据传输过程结束
79 //--------------------------------------------------------------------------------------------------
80 void slave_NOACK(void)
81 {
82 1 SDA = 1; //通过保持确认位ack 高电平,来中止通讯。
83 1 SCL = 1;SCL = 0;
84 1 }
85 //--------------------------------------------------------------------------------------------------
86 // 函数名称: check_ACK
87 // 函数功能: 主机应答位检查子程序,迫使数据传输过程结束
88 //--------------------------------------------------------------------------------------------------
89 void check_ACK(void)
90 {
91 1 SDA = 1; // 将p1.0设置成输入,必须先向端口写1
92 1 SCL = 1;
93 1 F0 = 0;
94 1 if(SDA == 1) // 若SDA=1表明非应答,置位非应答标志F0
95 1 F0 = 1;
96 1 SCL = 0;
97 1 }
98
99 //--------------------------------------------------------------------------------------------------
100 // 函数名称: IICSendByte
101 // 入口参数: ch
102 // 函数功能: 发送一个字节
103 //--------------------------------------------------------------------------------------------------
104 void IICSendByte(unsigned char ch)
105 {
106 1 unsigned char idata n=8; // 向SDA上发送一位数据字节,共八位
107 1 while(n--)
108 1 {
109 2 if((ch&0x80) == 0x80) // 若要发送的数据最高位为1则发送位1
110 2 {
111 3 SDA = 1; // 传送位1
112 3 SCL = 1;SCL = 0;
113 3 }
114 2 else
115 2 {
116 3 SDA = 0; // 否则传送位0
117 3 SCL = 1;SCL = 0;
C51 COMPILER V7.00 SHTXX_IIC 10/10/2007 14:42:10 PAGE 3
118 3 }
119 2 ch = ch<<1; // 数据左移一位
120 2 }
121 1 }
122 //--------------------------------------------------------------------------------------------------
123 // 函数名称: IICreceiveByte
124 // 返回接收的数据
125 // 函数功能: 接收一字节子程序
126 //--------------------------------------------------------------------------------------------------
127 unsigned char IICreceiveByte(void)
128 {
129 1 unsigned char idata n=8; // 从SDA线上读取一上数据字节,共八位
130 1 unsigned char tdata;
131 1 while(n--)
132 1 {
133 2 SDA = 1;
134 2 SCL = 1;
135 2 tdata = tdata<<1; // 左移一位,或_crol_(temp,1)
136 2 if(SDA == 1)
137 2 tdata = tdata|0x01; // 若接收到的位为1,则数据的最后一位置1
138 2 else
139 2 tdata = tdata&0xfe; // 否则数据的最后一位置0
140 2 SCL=0;
141 2 }
142 1 return(tdata);
143 1 }
144 //--------------------------------------------------------------------------------------------------
145 // 函数名称: InitSHTXX
146 // 函数功能: 初始化SHTXX
147 //--------------------------------------------------------------------------------------------------
148 void InitSHTXX(void)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -