PCF8591:
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define somenop() _nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_()
#define WRITEADDR 0x90
#define READADDR 0x91
//PCF89C51??
sbit SCL=P1^0;
sbit SDA=P1^1;
bit ack;
void Init_I2c()
{
SDA=1;
somenop();
SCL=1;
somenop();
}
void Start_I2c()
{
SDA=1;
somenop();
SCL=1;
somenop();
SDA=0;
somenop();
SCL=0;
somenop();
}
void Stop_I2c()
{
SDA=0;
somenop();
SCL=0;
somenop();
SCL=1;
somenop();
SDA=1;
somenop();
}
void SendByte(uchar c)
{
uchar i;
for(i=0;i<8;i++)
{
if((c<<i)&0x80)SDA=1;
else SDA=0;
somenop();
SCL=1;
somenop();
SCL=0;
}
somenop();
SDA=1;
somenop();
SCL=1;
somenop();
if(SDA==1)ack=0;
else ack=1;
SCL=0;
somenop();
}
uchar RcvByte()
{
uchar retc;
uchar i;
retc=0;
SDA=1;
for(i=0;i<8;i++)
{
somenop();
SCL=0;
somenop();
SCL=1;
somenop();
retc=retc<<1;
if(SDA==1)retc=retc+1;
somenop();
}
SCL=0;
somenop();
return(retc);
}
void Ack_I2c(bit a)
{
if(a==0)
{
SDA=0;
somenop();
SCL=1;
somenop();
SCL=0;
somenop();
SDA=0;
somenop();
SDA=1;
somenop();
}
else
{
SDA=1;
somenop();
SCL=1;
somenop();
SCL=0;
somenop();
SDA=0;
somenop();
}
}
bit ISendByte(uchar add,uchar channel)
{
Start_I2c();
SendByte(add);
if(ack==0)return(0);
SendByte(0x40|channel);
if(ack==0)return(0);
Stop_I2c();
return(1);
}
uchar IRcvByte(uchar add)
{
uchar dat;
Start_I2c();
SendByte(add+1);
if(ack==0)return(0);
dat=RcvByte();
Ack_I2c(1);
Stop_I2c();
return(dat);
}
sbit vled = P3^2;
void Delay1us(uint t)
{
while(t--)_nop_();
}
uint read_data()
{
uint val=0;
//Init_I2c();
vled=0;
Delay1us(20);
ISendByte(WRITEADDR,0);
//val=adc0832(N,M);
val=IRcvByte(WRITEADDR);
vled=1;
Delay1us(400);
return val;
}
主函数:
#include <reg52.h>
#include <lcd1602.h>
#include <math.h>
#include <pcf.h>
#define uchar unsigned char
#define uint unsigned int
void main(void)
{
double PM,pm1,pm2;
int PMVAL=0,HPM=200,PM_count=0,pm1_count=0;
uchar disp[16] ={"PM2.5:0000ug/m3 "};
LCD_Init();
WriteChar(1,0,16,disp);
while(1)
{
pm1+=read_data();//这里为把AD转换后的值传过来
if(++PM_count>=20)
{
PM_count=0;
pm1=pm1/20;
pm2+=pm1;
pm1=0;
if(++pm1_count>=5)
{
pm1_count=0;
PM=pm2/5;
PM=PM*50/255;
PM-=4;
PM/=5;
PM*=1000;
PMVAL=PM;
PMVAL+=235; PMVAL=PMVAL/9;
if(PMVAL>=9999)PMVAL=9999;
WriteCOMorDATA(0x86,0);
if(PMVAL<0)//PMVAL=0;
{WriteCOMorDATA(0+0x30,1);PMVAL=abs(PMVAL);}
else WriteCOMorDATA(PMVAL/1000+0x30,1);
WriteCOMorDATA(PMVAL/100%10+0x30,1);
WriteCOMorDATA(PMVAL/10%10+0x30,1);
WriteCOMorDATA(PMVAL%10+0x30,1);
PM=pm1=pm2=0;
}
}
}
}
|