将GUVA-S12SD紫外线传感器通过PCF8591转换成毫伏电压的51程序
时间: 2023-12-06 18:45:31 浏览: 39
以下是将GUVA-S12SD紫外线传感器通过PCF8591转换成毫伏电压的51程序,供您参考:
```c
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
#define PCF8591_ADDR 0x90 // PCF8591地址
#define GUVA_S12SD_ADDR 0x00 // GUVA-S12SD地址
sbit SCL = P2^1; // I2C总线SCL引脚
sbit SDA = P2^0; // I2C总线SDA引脚
// I2C总线起始信号
void I2C_Start()
{
SDA = 1;
SCL = 1;
SDA = 0;
SCL = 0;
}
// I2C总线停止信号
void I2C_Stop()
{
SDA = 0;
SCL = 1;
SDA = 1;
}
// I2C总线等待应答信号
bit I2C_WaitAck()
{
bit ack;
SDA = 1;
SCL = 1;
ack = SDA;
SCL = 0;
return ack;
}
// I2C总线发送应答信号
void I2C_Ack()
{
SDA = 0;
SCL = 1;
SCL = 0;
}
// I2C总线发送非应答信号
void I2C_NAck()
{
SDA = 1;
SCL = 1;
SCL = 0;
}
// I2C总线发送一个字节
void I2C_WriteByte(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
SDA = dat & 0x80;
SCL = 1;
SCL = 0;
dat <<= 1;
}
}
// I2C总线接收一个字节
uchar I2C_ReadByte()
{
uchar i, dat = 0;
SDA = 1;
for(i=0;i<8;i++)
{
dat <<= 1;
SCL = 1;
dat |= SDA;
SCL = 0;
}
return dat;
}
// 从PCF8591读取GUVA-S12SD的电压值
uint ReadGUVA_S12SD()
{
uint vol;
I2C_Start();
I2C_WriteByte(PCF8591_ADDR);
if(!I2C_WaitAck())
{
I2C_Stop();
return 0;
}
I2C_WriteByte(GUVA_S12SD_ADDR);
if(!I2C_WaitAck())
{
I2C_Stop();
return 0;
}
I2C_Start();
I2C_WriteByte(PCF8591_ADDR | 0x01);
if(!I2C_WaitAck())
{
I2C_Stop();
return 0;
}
vol = I2C_ReadByte();
I2C_Ack();
I2C_Stop();
return vol * 5000 / 255; // 将ADC值转换成电压值,单位为毫伏
}
void main()
{
uint vol;
while(1)
{
vol = ReadGUVA_S12SD(); // 读取GUVA-S12SD的电压值
// 将电压值转换成待显示的数值(例如:1.23V -> 123)
// 将待显示的数值发送到数码管显示模块进行显示
}
}
```
注意:以上程序仅供参考,具体实现还需根据您的具体硬件环境和实际需求进行调整和修改。