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

📄 iic.c

📁 STC51系列单片机通过vk3x系列芯片扩展串口的源码
💻 C
字号:
#include "stc51reg.h"
#include <intrins.h>


extern void delay (unsigned int delaydata);
//************************************************************
void config()
{
	WDT_CONTR = 0x00;	// Watchdog Timer Control Register

}
//初始化单片机,
//***********************************************************
//***********************************************************
unsigned char send(unsigned char _data1,unsigned char _data2,unsigned char _data3)
{	
    unsigned char i;
	clk=1; // start
    	delay(1);
	sda=0;
		delay(1);
	clk=0;
		delay(1);
	i=0;

   if(_data1&0x80)
	{
		sda=1;
	}
	else sda=0;
		delay(1);
	clk=1;
		delay(1);
	clk=0;
		delay(1);

   if(_data1&0x40)
	{
		sda=1;
	}
	else sda=0;
		delay(1);
	clk=1;
		delay(1);

	clk=0;
		delay(1);

   if(_data1&0x20)
	{
		sda=1;
	}
	else sda=0;
		delay(1);
	clk=1;
		delay(1);

	clk=0;
		delay(1);



   if(_data1&0x10)
	{
		sda=1;
	}
	else sda=0;
		delay(1);
	clk=1;
		delay(1);

	clk=0;
		delay(1);

   if(_data1&0x08)
	{
		sda=1;
	}
	else sda=0;
		delay(1);
	clk=1;
		delay(1);

	clk=0;
		delay(1);

   if(_data1&0x04)
	{
		sda=1;
	}
	else sda=0;
		delay(1);
	clk=1;
		delay(1);

	clk=0;
		delay(1);

   if(_data1&0x02)
	{
		sda=1;
	}
	else sda=0;
		delay(1);
	clk=1;
		delay(1);

    clk=0;
		delay(1);

   if(_data1&0x01)
		sda=1;
	else 	
	  sda=0;
		delay(1);		
	clk=1;
		delay(1);
	clk=0;
		delay(1);


	clk=1; //ack
		delay(1);
	clk=0;
		delay(1);


   if(_data2&0x80)
	{
		sda=1;
	}
	else sda=0;
		delay(1);
	clk=1;
		delay(1);
	clk=0;
		delay(1);


   if(_data2&0x40)
	{
		sda=1;
	}
	else sda=0;
		delay(1);
	clk=1;
		delay(1);
	clk=0;
		delay(1);


   if(_data2&0x20)
	{
		sda=1;
	}
	else sda=0;
		delay(1);
	clk=1;
		delay(1);
	clk=0;
		delay(1);


   if(_data2&0x10)
	{
		sda=1;
	}
	else sda=0;
		delay(1);
	clk=1;
		delay(1);
	clk=0;
		delay(1);

   if(_data2&0x08)
	{
		sda=1;
	}
	else sda=0;
		delay(1);
	clk=1;
		delay(1);
	clk=0;
		delay(1);

   if(_data2&0x04)
	{
		sda=1;
	}
	else sda=0;
		delay(1);
	clk=1;
		delay(1);
	clk=0;
		delay(1);

   if(_data2&0x02)
	{
		sda=1;
	}
	else sda=0;
		delay(1);
	clk=1;
		delay(1);
    clk=0;
		delay(1);


   if(_data2&0x01)
		sda=1;
	else sda=0;
		delay(1);
	clk=1;
		delay(1);
	clk=0;
		delay(1);


	clk=1; //ack
		delay(1);
	clk=0;
		delay(1); 



  if(!(_data1&0x01))
	 {
	  if(_data3&0x80)
			sda=1;
	    else sda=0;
		delay(1);
		clk=1;
		delay(1);
		clk=0;	
		delay(1);

	  if(_data3&0x40)
			sda=1;
		else sda=0;
		delay(1);
		clk=1;
		delay(1);
		clk=0;	
		delay(1);
		
	  if(_data3&0x20)
			sda=1;
		else sda=0;
		delay(1);
		clk=1;
		delay(1);
		clk=0;	
		delay(1);
		
	  if(_data3&0x10)
			sda=1;
		else sda=0;
		delay(1);
		clk=1;
		delay(1);
		clk=0;	
		delay(1);
		
	  if(_data3&0x08)
			sda=1;
		else sda=0;
		delay(1);
		clk=1;
		delay(1);
		clk=0;	
		delay(1);
		
	  if(_data3&0x04)
			sda=1;
		else sda=0;
		delay(1);
		clk=1;
		delay(1);
		clk=0;	
		delay(1);
		
	  if(_data3&0x02)
			sda=1;
		else sda=0;
		delay(1);
		clk=1;
		delay(1);
		clk=0;	
		delay(1);
		
	  if(_data3&0x01)
			sda=1;
		else sda=0;
		delay(1);
		clk=1;
		delay(1);
		clk=0;	
		delay(1);
	

		clk=1; //ack
		delay(1);
		clk=0;

		delay(1);
        sda=0;//stop bit
		delay(1);	
		clk=1;
		delay(1);
		sda=1;
	 }
  else
    {
		clk=1;
		delay(1);
		if(sda)
			i=i+128;
		clk=0;
		delay(1);		
		clk=1;
		delay(1);
		if(sda)
			i=i+64;
		clk=0;
		delay(1);		
		clk=1;
		delay(1);
		if(sda)
			i=i+32;
		clk=0;
		delay(1);		
		clk=1;
		delay(1);
		if(sda)
			i=i+16;
		clk=0;
		delay(1);		
		clk=1;
		delay(1);
		if(sda)
			i=i+8;
		clk=0;
		delay(1);		
		clk=1;
		delay(1);
		if(sda)
			i=i+4;
		clk=0;
		delay(1);		
		clk=1;
		delay(1);
		if(sda)
			i=i+2;
		clk=0;
		delay(1);		
		clk=1;
		delay(1);
		if(sda)
			i=i+1;
		clk=0;
		delay(1);	
	


        sda=0;
		delay(1);
		clk=1; //ack
		delay(1);
		clk=0;

		delay(1);
        sda=0;//stop bit
		delay(1);	
		clk=1;
		delay(1);
		sda=1;
   }
	return i;
}
//模拟SPI时序,data1,data2是写入的两个数据,这里仅返回第二个数据
//*************************************************************************

//*************************************************************************
void write_reg(unsigned char port,unsigned char reg,unsigned char dat)
{	
	send(0x90,(((port-1)<<4)+reg),dat);
}
//写寄存器,port为子串口的路数,reg为寄存器的地址,dat为写入寄存器的数据
//*************************************************************************

//*************************************************************************
unsigned char read_reg(unsigned char port,unsigned char reg)
{
	return send(0x91,(((port-1)<<4)+reg),0x00);
}
//读寄存器,琾ort为子串口的路数,reg为寄存器的地址,返回寄存器的值
//***************************************************************************

⌨️ 快捷键说明

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