📄 ad5934.c
字号:
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit SCL=P2^0;
sbit SDA=P2^1;
void delay(uchar d)
{
while(--d);
}
//================IIC总线的操作子程序====================
/*****************启动总线**********************/
void IICStart(void)
{
SCL=0;
SDA=1;SCL=1;SCL=1;SCL=1;SCL=1;
SDA=0;SDA=0;SDA=0;SDA=0;SDA=0;
SCL=0;SCL=0;SCL=0;
SDA=1;
}
/*****************停止IIC总线****************/
void IICStop(void)
{
SCL=0;SDA=0;
SCL=1;SCL=1;SCL=1;SCL=1;
SDA=1;SDA=1;SDA=1;SDA=1;
SCL=0;
}
/**************检查应答位*******************/
bit IICRecAck(void)
{
SCL=0;
SDA=1;
SCL=1;SCL=1;SCL=1;SCL=1;SCL=1;
CY=SDA; //因为返回值总是放在CY中的
SCL=0;
return(CY);
}
/*****************不对IIC总线产生应答***************/
void IICNoAck(void)
{
SDA=1;
SCL=1;SCL=1;SCL=1;SCL=1;SCL=1;SCL=0;
}
/*******************向IIC总线写数据*********************/
void IICSendByte(uchar sendbyte)
{
uchar j;
for(j=8;j>0;j--)
{
SCL=0;
sendbyte<<=1; //无论C51怎样实现这个操作,始终会使CY=sendbyte^7;
SDA=CY;
SCL=1;
}
SCL=0;
}
/**********************从IIC总线上读数据子程序**********/
uchar IICReceiveByte(void)
{
uchar receivebyte,ii;
SCL=0;
ii=8;
while(ii--)
{
SCL=1;
receivebyte=(receivebyte<<1)|SDA;
SCL=0;
}
return(receivebyte);
}
bit IICWrite(uchar address,uchar buf)
{
bit flag=0;
flag=1;
IICStart(); //开始IIC
IICSendByte(0x1a); //发送从器件地址(R/W=0) 0001 1010
if(IICRecAck())
flag=0;
IICSendByte(address); //Send Register Address
if(IICRecAck())
flag=0;
IICSendByte(buf);
if(IICRecAck()) //Send Register Data
flag=0; //停止IIC
IICStop();
delay(255);
delay(255);
delay(255);
delay(255);
return flag;
}
/*
uchar IICRead(uint address)
{ uchar buf;
IICStart();
IICSendByte(0xa0);
if(IICRecAck())
buf=0xff;
IICSendByte((uchar)(address>>8));
if(IICRecAck())
buf=0xff;
IICSendByte((uchar)address);
if(IICRecAck())
buf=0xff;
IICStart();
IICSendByte(0xa1);
if(IICRecAck())
buf=0xff;
buf=IICReceiveByte();
//read last byte data
IICNoAck();
IICStop();
return(buf);
}
*/
main()
{
IICWrite(0x82,0x3d); //Start frequency: Fs=0x3d70a3*Fmclk/(2^27*16)
IICWrite(0x83,0x70); //
IICWrite(0x84,0xa3);
IICWrite(0x85,0x00); //Frequency increment Finc=10/8=1.25HZ
IICWrite(0x86,0x05);
IICWrite(0x87,0x3e);
IICWrite(0x88,0x00); //Number of increments(N<<512) N=150
IICWrite(0x89,0x96);
IICWrite(0x80,0xb0); //Standby Mode 0x80: 1011 0000
IICWrite(0x81,0x18);
IICWrite(0x81,0x08);
IICWrite(0x80,0x10); //Initialize with Start Frequency
IICWrite(0x80,0x20);
while(1)
{
IICWrite(0x80,0x30); //Increment frequency
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -