MAX518特点;
单+5V电源,8位转换精度,I2C接口,可选单通道输出或双通道同时输出
/**********************************
晶振:11.0592M
模拟I2C总线操作max518
2007/12/01
编写:fjh
/**********************************/
#include <iom128v.h>
#include <macros.h>
#define uchar unsigned char
#define uint unsigned int
#define SCL_H PORTD|=(1<<6)
#define SCL_L PORTD&=~(1<<6)
#define SDA_H PORTD|=(1<<7)
#define SDA_L PORTD&=~(1<<7)
/******************应用程序********************/
void delay(uchar us);
void Start(void);
void Stop(void);
void SendByte(uchar Dat);
/**********************************************/
void port_init(void)
{
PORTA = 0xff;
DDRA = 0xff;
PORTB = 0xff;
DDRB = 0xff;
PORTC = 0xff;
DDRC = 0xff;
PORTD = 0x00;
DDRD = 0xff;
PORTE = 0xff;
DDRE = 0xff;
PORTF = 0xff;
DDRF = 0xff;
PORTG = 0x00;
DDRG = 0x00;
}
void delay(uchar us)
{
while(us--);
}
/************************START***************************/
void Start(void)
{
//SDA_H;
delay(5);
SCL_H;
delay(5);
SDA_L;
delay(5);
SCL_L;
delay(5);
}
void Stop(void)
{
//SDA_L;
delay(5);
SCL_H;
delay(5);
SDA_H;
delay(5);
SCL_L;
delay(5);
}
/********************************************************/
/***********向I2C总线发送一个字节+接收一个ACK************/
void SendByte(uchar Dat)
{
uchar i=0;
uchar T_Data=0;
DDRD|=(1<<1);//输出
SCL_L;
delay(10);
T_Data=Dat;
for(i=0;i<8;i++)
{
if(T_Data&0x80)
SDA_H;
else
SDA_L;
delay(5);
SCL_L;
delay(5);
SCL_H;
delay(5);
T_Data=T_Data<<1;
SCL_L;
delay(5);
}
SDA_H;//释放总线
delay(5);
SCL_L; /*********************/
delay(5);//接收一个ACK,不做处理
SCL_H; /*********************/
delay(5);
SCL_L;
}
/******************转换函数***********************/
void DAC_T(uchar command,uchar T_data)
{
Start();
SendByte(0x58);//addr
delay(5);
SendByte(command);//command 0x00:通道1 0x01:通道2
delay(5);
SendByte(T_data);//data
Stop();
}
/***************************************************/
void delay1ms(uint ms)
{
uint i;
for (; ms>0; ms--)
for (i=1500; i>0;i--)
;
}
/*******************MAIN函数*************************/
void main()
{
port_init();
SCL_L;
Stop();
while(1)
{
DAC_T(0x01,0x40);
delay1ms(1000);
}
}
线路图:
文章评论(0条评论)
登录后参与讨论