很全的C51库函数(IIC类)(IIC、EEPROM、ADXL、PCF、HMC、L3G、BMP)

组织结构树:



资源下载(CSDN)http://download.csdn.net/download/zhlechn/5868923


IIC 通信函数头文件(ZL_IIC.h)

/***************************************************************

						IIC 通信函数

	说明:此函数为模拟 IIC 函数,用在 IIC 器件的读写上,如 AT24C02,PCF8591等
		  
		  
	示例:
		   见AT24C02
		
		
		
	附注:都是自己一个一个打的,不足或错误之处还请联系我进行更正,谢谢!
		  E-mail : zhlechn@qq.com
		  
		  后续更新中....
		  
		  
											2013  By  赵磊
																	
******************************************************************/


#ifndef _ZL_IIC_H_
#define _ZL_IIC_H_

#define NOP_IIC  _nop_();_nop_();_nop_();_nop_();\
				 _nop_();_nop_();_nop_();_nop_();\
				 _nop_();_nop_();_nop_();_nop_();\
				 _nop_();_nop_();_nop_();_nop_();\
				 _nop_();_nop_();_nop_();_nop_();\
				 _nop_();_nop_();_nop_();_nop_();\
				 _nop_();_nop_();_nop_();_nop_();\
				 _nop_();_nop_();_nop_();_nop_()		//延时大于4微秒,由于 IIC 对时序的严格限制,不同单片机,可能需要更改,否则可能传送错误数据或者不传送


extern void init_IIC(PORTx SDA, PORTx SCL);				//初始化 IIC ,包括IO

extern void start_IIC();								//开始 IIC

extern void stop_IIC();									//停止 IIC

extern void ans_IIC();									//应答 IIC

extern void no_ans_IIC();								//非应答 IIC

extern void write_IIC(uc dat);							//写 IIC

extern uc read_IIC();									//读 IIC


#endif


AT24C02 EEPROM函数头文件(ZL_AT24C02.h)

/***************************************************************

						AT24C02 ROM函数

	说明:AT24C02的芯片地址为1010.寻址格式为:1 0 1 0 A2 A1 A0 R/W。
          A2/A1/A0电平状态可由电路控制或者单片机控制,我的开发板EM3接的都为
	      GND,所以为000。当为写时为0;读为1.(所以发送为0xa0,接收为0xa1) 
		  
		  
	示例:
	
		
		#define C51MCU
		#include "C51MCU.h"
		#include "ZL_AT24C02.h"
		
		static void delay(ui time)
		{
			uc z;
			for(time;time>0;time--)
				for(z=110;z>0;z--);
		}
		
		void main()
		{
			init_ROM(P20, P21);
			do
			{
				write_ROM(0xa0,3,0x0f);
				delay(10);
				write_ROM(0xa0,4,0xf0);
				delay(50);
				P0=read_ROM(0xa1,3);
				delay(2000);
				P0=read_ROM(0xa1,4);
				delay(2000);
			}while(1);			   
		}
		
		
		
		
	IIC 使用示例:
	
		
		uc read_ROM(uc addr0,uc addr1)
		{
			uc temp;
			start_IIC();
			write_IIC(addr0-1);					
			write_IIC(addr1);
			start_IIC();					  
			write_IIC(addr0);
			temp=read_IIC();
			stop_IIC();
			return temp;
		}
		
		
		
	附注:都是自己一个一个打的,不足或错误之处还请联系我进行更正,谢谢!
		  E-mail : zhlechn@qq.com
		  
		  后续更新中...
		  
		  
											2013  By  赵磊
																	
******************************************************************/


#ifndef _ZL_AT24C02_H_
#define _ZL_AT24C02_H_

extern void init_ROM(PORTx SDA, PORTx SCL);

extern void write_ROM(uc addr0,uc addr1,uc dat);			//将 dat 写入器件地址为 addr0 的器件中,且写在该器件内部地址为 addr1 中

extern uc read_ROM(uc addr0,uc addr1);						//从器件地址为 addr0 的器件中读取数据并返回,且从该器件内部地址为 addr1 开始读


#endif









PCF8591 AD/DA函数头文件(ZL_PCF8591.h)

