⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tmain.c

📁 PHilips 4路A/D+1路D/A芯片控制C程序
💻 C
字号:
//工程模版
#include <Reg52.H>
#include <globe.h>
#include <const.h>
#include <function.h>


sbit     SDA=P1^0;
sbit     SCL=P1^1;

void IICStart(void)
{
SCL=0;                  //
SDA=1;
SCL=1;
_nop_();
_nop_();
_nop_();
SDA=0;
_nop_();
_nop_();
_nop_();
SCL=0;
SDA=1;                  //
}

//-----------------停止IIC总线----------------/
void IICStop(void)
{
SCL=0;
SDA=0;
SCL=1;
_nop_();
_nop_();
_nop_();
SDA=1;
_nop_();
_nop_();
_nop_();
}

//--------------检查应答位-------------------/
bit IICRecAck(void)
{
SCL=0;
SDA=1;
SCL=1;
_nop_();
_nop_();
_nop_();
CY=SDA;                 //因为返回值总是放在CY中的
SCL=0;
return(CY);
}

//---------------对IIC总线产生应答-------------------/
void IICACK(void)
{
SDA=0;
SCL=1;
_nop_();
_nop_();
_nop_();
SCL=0;
_nop_();
_nop_();
_nop_();
SDA=1;
}

//-----------------不对IIC总线产生应答---------------/
void IICNoAck(void)
{
SDA=1;
SCL=1;
_nop_();
_nop_();
_nop_();
SCL=0;
}

//-------------------向IIC总线写数据---------------------/
void IICSendByte(unsigned char sendbyte)
{
unsigned char data j=8;
for(;j>0;j--)
   {
   SCL=0;
   sendbyte<<=1;        //无论C51怎样实现这个操作,始终会使CY=sendbyte^7;
   SDA=CY;
   SCL=1;
   }
SCL=0;
}

//----------------------从IIC总线上读数据子程序----------/
unsigned char IICReceiveByte(void)
{
register receivebyte,i=8;
SCL=0;
while(i--)
   {
   SCL=1;
   receivebyte=(receivebyte<<1)|SDA;
   SCL=0;
   }
return(receivebyte);
}

//---------------一个简单延时程序------------------------/
void Delay(unsigned char DelayCount)
{
while(DelayCount--);
}


//---------------------A/D PCF8591  operation --------------

//waddr:0x0000~0x02F1	   RAM Adress
//buf_data:	0x0000~0xffff  RAM DATA
//num:data number

#define	PCF8591_WRITE	0x92
#define	PCF8591_READ 	0x93
void WritePCF8591(unsigned char controlbyte,unsigned char wdata)
{
	IICStart();
	IICSendByte(PCF8591_WRITE);	//SLAVE
	IICRecAck();
	IICSendByte(controlbyte&0x77);	//Control byte
	IICRecAck();
	IICSendByte(wdata);	//data byte
	IICRecAck();
	IICStop();
	Delay(255);
	Delay(255);
	Delay(255);
	Delay(255);	
}

//wdata:data buffer of AD convert
//num: valid data buffer count
//
void ReadPCF8591(unsigned char *wdata,unsigned char num)
{
	IICStart();
	IICSendByte(PCF8591_READ);	//SLAVE
	IICRecAck();
	while(--num)
	{
		*wdata++=IICReceiveByte();
		IICACK();
	}
	*DataBuff=IICReceiveByte();        //read last byte data
	IICNoAck();
	IICStop();
}

//---------------------END A/D PCF8591  operation --------------

unsigned char buf[10];
main()
{
	MCU_Init();
	Val_Init();
	while(1)
	{
		WritePCF8591(PCF8591_WRITE,0x80);
		WritePCF8591(buf,4);
	}
}





//--------------------------------------------
//T0 Interrupt Time is 1ms
//#define TF0_VECTOR	1  /* 0x0B Timer 0 */
//
Timer0Interrupt(void) interrupt TF0_VECTOR using 3
{
	TH0 = 0xFC;
	TL0 = 0x66;
	sys_ms_count++;
}


//-------------------------------------------
//#define UART_VECTOR	4  /* 0x23 UART */
SIOInterrupt(void) interrupt UART_VECTOR using 2
{
	if(RI)
	{
		RI=0;
	}
	if(TI)TI=0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -