×
单片机 > 单片机程序设计 > 详情

51单片机PCF8591 DA转换源码

发布时间:2024-06-29 发布时间:
|

单片机源程序如下:

/**********************51实验开发板例程************************

* 平台:HJ-C52 + Keil U4 + STC89C52RD

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

/*-----------------------------------------------

名称:IIC协议 PCF8591ADDA转换

内容:此程序通过IIC协议对DAAD芯片操作, 并输出模拟量,用LED亮度渐变指示

------------------------------------------------*/

#include //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义

#include //包含NOP空指令函数_nop_();


#define AddWr 0x90 //写数据地址

#define AddRd 0x91 //读数据地址


sbit RST=P2^4; //关掉时钟芯片输出

sbit Sda=P2^0; //定义总线连接端口

sbit Scl=P2^1;

sbit Fm=P2^3; //FM

sbit dula=P2^6;

sbit wela=P2^7;

bit ADFlag; //定义AD采样标志位

unsigned char code Datatab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//7段数共阴码管段码表

data unsigned char Display[8];//定义临时存放数码管数值

/*------------------------------------------------

延时程序

------------------------------------------------*/

void mDelay(unsigned char j)

{

unsigned int i;

for(;j>0;j--)

{

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

{;}

}

}

/*------------------------------------------------

初始化定时器1

------------------------------------------------*/

void Init_Timer1(void)

{

TMOD |= 0x10;

TH1=0xff; /* Init value */

TL1=0x00;

//PT1=1; /* 优先级 */

EA=1; /* interupt enable */

ET1=1; /* enable timer1 interrupt */

TR1=1;

}

/*------------------------------------------------

启动IIC总线

------------------------------------------------*/

void Start(void)

{

Sda=1;

_nop_();

Scl=1;

_nop_();

Sda=0;

_nop_();

Scl=0;

}



/*------------------------------------------------

停止IIC总线

------------------------------------------------*/

void Stop(void)

{

Sda=0;

_nop_();

Scl=1;

_nop_();

Sda=1;

_nop_();

Scl=0;

}



/*------------------------------------------------

应答IIC总线

------------------------------------------------*/

void Ack(void)

{

Sda=0;

_nop_();

Scl=1;

_nop_();

Scl=0;

_nop_();

}



/*------------------------------------------------

非应答IIC总线

------------------------------------------------*/

void NoAck(void)

{

Sda=1;

_nop_();

Scl=1;

_nop_();

Scl=0;

_nop_();

}



/*------------------------------------------------

发送一个字节

------------------------------------------------*/

void Send(unsigned char Data)

{

unsigned char BitCounter=8;

unsigned char temp;


do

{

temp=Data;

Scl=0;

_nop_();

if((temp&0x80)==0x80)

Sda=1;

else

Sda=0;


Scl=1;

temp=Data<<1;

Data=temp;

BitCounter--;

}

while(BitCounter);

Scl=0;

}



/*------------------------------------------------

读入一个字节并返回

------------------------------------------------*/

unsigned char Read(void)

{

unsigned char temp=0;

unsigned char temp1=0;

unsigned char BitCounter=8;


Sda=1;

do

{

Scl=0;

_nop_();

Scl=1;

_nop_();

if(Sda)

temp=temp|0x01;

else

temp=temp&0xfe;


if(BitCounter-1)

{

temp1=temp<<1;

temp=temp1;

}

BitCounter--;

}

while(BitCounter);

return(temp);

}


/*------------------------------------------------

写入DA数模转换值

------------------------------------------------*/

void DAC(unsigned char Data)

{

Start();

Send(AddWr); //写入芯片地址

Ack();

Send(0x40); //写入控制位,使能DAC输出

Ack();

Send(Data); //写数据

Ack();

Stop();

}


/*------------------------------------------------

读取AD模数转换的值,有返回值

------------------------------------------------*/

unsigned char ReadADC(unsigned char Chl)

{

unsigned char Data;

Start(); //写入芯片地址

Send(AddWr);

Ack();

Send(0x40|Chl);//写入选择的通道,本程序只用单端输入,差分部分需要自行添加

//Chl的值分别为0、1、2、3,分别代表1-4通道

Ack();

[1] [2]
51单片机PCF8591DA转换

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
STM32 TIMER2的使用