/***************************************************************

						PCF8591 AD/DA函数

	说明:PCF8591是具有IIC的8位AD/DA转换器(MAX=2^8=256),有4路AD,一路DA。

		【PCF8591的寻址】为 1 0 0 1 A0 A1 A2 R/W (A0/A1/A2已接地,写为低电平有效)
		
		【控制字节】用于实现器件的功能。
		D7 D6 D6 D5 D4 D3 D2 D1 D0
		0  *  *  *  *  *  *  *  *
		D1/D0为通道选择:00为通道0;01为通道1;10为通道2;11为通道3;
		D2为自动增益选择(有效位为1)
		D5/D4为模拟量输入选择:00为四路单数输入;01为三路差分输入;
								10为单端与差分配合输入;
								11为模拟输出允许有效;
		D6=1.
		
		  
		  
	示例:
	
		
		#define C51MCU
		#include "C51MCU.h"
		#include "ZL_1602.h"
		#include "ZL_PCF8591.h"


		void main()
		{
			ui voltage;
			uc AIN0;
			code uc phr1[]="ADC: ";
			code uc phr2[]="Vol: ";
			code uc phr3[]="mV";
			
			init_1602_IO(P26,P25,P27,PORT0);
			init_1602(0x38,0x0c,0x06,0x01);						//初始化1602
			init_PCF(P20, P21);
			
			w_order(0x01);										//清屏
			dis1602_str2(0x00,phr1,50);
			dis1602_str2(0x40,phr2,50);
			dis1602_str2(0x4b,phr3,50);
			while(1)
			{
				AIN0=ADC_PCF(0x40,0);						   //将ADC通道0转换出来的数字信号
				dis1602_var(0x05,"%d",AIN0);
				DAC_PCF(AIN0);						   		   //重新输入DAC变为模拟信号,控制灯亮度
				voltage=((float)(AIN0)/255)*5000;
				dis1602_var(0x45,"%d",voltage);
			}						   
		}


		
	附注:都是自己一个一个打的,不足或错误之处还请联系我进行更正,谢谢!
		  E-mail : zhlechn@qq.com
		  
		  后续更新中....
		  
		  
											2013  By  赵磊
																	
******************************************************************/


#ifndef _ZL_PCF8591_H_
#define _ZL_PCF8591_H_

extern void init_PCF(PORTx SDA, PORTx SCL);						

extern uc ADC_PCF(uc control,uc channel);							//control:控制字节(包含器件地址)(见上)(取0x40); channel:通道选择

extern void DAC_PCF(uc digital);


/内部函数,不需使用///

extern void DAC_8591(uc addr,uc control,uc digital);			//addr:器件寻址;control:控制字节;digital:数字信号输入

extern void w_ADC_PCF(uc addr,uc control);			   			//addr:器件寻址;control:控制字节;

extern uc r_ADC_PCF(uc addr);						   			//addr:器件寻址(为读,1)。数字信号输出。


#endif

ADXL345 加速度传感器函数头文件(ZL_ADXL345.h)

/***************************************************************

					ADXL345 加速度传感器函数

	说明:此传感器是 IIC 通信的,加速度信号是数字信号,即由 IIC 直接
		  读取。 其为三轴加速度传感器,为方便调用,我使用了结构体。
		  
		  
	示例:
	
		
		#define C51MCU
		#include "C51MCU.h"
		#include "ZL_UART.h"						
		#include "ZL_ADXL345.h"
		
		void main()
		{
			init_UART(12.0,4800);		//即波特率4800、数据位8、停止位1。效验位无 (12M晶振下)
			init_ADXL345(P20, P21, 0xa6);

			while(1)
			{
				send_phrase("初始值=",100);
				send_int(ADX_count().judge);
				send_phrase("     ",10);
				send_phrase("加速度X=",100);
				send_float(ADX_count().x);
				send_phrase("     ",10);
				send_phrase("加速度Y=",100);
				send_float(ADX_count().y);
				send_phrase("     ",10);
				send_phrase("加速度Z=",100);
				send_float(ADX_count().z);
				send_char('\n');
				send_char('\n');
			}

		}
		
		
		
	附注:都是自己一个一个打的,不足或错误之处还请联系我进行更正,谢谢!
		  E-mail : zhlechn@qq.com
		  
		  后续更新中....
		  
		  
											2013  By  赵磊
																	
******************************************************************/


#ifndef _ZL_ADXL345_H_
#define _ZL_ADXL345_H_

typedef	struct adx
{
	float x;											//x分量
	float y;											//y分量
	float z;											//z分量
	uc judge;											//判断输出值的正确性
}ADX;


extern void init_ADXL345(PORTx SDA, PORTx SCL, uc addr0);//初始化 ADXL345  , addr0: 器件地址,同 AT24C02 的 addr0,  对于九轴传感器来说,addr0 为 0xa6

extern ADX ADX_count();										//函数编写的返回值为结构体,调用见示例

#endif


BMP085 气压传感器函数头文件(ZL_BMP085.h)

/***************************************************************

					BMP085 气压传感器函数

	说明:此传感器是 IIC 通信的,气压和温度信号是数字信号,即由 IIC 直接
		  读取。 由 IIC 可读出气压和温度,为方便调用,我使用了结构体。
		  其和ADXL345差不多,其它注释见ADXL345。
		  
		  
	示例:
	
		
		#define C51MCU
		#include "C51MCU.h"
		#include "ZL_UART.h"						
		#include "ZL_BMP085.h"
		
		void main()
		{
			init_UART(12.0,4800);		//即波特率4800、数据位8、停止位1。效验位无 (12M晶振下)
			init_BMP085(P20, P21, 0xee);

			while(1)
			{
				send_phrase("温度值=",100);
				send_float((BMP_count().temperature)*0.093388);
				send_phrase("     ",10);
				send_phrase("压强=",100);
				send_float((BMP_count().pressure)/1000.0);
				send_phrase("kPa",10);
				send_char('\n');
				send_char('\n');
			}

		}
		
		
		
	附注:都是自己一个一个打的,不足或错误之处还请联系我进行更正,谢谢!
		  E-mail : zhlechn@qq.com
		  
		  后续更新中...
		  
		  
											2013  By  赵磊
																	
******************************************************************/

