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

📄 seeprom.c

📁 STC12C5412AD做的温度检测控制的源程序.有AD检测,可控硅过零触发,PID算法.
💻 C
字号:
#include"Globle.h"

sbit SDA=P2^3;          							//数据
sbit SCL=P2^2;          							//时钟
#define IIC_READ 0XA1    						//读指令
#define IIC_WRITE 0XA0   						//写指令

//sbit SDA=P2^1;          							//数据
//sbit SCL=P2^2;          							//时钟
unsigned char bdata bbyte;     					//定义位操作用数组,采用此方法可提高位操作速度
 UBYTE eep_ack_f=0;
sbit a0=bbyte^0;
sbit a1=bbyte^1;
sbit a2=bbyte^2;
sbit a3=bbyte^3;
sbit a4=bbyte^4;
sbit a5=bbyte^5;
sbit a6=bbyte^6;
sbit a7=bbyte^7;
sbit bit7=bbyte^7;
sbit bit0=bbyte^0;
bit  IFACK;	//应答标志 
bit  NO_ACK;	//无应答
//sbit Disp=P0^1;       //数据
//sbit CLK=P0^0;       //时钟信号 
UBYTE seep_err_time;
#define seep_err_time_limit	5
void delay1()
{
	unsigned int m=25000;
	while(--m);

}
//unsigned char bdata DISP_duan;
//sbit bt7=DISP_duan^7;
/*-------------------------------------
   函数: void start();
   功能: 开始;
--------------------------------------*/

void start(void)   
{
	SDA=1;SCL=1;NOP;NOP;NOP;NOP;SDA=0;NOP;NOP;NOP;NOP;SCL=0;
}
/*-------------------------------------
   函数: void stop();
   功能: 停止;
--------------------------------------*/

void stop(void)   
{
	SDA=0;NOP;NOP;NOP;NOP;SCL=1;NOP;NOP;NOP;NOP;SDA=1;NOP;NOP;NOP;NOP;SCL=0;
}
/*-------------------------------------
   函数: void ack();
   功能: 主器件产生应答;
--------------------------------------*/

void Ack(void)  
{
	SCL=0;SDA=0;SCL=1;SCL=0;
}
/*-------------------------------------
   函数: void nack(uchar type);
   功能: 释放数据线后去接收一个应答信号或则是无应答信号;
         type=1等待应答信号
         type=0 产生无应答信号
--------------------------------------*/
void nack(unsigned char type)
{
	SCL=0;SDA=1;NOP;NOP;NOP;NOP;SCL=1;NOP;NOP;NOP;NOP;NOP;IFACK=SDA; SCL=0;
	if(type)
	{    
     //   IFACK=0;//
		if(IFACK)//如果无应答信号,则置标志位NO_ACK,程序中止
		{	
			NO_ACK=1;
			//while(1);
		}
		//else NO_ACK=0;
	}
}
/*-------------------------------------
   函数: void inbyte(void);
   功能: 从IIC器件中读出一个字节的数据;
--------------------------------------*/
unsigned char  inbyte(void) {
	SDA=1;
	SCL=1;a7=SDA;NOP;NOP;NOP;NOP;SCL=0;NOP;NOP;NOP;NOP;  //高低电平保持时间4us
	SCL=1;a6=SDA;NOP;NOP;NOP;NOP;SCL=0;NOP;NOP;NOP;NOP;
	SCL=1;a5=SDA;NOP;NOP;NOP;NOP;SCL=0;NOP;NOP;NOP;NOP;
	SCL=1;a4=SDA;NOP;NOP;NOP;NOP;SCL=0;NOP;NOP;NOP;NOP;
	SCL=1;a3=SDA;NOP;NOP;NOP;NOP;SCL=0;NOP;NOP;NOP;NOP;
	SCL=1;a2=SDA;NOP;NOP;NOP;NOP;SCL=0;NOP;NOP;NOP;NOP;
	SCL=1;a1=SDA;NOP;NOP;NOP;NOP;SCL=0;NOP;NOP;NOP;NOP;
	SCL=1;a0=SDA;NOP;NOP;NOP;NOP;SCL=0;NOP;NOP;NOP;NOP;
	return(bbyte);
}
/*-------------------------------------
   函数: void inbyte(void);
   功能: 将一个字节的数据写放到IIC器件
--------------------------------------*/
 
