51单片机PCF8951光敏电阻ad转换代码
时间: 2024-01-08 21:03:46 浏览: 113
使用51单片机与PCF8951进行光敏电阻AD转换的代码如下:
```c
#include <reg51.h>
#include <intrins.h>
#define PCF8951_Addr 0x90 //PCF8951的地址,根据A0-A2引脚的连接方式进行修改
sbit SDA = P1^0; //I2C总线SDA引脚
sbit SCL = P1^1; //I2C总线SCL引脚
unsigned char Read_Data(unsigned char Addr);
void Write_Data(unsigned char Addr, unsigned char dat);
void Delay_5us();
void Delay_1ms();
unsigned int AD_Convert();
void main()
{
unsigned int AD_Value;
while(1)
{
AD_Value = AD_Convert(); //获取光敏电阻AD值
//在这里进行其他操作,比如将AD值显示在LCD上,或者控制其他外设等
}
}
//从PCF8951芯片中读取数据
unsigned char Read_Data(unsigned char Addr)
{
unsigned char dat;
SDA = 1;
SCL = 1;
Delay_5us();
SDA = 0;
Delay_5us();
SCL = 0;
Delay_5us();
Write_Data(Addr, 0xff); //发送读取命令
SDA = 1; //发送停止位
Delay_5us();
SCL = 1;
Delay_5us();
dat = SDA; //读取数据
Delay_5us();
SCL = 0;
Delay_5us();
return dat;
}
//向PCF8951芯片中写入数据
void Write_Data(unsigned char Addr, unsigned char dat)
{
unsigned char i;
for(i=0; i<8; i++)
{
SDA = (dat & 0x80) >> 7; //发送数据位
dat <<= 1; //数据左移一位
SCL = 1;
Delay_5us();
SCL = 0;
Delay_5us();
}
SDA = 1;
Delay_5us();
SCL = 1;
Delay_5us();
SCL = 0;
Delay_5us();
}
//5微秒延时函数
void Delay_5us()
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
//1毫秒延时函数
void Delay_1ms()
{
unsigned char i, j;
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
//进行光敏电阻AD转换
unsigned int AD_Convert()
{
unsigned char AD_H, AD_L;
unsigned int AD_Value;
Write_Data(PCF8951_Addr, 0x40); //发送转换命令
Delay_1ms(); //等待转换完成
AD_H = Read_Data(PCF8951_Addr); //读取AD高8位
AD_L = Read_Data(PCF8951_Addr); //读取AD低8位
AD_Value = (AD_H << 8) | AD_L; //将高低8位组合成16位AD值
return AD_Value;
}
```
这里的代码使用了I2C总线协议与PCF8951进行通信,通过发送转换命令和读取AD值的方式来实现光敏电阻的AD转换。需要注意的是,在使用PCF8951之前需要先对其进行初始化,具体实现方式可以参考PCF8951的数据手册。
阅读全文