#ifndef _ZL_BMP085_H_
#define _ZL_BMP085_H_

typedef	struct bmp
{
	long pressure;
	long temperature;
}BMP;


extern void init_BMP085(PORTx SDA, PORTx SCL, uc addr0);						//addr0默认值为 0xee . 其它注释同 ADXL345

extern BMP BMP_count();

#endif

ADXL345 角速度传感器函数头文件(ZL_L3G4200D.h)

/***************************************************************

					ADXL345 角速度传感器函数

	说明:此传感器是 IIC 通信的,角速度信号是数字信号,即由 IIC 直接
		  读取。 其为三轴加速度传感器,为方便调用,我使用了结构体。
		  其和ADXL345差不多,其它注释见ADXL345。
		  
		  
	示例:
	
		
		#define C51MCU
		#include "C51MCU.h"
		#include "ZL_UART.h"						
		#include "ZL_L3G4200D.h"
		
		void main()
		{
			init_UART(12.0,4800);		//即波特率4800、数据位8、停止位1。效验位无 (12M晶振下)
			init_L3G4200D(P20, P21, 0xd2);

			while(1)
			{
				send_phrase("温度值=",100);								//此温度并不是外界温度,是防止出现漂移设而设的内部温度传感器数据
				send_float((L3G_count().temperature)*2.6875);
				send_phrase("   ",10);
				send_phrase("角速度X=",100);
				send_float(L3G_count().x);
				send_phrase("   ",10);
				send_phrase("角速度Y=",100);
				send_float(L3G_count().y);
				send_phrase("   ",10);
				send_phrase("角速度Z=",100);
				send_float(L3G_count().z);
				send_char('\n');
				send_char('\n');
			}

		}
		
		
		
	附注:都是自己一个一个打的,不足或错误之处还请联系我进行更正,谢谢!
		  E-mail : zhlechn@qq.com
		  
		  后续更新中....
		  
		  
											2013  By  赵磊
																	
******************************************************************/


#ifndef _ZL_L3G4200D_H_
#define _ZL_L3G4200D_H_

typedef	struct l3g
{
	float x;
	float y;
	float z;
	uc temperature;
}L3G;

extern void init_L3G4200D(PORTx SDA, PORTx SCL, uc addr0);						//addr0默认值为 0xd2 . 其它注释同 ADXL345

extern L3G L3G_count();

#endif

HMC5883L 磁场传感器函数头文件(ZL_HMC5883L.h)

/***************************************************************

					HMC5883L 磁场传感器函数

	说明:此传感器是 IIC 通信的,磁感应强度信号是数字信号,即由 IIC 直接
		  读取。 其为三轴磁感应强度传感器,为方便调用,我使用了结构体,
		  其和ADXL345差不多,其它注释见ADXL345。
		  
		  
	示例:
	
		
		#define C51MCU
		#include "C51MCU.h"
		#include "ZL_UART.h"						
		#include "ZL_HMC5883L.h"
		
		void main()
		{
			init_UART(12.0,4800);		//即波特率4800、数据位8、停止位1。效验位无 (12M晶振下)
			init_HMC5883L(P20, P21, 0x3c);

			while(1)
			{
				send_phrase("磁场倾角=",100);
				send_float(HMC_count().angle);
				send_phrase("   ",10);
				send_phrase("磁倾角X=",100);
				send_float(HMC_count().x);
				send_phrase("   ",10);
				send_phrase("磁倾角Y=",100);
				send_float(HMC_count().y);
				send_phrase("   ",10);
				send_phrase("磁倾角Z=",100);
				send_float(HMC_count().z);
				send_char('\n');
				send_char('\n');
			}

		}
		
		
		
	附注:都是自己一个一个打的,不足或错误之处还请联系我进行更正,谢谢!
		  E-mail : zhlechn@qq.com
		  
		  后续更新中....
		  
		  
											2013  By  赵磊
																	
******************************************************************/

#ifndef _ZL_HMC5883L_H_
#define _ZL_HMC5883L_H_

typedef	struct hmc
{
	int x;
	int y;
	int z;
	double angle;
}HMC;


extern void init_HMC5883L(PORTx SDA, PORTx SCL, uc addr0);						//addr0默认值为 0x3c . 其它注释同 ADXL345

extern HMC HMC_count();

#endif


其它,见下一篇和上一篇。。。

注:*.c文件后续发布









  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值