PCF8591

设备地址:

 

只进行AD:光敏电阻:0x01;可调电阻:0x03

只进行DA:0x40

都进行:光敏电阻:0x41;可调电阻:0x43

要求:读取光敏电阻和可调电阻的电压,输出5V的电压

#include "reg52.h"
#include "iic.h"

unsigned int temp;
unsigned char SMG[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

void Delayms(unsigned int t)		//@12.000MHz
{
	while(t--)
	{
		unsigned char i, j;
		i = 2;
		j = 239;
		do
		{
			while (--j);
		} while (--i);
	}
}


void Select_Hc573(char n)
{
	switch(n)
	{
		case 4:P2 = (P2 & 0x1f) |0x80;break;
		case 5:P2 = (P2 & 0x1f) |0xa0;break;
		case 6:P2 = (P2 & 0x1f) |0xc0;break;
		case 7:P2 = (P2 & 0x1f) |0xe0;break;
	}
}

void Sys_Init()
{
	Select_Hc573(4);
	P0 = 0xff;
	Select_Hc573(5);
	P0 = 0x00;
}

void Select_SmgBit(unsigned char pos,unsigned char dat)
{
	Select_Hc573(6);
	P0 = 0x01 << pos;
	Select_Hc573(7);
	P0 = dat;
	Delayms(1);
	
	Select_Hc573(6);
	P0 = 0xff;
	Select_Hc573(7);
	P0 = 0xff;
}

void Display_Smg()
{
	Select_SmgBit(5,SMG[temp / 100 % 10]);
	Select_SmgBit(6,SMG[temp / 10 % 10]);
	Select_SmgBit(7,SMG[temp % 10]);
}

void PCF8591_Write(unsigned char addr,dat)
{
	IIC_Start();
	IIC_SendByte(0x90);
	IIC_WaitAck();
	IIC_SendByte(addr);
	IIC_WaitAck();
	IIC_SendByte(dat);
	IIC_WaitAck();
	IIC_Stop();
}

unsigned int PCF8591_Read(unsigned char addr)
{
	unsigned int temp;
	IIC_Start();
	IIC_SendByte(0x90);
	IIC_WaitAck();
	IIC_SendByte(addr);
	IIC_WaitAck();
	
	IIC_Start();
	IIC_SendByte(0x91);
	IIC_WaitAck();
	temp = IIC_RecByte();
	IIC_SendAck(1);
	IIC_Stop();
	return temp;
}

void main()
{
	Sys_Init();
	while(1)
	{
		temp = PCF8591_Read(0x01);//读取光敏电阻电压
//		temp = PCF8591_Read(0x03);//读取可变电阻电压
//		PCF8591_Write(0x40,255);//输出5V电压
		Display_Smg();
	}
}

要求:读取电位器或光敏电阻的电压,并在数码管上显示出来,精确到小数点后两位,并用DA引脚输出对应电压

#include "reg52.h"
#include "iic.h"



unsigned int Vol;
unsigned char SMG[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
void Delay1ms(unsigned int t)		//@12.000MHz
{
	while(t--)
	{
		unsigned char i, j;
		i = 2;
		j = 239;
		do
		{
			while (--j);
		} while (--i);
	}
}


void Select_Hc573(char n)
{
	switch(n)
	{
		case 4:P2 = (P2 & 0x1f) |0x80;break;
		case 5:P2 = (P2 & 0x1f) |0xa0;break;
		case 6:P2 = (P2 & 0x1f) |0xc0;break;
		case 7:P2 = (P2 & 0x1f) |0xe0;break;
	}
}

void Sys_Init()
{
	Select_Hc573(4);
	P0 = 0xff;
	Select_Hc573(5);
	P0 = 0x00;
}

void Select_SmgBit(unsigned char pos,unsigned char dat)
{
	Select_Hc573(6);
	P0 = 0x01 << pos;
	Select_Hc573(7);
	P0 = dat;
	Delay1ms(1);
	
	Select_Hc573(6);
	P0 = 0xff;
	Select_Hc573(7);
	P0 = 0xff;
}

void Display_Smg()
{
	Select_SmgBit(5,SMG[Vol / 100 % 10] - 0x80);
	Select_SmgBit(6,SMG[Vol / 10 % 10]);
	Select_SmgBit(7,SMG[Vol % 10]);
}

void PCF8591_Write(unsigned char addr,dat)
{
	IIC_Start();
	IIC_SendByte(0x90);
	IIC_WaitAck();
	IIC_SendByte(addr);
	IIC_WaitAck();
	IIC_SendByte(dat);
	IIC_WaitAck();
	IIC_Stop();
}

unsigned int PCF8591_Read(unsigned char addr)
{
	unsigned int temp;
	IIC_Start();
	IIC_SendByte(0x90);
	IIC_WaitAck();
	IIC_SendByte(addr);
	IIC_WaitAck();
	
	IIC_Start();
	IIC_SendByte(0x91);
	IIC_WaitAck();
	temp = IIC_RecByte();
	IIC_SendAck(1);
	IIC_Stop();
	return temp;
}

void main()
{
	Sys_Init();
	while(1)
	{
		Vol = (PCF8591_Read(0x43) / 51.0) * 100;
		PCF8591_Write(0x43,PCF8591_Read(0x43));
		Display_Smg();
	}
}

要求:利用AD通道0引脚读取外界输入电压值,在数码管显示

#include "reg52.h"
#include "iic.h"



unsigned int Vol;
unsigned char SMG[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
void Delay1ms(unsigned int t)		//@12.000MHz
{
	while(t--)
	{
		unsigned char i, j;
		i = 2;
		j = 239;
		do
		{
			while (--j);
		} while (--i);
	}
}


void Select_Hc573(char n)
{
	switch(n)
	{
		case 4:P2 = (P2 & 0x1f) |0x80;break;
		case 5:P2 = (P2 & 0x1f) |0xa0;break;
		case 6:P2 = (P2 & 0x1f) |0xc0;break;
		case 7:P2 = (P2 & 0x1f) |0xe0;break;
	}
}

void Sys_Init()
{
	Select_Hc573(4);
	P0 = 0xff;
	Select_Hc573(5);
	P0 = 0x00;
}

void Select_SmgBit(unsigned char pos,unsigned char dat)
{
	Select_Hc573(6);
	P0 = 0x01 << pos;
	Select_Hc573(7);
	P0 = dat;
	Delay1ms(1);
	
	Select_Hc573(6);
	P0 = 0xff;
	Select_Hc573(7);
	P0 = 0xff;
}

void Display_Smg()
{
	Select_SmgBit(5,SMG[Vol / 100 % 10] - 0x80);
	Select_SmgBit(6,SMG[Vol / 10 % 10]);
	Select_SmgBit(7,SMG[Vol % 10]);
}

void PCF8591_Write(unsigned char addr,dat)
{
	IIC_Start();
	IIC_SendByte(0x90);
	IIC_WaitAck();
	IIC_SendByte(addr);
	IIC_WaitAck();
	IIC_SendByte(dat);
	IIC_WaitAck();
	IIC_Stop();
}

unsigned int PCF8591_Read(unsigned char addr)
{
	unsigned int temp;
	IIC_Start();
	IIC_SendByte(0x90);
	IIC_WaitAck();
	IIC_SendByte(addr);
	IIC_WaitAck();
	
	IIC_Start();
	IIC_SendByte(0x91);
	IIC_WaitAck();
	temp = IIC_RecByte();
	IIC_SendAck(1);
	IIC_Stop();
	return temp;
}

void main()
{
	Sys_Init();
	PCF8591_Write(0x40,200);
	while(1)
	{
		Vol = (PCF8591_Read(0x40) / 51.0) * 100;
		Display_Smg();
	}
}
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值