void outbyte(unsigned char outdata) {
	bbyte=outdata;
	SDA=a7;NOP;NOP;NOP;NOP;SCL=1;NOP;NOP;NOP;NOP;SCL=0;
	SDA=a6;NOP;NOP;NOP;NOP;SCL=1;NOP;NOP;NOP;NOP;SCL=0;
	SDA=a5;NOP;NOP;NOP;NOP;SCL=1;NOP;NOP;NOP;NOP;SCL=0;
	SDA=a4;NOP;NOP;NOP;NOP;SCL=1;NOP;NOP;NOP;NOP;SCL=0;
	SDA=a3;NOP;NOP;NOP;NOP;SCL=1;NOP;NOP;NOP;NOP;SCL=0;
	SDA=a2;NOP;NOP;NOP;NOP;SCL=1;NOP;NOP;NOP;NOP;SCL=0;
	SDA=a1;NOP;NOP;NOP;NOP;SCL=1;NOP;NOP;NOP;NOP;SCL=0;
	SDA=a0;NOP;NOP;NOP;NOP;SCL=1;NOP;NOP;NOP;NOP;SCL=0;
}
void read_f (unsigned int add)					//读数据初始化
{
	unsigned char temp,tempr;		
	temp=IIC_WRITE;
	tempr=IIC_READ;
	if(add>>8){temp|=0x02;tempr|=0x02;}
	start();									//开始信号
	outbyte(temp);							//写命令
	nack(1);									//等待应答
	outbyte((unsigned char)add);				//写地址
	nack(1);									//等待应答
	start();									//开始信号
	outbyte(tempr);							//读命令
	nack(1);									//等待应答
}
/*--------------------------------------------------*/
void write_f(unsigned int add)					//写初始化
{
	unsigned char temp;
	temp=IIC_WRITE;  
	if(add>>8){temp|=0x0002;}
	start(); 									//开始信号
	outbyte(temp);							//写命令
	nack(1);									//等待应答
	outbyte((unsigned char)add);				//写地址
	nack(1);									//等待应答
}
/*-------------------------------------
   函数: uchar readbyte (uint add)//add为读地址
         uint read_int(uint add)
         ulong read_long(uint add)
   功能: 读数据
--------------------------------------*/
unsigned char read_byte (unsigned int add)  		//读一个字节的数据
{
    unsigned char temp,i;
	for(i=seep_err_time_limit;i>=1;i--)
		{
			NO_ACK=0;
		    	read_f (add);
			temp=inbyte();					//读数据
			nack(0);							//无应答
			stop();							//停止信号
			if(!NO_ACK) break;
		}
	if(!i)     eep_ack_f=1;   
			return(temp);
		
}
/*-------------------------------*/
unsigned int read_int(unsigned int add)  			//读整形数据ok
{
     WordType dt;
	dt.bytes.bh=read_byte(add);
	delay1();
     dt.bytes.bl=read_byte(add+1);
     nack(0);
     stop();
     return(dt.wd);	
}
/*-------------------------------------------------*/
#if 0
 unsigned long read_long(unsigned int add)  		//读长整形数据
{
	
    Longtype	ln_tmp;
	read_f (add);
	ln_tmp.words.wd1.bytes.bh=inbyte();
    Ack();  
    ln_tmp.words.wd1.bytes.bl=inbyte();
    Ack(); 
    ln_tmp.words.wd0.bytes.bh=inbyte();
    Ack(); 
    ln_tmp.words.wd0.bytes.bl=inbyte();
    nack(0); 
	stop();
    return(ln_tmp.lwd);	
}
#endif
/*-----------------------------------------------------*/

/*-------------------------------------
   函数: void writebyte(uint add,uchar wbyte);
   功能: 写数据;  add为写入地址;wbyte为写入数据
--------------------------------------*/
#if 0
void write_byte(unsigned int add,unsigned char wbyte)	//写一个字节数据
{
	UBYTE i;
	for(i=seep_err_time_limit;i>=1;i--)
		{
		NO_ACK=0;
		write_f(add);
		outbyte(wbyte);									//写数据
		nack(1);	
		if(!NO_ACK) break;
		}//等待应答
	if(!i)     eep_ack_f=1;   
			
}									//等待应答

#endif
/*-------------------------------------------------*/
void write_int(unsigned int add,unsigned int wint)			//写整形
{   
    WordType dt;
    write_f(add);
	dt.wd=wint; 
    outbyte(dt.bytes.bh);
    nack(1);
    outbyte(dt.bytes.bl);
    nack(1);
    stop();
}
#if 0
void save_int(unsigned int add,unsigned int indata)		//保存整形
{
   write_int(add,indata);
}
#endif
/*----------------------------------------------------*/
#if 0
void save_long(unsigned int add,unsigned long wlong)  	//写长整形
{
   Longtype	ln_tmp;
   ln_tmp.lwd=wlong;
   write_f(add);
   outbyte(ln_tmp.words.wd1.bytes.bh);
   nack(1);
   outbyte(ln_tmp.words.wd1.bytes.bl);
   nack(1);
   outbyte(ln_tmp.words.wd0.bytes.bh);
   nack(1);
   outbyte(ln_tmp.words.wd0.bytes.bl);
   nack(1);
   stop();


}
#endif

⌨️ 快捷键说明

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