我是靠谱客的博主 震动月亮,这篇文章主要介绍zigbee网关 cc2530裸机驱动温度传感器LM75A,现在分享给大家,希望可以做个参考。

LM75A,数字温度传感器,IIC接口,读取简单,只需要读取2个寄存机的值就可计算出来温度


手里里有个贴片的LM75A,在一块废弃的pcb板上利用0805电阻脚把lm75a的sda和scl脚焊好,其它的引脚用插针焊好


现在lm75a对外有4个引脚,分别是VCC,GND,SDA,SCL

把5,6,7,8,脚焊在了一起,这样根据pdf介绍

它的iic地址为1001111,即0x4F。

把VCC,GND,SDA,SCL与cc2530网关开发板的终端开发板连接起来


LM75A与CC2530终端开发板连接方式
    LM75A    CC2530终端开发板
VCC+3.3V
GNDGND
SDAP0_6
SCLP0_7

先写软件模拟iic,cc2530根普通的51单片机单片机,普通的51单片机读取io状态的时候把io置高直接读就可以了,而cc2530需要专门专门设定寄存器来制定当前的io是输入还是输出,因此多写了写了2个宏用于寄存器赋值

复制代码
1
2
3
4
5
6
7
#define SDA P0_6//数据线 #define SCL P0_7//时钟线 #define _nop_() asm("nop"); #define set_sda_in() P0DIR &= ~(1<<6) #define set_sda_out() P0DIR |= 1<<6


软件模拟iic的驱动如下:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
#include "iic.h" /* I2C通信使用delay()函数 一个_nop_()延时1us,总线要求延时大于4.7us 单片机频率执行周期不同时按实际需要修改 sck时钟频率400k */ void delay() { int i = 0; for(i = 0; i < 32*4.7; i++) _nop_(); } //总线初始化 //将总线都拉高以释放总线 void iic_init() { set_sda_out(); SCL = 1; delay(); SDA = 1; delay(); } //启动信号 //SCL在高电平期间,SDA由高电平向低电平的变化定义为启动信号 void iic_start() { set_sda_out(); SDA = 1; delay(); SCL = 1; delay(); SDA = 0; delay(); } //停止信号 //SCL在高电平期间,SDA由低电平向高电平的变化定义为停止信号 void iic_stop() { set_sda_out(); SDA = 0; delay(); SCL = 1; delay(); SDA = 1; delay(); } //应答信号 //SCL在高电平期间,SDA被从设备拉为低电平表示应答 //其中(SDA == 1)&&(i<255)表示若在一段时间内没有收到从器件的应答则主器件默认从器件已经收到数据而不再等待应答信号 //若没有这部分代码,程序会停在这里,实际运用中不允许这种情里发生,或者return ture或false,方便调试 //等待从设备产生应答 void iic_srespons() { set_sda_in(); unsigned char i = 0; SCL = 1; delay(); while((SDA == 1)&&(i<254)) i++; SCL = 0; delay(); } //由主设备发出应答 //从设备在发送完一字节后将SDA拉高(SDA被释放),主设备将SDA拉低产生应答 void iic_mrespons() { set_sda_out(); SDA = 0;//直接将SDA拉低,再操纵SCL delay(); SCL = 1; delay(); SCL = 0; delay(); } //主设备不应答 void iic_nrespons() { set_sda_out(); SDA = 1;//SDA高电平为不应答 delay(); SCL = 1; delay(); SCL = 0; delay(); } //写入 //串行发送一个字节时,需要把这个字节中的8位一位一位地发出去,“temp=temp<<1;” //表示将temp左移一位,最高位将移入PSW寄存器的CY位中,然后将CY赋给SDA进而在SCL的控制下发送出去 //最后将SDA拉高,以等待从设备产生应答 void iic_write(unsigned char data) { set_sda_out(); unsigned char i, temp; temp = data; for(i=0; i<8; i++) { SCL = 0; delay(); SDA = temp/128; delay(); SCL = 1; delay(); temp = temp << 1; } SCL = 0; delay(); SDA = 1; delay(); } //读出 //串行接受一个字节时需了、将8位一位一位地接受,然后再组合成一个字节, //代码定义了k,将k左移一位后与SDA进行“或”运算,一次把8个独立的位放入一个字节中来完成接收 unsigned char iic_read() { set_sda_in(); unsigned char i, k; SCL = 0; delay(); SDA = 1; delay(); for(i=0; i<8; i++) { SCL = 1; delay(); k = (k<<1)|SDA; SCL = 0; delay(); } delay(); return k; }


在main函数中开启的串口用于显示温度,因为不读只往外写

串口初始化函数

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
</pre><pre name="code" class="cpp">void uart_init(void) { PERCFG = 1<<1; //uart1:P1 alt2 P0SEL = (1<<2)|(1<<3); //P0_2,P0_3用作串口,第二功能 P0DIR &= ~(1<<2); //P0_2 rxd input P0DIR |= (1<<3); //P0_3 txd output P2DIR &= ~0XC0; //P0优先作为UART0 U0CSR |= 0x80; //UART方式 U0GCR |= 11; U0BAUD |= 216; //波特率设为115200 其中关于修改波特率值的问题 UTX0IF = 1; //具体参看用户手册的串口部分 //U0CSR |= 0x40; //允许接收 // UTX0IF = 0; //UART0 TX中断标志初始置位0 //IEN0 |= 1<<2; // 开总中断,接收中断 }


串口发送函数

复制代码
1
2
3
4
5
6
7
8
9
10
void uart_send(char *p_data,unsigned char length) { int i=0; for(i=0;i<length;i++) { U0DBUF = p_data[i]; while(UTX0IF == 0) ; UTX0IF = 0; } }


读取温度函数,根据pdf寄存器读出的第一个数的全部位+第二个数的高3位组成的值*0.125就是当前的温度值


复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
float ReadTemp(void) { int temphigh, templow; iic_start(); iic_write(IIC_ADDR);//硬件地址1001111,读模式,LM75不需要指定地址,直接连续读2字节温度 iic_srespons(); temphigh = iic_read(); iic_mrespons(); templow = iic_read(); iic_nrespons(); iic_stop(); if(temphigh > 127)//负温度的处理,理论可行,尚未测试 { temphigh = (~temphigh) + 1;//~优先级低于+ templow = (~templow) + 1; temphigh = temphigh << 3; templow = templow >> 5; return -(temphigh+templow)*0.125; } temphigh = temphigh << 3; templow = templow >> 5; return (temphigh+templow)*0.125; }

main主函数

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void main() { int i = 0; char buffer[20]; system_init(); iic_init();//I2C总线初始化 uart_init(); uart_send("system initial success...rn",27); while(1) { uart_send(buffer,sprintf(buffer,"Temperature is: %2.1frn", ReadTemp())); for(i=0;i<10000;i++) delay();//延迟1s } }


上电查看效果:


成功!温度上升是因为我那电烙铁烤了它。

源码下载链接: 点击打开链接

最后

以上就是震动月亮最近收集整理的关于zigbee网关 cc2530裸机驱动温度传感器LM75A的全部内容,更多相关zigbee网关内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(59)

评论列表共有 0 条评论

立即
投稿
返回
顶部