设备地址:
只进行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();
}
}