微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > PCF8591A/D D/A之间转换

PCF8591A/D D/A之间转换

时间:12-01 来源:互联网 点击:
/********************

A/D D/A之间转换

********************/

#include

#define uint unsigned int

#define uchar unsigned char

#define PCF8591 0x90//PCF8591的地址

sbit sda=P2^0;

sbit scl=P2^1;

sbit LS138A=P2^2;//138译码器的3位 控制数码管的

sbit LS138B=P2^3;

sbit LS138C=P2^4;

uint Ledout[8];//8位数码管

uchar AD_change;

uint num0,num1,num2,num3;

uint count;

uchar code table[]={

0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f};//段选

void delay()//执行空语句,微秒级延时函数

{;;}

void delay1ms(uint z)//延时1ms

{

uint x,y;

for(x=z;x>0;x--)

{

for(y=0;y<=110;y++)

{

}

}

}

void init()//初始化状态下SCL和SDA都为高电平

{

scl=1;

delay();

sda=1;

delay();

}

void start()//在SCL为高电平时SDA由高电平到低电平

{

sda=1;

delay();

scl=1;

delay();

sda=0;

}

void respons()

/*

应答信号,SCL在高电平期间,SDA被从设备拉为低电平表示应答。

(sda==1)和i<255相与,表示若在一段时间内没有从器件的应答则主器件

默认从器件已经收到数据而不再等待应答信号

*/

{

uchar i;

scl=1;

delay();

while((sda==1)&&(i<250))

{

i++;

}

scl=0;

delay();

}

void stop()//SCL在高电平期间,SDA一个上升沿停止信号

{

sda=0;

delay();

scl=1;

delay();

sda=1;

}

void write_byte(uchar date)//写一个字节

{

uchar i,temp;

temp=date;

for(i=0;i<8;i++)

{

temp=temp<1;

scl=0;//只有在SCL为0期间才允许SDA数据线上的状态才允许变化

delay();

sda=CY;//PSW的寄存器的CY进位标志位

delay();

scl=1; //SCL时钟信号为高电平期间数据线上的数据必须保持稳定 delay();

delay();

}

scl=0;

delay();

sda=1;//释放总线

delay();

}

uchar read_byte()

{

uchar i,k;

scl=0;

delay();

sda=1;//释放总线

delay();

for(i=0;i<8;i++)

{

scl=1;

delay();

k=(k<1)|sda;

scl=0;

delay();

}

//delay();here is a bug

return k;

}


void write_address(uchar address,uchar date)

{

start();

write_byte(0x90);

respons();

write_byte(address);

respons();

write_byte(date);

respons();

stop();

}

uchar read_address(uchar address)

{

uchar date;

start();

write_byte(0x90); //10010000 前四位固定 接下来三位全部被接地了 所以都是0 最后一位是写 所以为低电平

respons();

write_byte(address);

respons();

start();

write_byte(0x91);

respons();

date=read_byte();

stop();

return date;

}

void display()

{

uchar i;

Ledout[0]=table[num0%10000/1000];

Ledout[1]=table[num0%1000/100];

Ledout[2]=table[num0%100/10];

Ledout[3]=table[num0%10];

Ledout[4]=table[num1%10000/1000];

Ledout[5]=table[num1%1000/100];

Ledout[6]=table[num1%100/10];

Ledout[7]=table[num1%10];

for(i=0;i<8;i++)

{

P0=Ledout[i];

switch(i)

{

case 0:LS138A=0; LS138B=0; LS138C=0; break;

case 1:LS138A=1; LS138B=0; LS138C=0; break;

case 2:LS138A=0; LS138B=1; LS138C=0; break;

case 3:LS138A=1; LS138B=1; LS138C=0; break;

case 4:LS138A=0; LS138B=0; LS138C=1; break;

case 5:LS138A=1; LS138B=0; LS138C=1; break;

case 6:LS138A=0; LS138B=1; LS138C=1; break;

case 7:LS138A=1; LS138B=1; LS138C=1; break;

}

delay1ms(2);

}

P0=0x00;

}

void main()

{

init();

AD_change=0;

while(1)

{

switch(AD_change)

{

case 0:num0=read_address(0x41);

break;

case 1:num1=read_address(0x42);

break;

case 2:num2=read_address(0x43);

break;

case 3:num3=read_address(0x40);

break;

case 4:write_address(0x40,num1);

break;

}

if(++AD_change>4)

{

AD_change=0;

}

display();

}

}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top