51单片机PCF8591光敏电阻调灯亮度代码并告诉我ad数据的数字范围
时间: 2024-03-14 19:42:39 浏览: 132
51单片机计算电阻代码
以下是一个基于51单片机和PCF8591的光敏电阻调灯亮度的代码示例:
```C
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit SCL=P2^1; //IIC时钟引脚
sbit SDA=P2^0; //IIC数据引脚
sbit Led=P1^0; //LED灯引脚
void delay(uint x) //延时函数
{
uint i,j;
for(i=0;i<x;i++)
for(j=0;j<125;j++);
}
void Start() //IIC起始信号
{
SDA=1;
SCL=1;
_nop_();
_nop_();
_nop_();
_nop_();
SDA=0;
_nop_();
_nop_();
_nop_();
_nop_();
SCL=0;
}
void Stop() //IIC停止信号
{
SDA=0;
_nop_();
_nop_();
_nop_();
_nop_();
SCL=1;
_nop_();
_nop_();
_nop_();
_nop_();
SDA=1;
}
void Write(uchar dat) //IIC写数据
{
uchar i;
for(i=0;i<8;i++)
{
SDA=dat&0x80;
dat<<=1;
SCL=1;
_nop_();
_nop_();
_nop_();
_nop_();
SCL=0;
}
}
uchar Read() //IIC读数据
{
uchar i,dat=0;
SDA=1;
for(i=0;i<8;i++)
{
SCL=1;
_nop_();
_nop_();
_nop_();
_nop_();
dat<<=1;
dat|=SDA;
SCL=0;
}
return dat;
}
void main()
{
uchar ad_dat;
Start();
Write(0x90); //发送写命令,选择PCF8591设备
Write(0x40); //选择通道0
while(1)
{
Write(0x00); //发送转换命令
delay(5); //延时等待转换完成
Start();
Write(0x91); //发送读命令,选择PCF8591设备
ad_dat=Read(); //读取AD转换数据
Stop();
Led=ad_dat>128?0:1; //根据AD转换数据控制LED灯亮度
}
}
```
该代码使用了51单片机和PCF8591的I2C通信协议,通过读取PCF8591的AD转换数据来调节LED灯的亮度。其中,PCF8591的A/D转换器可以将模拟量转换成数字量,转换后的数字范围是0~255(8位分辨率),因此AD转换数据的数字范围也是0~255。
阅读全文