51单片机利用IIC总线对LM75A温度进行读取

该博客详细介绍了如何使用51单片机通过IIC通信协议与LM75A温度传感器进行交互,包括发送起始和停止信号、读写操作、应答检测等关键步骤,并提供了读取温度值的完整代码实现。通过该代码,可以获取并显示温度值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <INTRINS.H>
#include "..\config\c8051f350.h"
#include "..\config\const.h"
#include "..\driver\system.h"
#include "..\driver\other.h"

#define IIC_WRITE 0
#define IIC_READ  1
#define VREF 24380

static unsigned long sysclk=24500000;

sbit SDA=P0^0;
sbit SCL=P0^1;
sbit led=P1^2; 

void Delay_us(unsigned int times){
	unsigned int i;
	for(i=0;i<times;i++){
		_nop_();
		_nop_();
		_nop_();
		_nop_();
		_nop_();
		_nop_();
		_nop_();
		}
}			           //延时us函数

void Delay_ms(unsigned int times)
{
	unsigned int i;
	for (i=0;i<times;i++)
		Delay_us(1000);
}					   //延时ms函数

void iic_start(void){
	  SDA = 1;
	  Delay_us(2);
      SCL = 1;
	  Delay_us(2);
      SDA = 0;
	  Delay_us(2);  
}					  //iic通信起始信号


void iic_stop(void){
	  SDA = 0;
	  Delay_us(2);
      SCL = 1;
	  Delay_us(2);
      SDA =1;
}				      //iic通信终止信号

void iic_ack(void)                      
{ 
	  SCL = 0;
      SDA = 0;
	  Delay_us(2);
      SCL = 1;
	  Delay_us(2);  
### 关于蓝桥杯竞赛中单片机温度传感器相关的底层开发 #### 单片机温度传感器的接口设计 在涉及单片机温度传感器的应用场景下,通常会选用具备SPI或I²C通信协议的温度传感器来简化硬件连接并提高数据传输效率。对于这类应用,在单片机端需实现相应的外设驱动程序以支持这些总线的操作。 #### 温度传感器的选择及其特性 常见的用于此类项目的温度传感元件有DS18B20LM75A等。其中,DS18B20因其独特的单总线结构而受到欢迎;它仅需一条信号线即可完成电源供电及双向通讯功能[^1]。相比之下,LM75A则更倾向于利用两线制I²C接口进行工作,并且具有内置过温报警机制的特点[^2]。 #### 底层驱动编程要点 针对上述提到的不同类型的温度传感器,编写其对应的底层驱动代码时需要注意以下几点: - **初始化设置**:无论是哪种型号的温度传感器,在正式采集之前都应先对其进行必要的参数设定,例如分辨率调整(适用于某些可调精度的产品)、模式切换(如待机电流降低)等。 - **读取/写入命令发送**:依据具体器件的数据手册说明构建合适的指令序列向目标设备发出请求或是接收反馈信息。这一步骤往往涉及到特定格式的消息帧构造以及校验位计算等问题。 - **中断处理逻辑**:当采用轮询方式监测状态变化可能影响实时性能的情况下,则可以考虑引入外部中断源触发事件响应流程,从而优化整体架构的设计思路。 ```c // 示例:使用IIC接口读取LM75A温度值 (假设已定义好iic_start, iic_write, iic_read 函数) void read_lm75a_temperature(float *temp){ unsigned char msb, lsb; iic_start(); iic_write(LM75A_ADDRESS | IIC_WRITE); // 发送地址加写标志 iic_write(TEMP_REG); // 指定要访问的是温度寄存器 iic_start(); // 重新启动条件准备接受数据 iic_write(LM75A_ADDRESS | IIC_READ); // 改变方向为读 msb = iic_read(ACK); // 获取高字节 lsb = iic_read(NACK); // 获取低字节后停止传送 *temp = ((msb << 4) | (lsb >> 4)) / 16.0; // 计算实际温度值 } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值