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
GND GND
SDA P0_6
SCL P0_7

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

#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的驱动如下:

#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拉低,再操纵SCLdelay();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函数中开启的串口用于显示温度,因为不读只往外写

串口初始化函数

</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 inputP0DIR |= (1<<3);            //P0_3 txd outputP2DIR &= ~0XC0;             //P0优先作为UART0U0CSR |= 0x80;              //UART方式U0GCR |= 11;                       U0BAUD |= 216;              //波特率设为115200    其中关于修改波特率值的问题                     UTX0IF = 1;                 //具体参看用户手册的串口部分
//U0CSR |= 0x40;              //允许接收 //   UTX0IF = 0;                 //UART0 TX中断标志初始置位0//IEN0 |= 1<<2;               // 开总中断,接收中断
}

串口发送函数

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就是当前的温度值

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主函数

void main()
{int i = 0;char buffer[20];system_init();iic_init();//I2C总线初始化uart_init();uart_send("system initial success...\r\n",27);while(1) {uart_send(buffer,sprintf(buffer,"Temperature is: %2.1f\r\n", ReadTemp()));for(i=0;i<10000;i++) delay();//延迟1s }
}

上电查看效果:

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

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

zigbee网关 cc2530裸机驱动温度传感器LM75A相关推荐

  1. Zigbee网关 CC2530驱动1602显示屏

    根据文章zigbee网关 CC2530网关开发板之终端开发板可用的IO点击打开链接 目前开发板可用的IO为 P0_4,P0_5,P0_6,P0_7 -- 空 P1_0,P1_1,P1_2 -- 空 而 ...

  2. Zigbee网络架构+ZigBee的体系结构+理解zigbee节点的实现的案例+“51单片机” 和 “zigbee” 、 “cc2530芯片” 之间的关系+芯片cc2530

    ZigBee技术具有强大的组网能力,可以形成星型.树型和网状网,可以根据实际项目需要来选择合适的网络结构: 以下拓扑结构的节点,均是指支持zigbee协议的并以其通信技术手段,实现节点处所需要功能的产 ...

  3. linux zigbee开发板,基于嵌入式Linux的ZigBee网关设计与实现

    摘要: 从ZigBee联盟诞生以来,随着ZigBee协议的相关标准不断完善,协议栈持续改进等因素,基于 ZigBee无线传感网络的开发与应用也越来越多.由于其低功耗,低成本,低延时,安全可靠以及自组网 ...

  4. 【华为云技术分享】小熊派华为物联网操作系统LiteOS裸机驱动移植02-LCD驱动移植及使用

    1. LCD裸机驱动 小熊派开发板使用的LCD屏幕为1.3寸的TFT彩屏,色彩深度16bit,分辨率240*240,使用 SPI 接口与 MCU 之间通信. 如果你对裸机玩转LCD屏幕还不熟悉,请先阅 ...

  5. ccs 移植创建新工程_LiteOS裸机驱动移植05 | E53_SF1智慧消防扩展板驱动及使用

    (小熊派IoT开发套件全部教程   ↑点击启阅↑) ▷01 | 物联网一站式开发工具 IoT-Studio ▷02 | Hello World ▷03 | 任务管理 ▷04 | 信号量(任务同步) ▷ ...

  6. 玩转树莓派之ZigBee网关

    *参考文档:ug129-zigbee-gateway-ref-design-guide>> 1.树莓派ZigBee网关架构: ZigBee Host应用程序运行在树莓派系统上,EM3588 ...

  7. ZigBee——在CC2530的ZStack中添加定时任务

    在使用CC2530芯片进行ZigBee协议的开发时,我们往往使用TI公司提供的带有ZigBee协议栈的ZStack工程,接下来以其中的SampleApp为例,向其中添加自己需要的定时任务并设置周期和处 ...

  8. 触摸屏(裸机/驱动)编程思想—JZ2440

    触摸屏(裸机/驱动)编程 触摸屏的种类 电阻式触摸屏 电容式触摸屏 触摸屏裸机程序 触摸屏驱动程序 参考资料: 1.[韦东山]嵌入式Linux应用开发完全手册(旧内核未包含新协议和新API接口--本文 ...

  9. BlueTooth: 嵌入式蓝牙网关中蓝牙驱动层研究与实现

    0.引言 随着智能终端设备的不断增多,用来连接各种笔记本.PDA.台式电脑等设备的电缆布线会越来越复杂,它不 仅影响了美观性,还增加了安装.维护的费用和难度,蓝牙技术是解决上述问题的有效途径之一,家庭 ...

  10. I.MX6ULL裸机驱动开发四种方式总结

    学习裸机驱动开发也有一阵子,终于是把几种裸机驱动方法学完了,总体来说难度并不大.因为毕竟有基础在,能大概看懂数据手册和知道如何是控制寄存器. 驱动方法目前所学共有四种: 1.纯汇编驱动 2.汇编驱动头 ...

最新文章

  1. js 判断多个关键词_2020关键词优化,做好这三点效果立现!
  2. OpenCASCADE绘制测试线束:形状修复命令之一般命令
  3. 程鑫峰:1.23日央行推行负利率政策,伦敦金后市行情解析
  4. Amazon S3 设置对象的生命周期Lifecycle
  5. php json encode中文乱码,php json_encode中文乱码如何解决
  6. Linux OpenSSL获取证书指纹值(443、MD5、SHA1、SHA256)
  7. Ubuntu12.04 下配置tomcat
  8. 技术解读丨分布式缓存数据库Redis大KEY问题定位及优化建议
  9. springboot+vue+element+mybatisplus项目(前端)
  10. 教老年人计算机心得体会,老年人教育工作心得体会
  11. Java 接口和抽象类的异同点
  12. Arp病毒专杀工具下载及其防治解决方案
  13. dimm和udimm_RDIMM和UDIMM内存的区别
  14. nowcoder-第三届湖北省赛-Mr.Maxwell and attractions (贪心)
  15. 【Java SE】数组的打印方式
  16. 新任亚马逊掌舵者凭什么是他?
  17. c++ sprintf()详解
  18. 如何区别计算机体系结构与计算机组成这两个概念?
  19. 《自然语言处理实战入门》---- 神经网络与推荐系统初步简介
  20. ArcGIS提取斜坡单元

热门文章

  1. Pearson 相关系数
  2. 对比分析法(Comparative Analysis Approach)
  3. Python获取当前时间
  4. 丹佛大学计算机专业,丹佛大学计算机工程专业排名第(2018年USNEWS美国排名)...
  5. 苹果官网查询产品的激活日期教程
  6. 储户诉银行虚假宣传 微众银行智能存款产品屡遭用户投诉
  7. 外汇天眼:标普9月制造业PMI改善至51.8,综合PMI升至49.3
  8. web网站添加ico图标
  9. HTML---网络编程基础知识(2)
  10. Linux学习笔记----01