资讯详情

基于IIC总线的AD转换模块PCF8591

/*本程序使用普中调试*/

#include<reg52.h> #include<intrins.h> #define uint unsigned int #define uchar unsigned char

#define addw 0x90 #define addr 0x91

sbit scl=P2^0; sbit sda=P2^1;

sbit rs=P2^6; sbit rw=P2^5; sbit en=P2^7;

uchar Ch0value,Ch1value;

void delayms(int i) {int x,y; for (x=i;x>0;x--) for(y=110;y>0;y--); }

void usdelay() { _nop_();_nop_();_nop_(); _nop_();_nop_();_nop_(); }

void start()//开始信号 {//时钟线在高电平时,数据线由高变低即为开始信号由高变低即为开始信号 sda=1; usdelay(); scl=1; usdelay(); sda=0;//数据线由高变低即为开始信号 usdelay(); scl=0; }

void stop()//结束信号 {//时钟线在高电平时,数据线由低变高即为结束信号 sda=0; usdelay(); scl=1; usdelay(); sda=1; usdelay(); sda=0;//这句可有可无 scl=0;//这句可有可无 }

void ack()//应答信号 {uchar i; scl=1; usdelay(); while((sda==1)&&(i<200))i++; scl=0; usdelay(); }

void Noack() //不应答 { sda=1;//时钟线高电平时,数据线高,即为不应答 usdelay(); scl=1; usdelay(); scl=0; usdelay(); }

void send_byte(uchar dat) { uchar i; for(i=0;i<8;i++) { scl=0; usdelay(); sda=(bit)(dat&0x80); //数据传送是由高到低 //(bit)为强制转换命令,把数据变为非0即1的一位数据库 usdelay(); scl=1; usdelay(); dat<<=1; } scl=0; usdelay(); sda=1;//释放总线 usdelay(); }

uchar read_byte() {

uchar i,k; scl=0; usdelay(); sda=1; //释放总线 usdelay(); for(i=0;i<8;i++) { scl=1; usdelay(); k=(k<<1)|sda;//判断8次,移位7次 scl=0; usdelay(); } return k; }

uchar read_adc(uchar channel) { uchar temp; start(); send_byte(addw); ack(); send_byte(0x40|channel); ack(); start(); send_byte(addr); ack(); temp=read_byte(); Noack(); stop(); return temp;

}

void init() { scl=1; sda=1; }

/*********1602程序********************/

void write_com(uchar com) { rs=0; rw=0; en=0; P0=com; delayms(2); en=1; delayms(2); en=0; }

void write_dat(uchar dat) { rs=1; rw=0; en=0; P0=dat; delayms(2); en=1; delayms(2); en=0; }

void zfc(uchar *p) { while(*p!=0) write_dat(*p++); }

void init_1602() { write_com(0x38); delayms(2); write_com(0x0c); delayms(2); write_com(0x06); delayms(2); write_com(0x01); write_com(0x80); zfc("Channel 0 :"); write_com(0x80+0x40); zfc("Channel 1 :"); }

void display() { uchar a0,a1,a2,b0,b1,b2; a0=Ch0value*196/10000; a1=Ch0value*196%10000/1000; a2=Ch0value*196%1000/100;

b0=Ch1value*196/10000; b1=Ch1value*196%10000/1000; b2=Ch1value*196%1000/100; write_com(0x80+11); write_dat(0x30+a0); write_dat('.'); write_dat(0x30+a1); write_dat(0x30+a2); write_dat('V');

write_com(0x80+0x40+11); write_dat(0x30+b0); write_dat('.'); write_dat(0x30+b1); write_dat(0x30+b2); write_dat('V');

} void main() { init_1602(); init(); while(1) { Ch0value=read_adc(0); delayms(50); Ch1value=read_adc(1); delayms(50); display(); } }

-电子元器件采购网(www.ruidan.com)是本土元器件目录分销商,采用“小批量、现货、样品”销售模式,致力于满足客户多型号、高质量、快速交付的采购需求。 自建高效智能仓储,拥有自营库存超过50,000种,提供一站式正品现货采购、个性化解决方案、选型替代等多元化服务。
锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台