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

来源:互联网 发布:数据录入员工资 编辑:程序博客网 时间:2024/05/31 19:35

组织结构树:



资源下载(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 ,包括IOextern void start_IIC();//开始 IICextern void stop_IIC();//停止 IICextern void ans_IIC();//应答 IICextern void no_ans_IIC();//非应答 IICextern void write_IIC(uc dat);//写 IICextern 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 D00  *  *  *  *  *  *  *  *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);//初始化1602init_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_typedefstruct 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 为 0xa6extern 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_typedefstruct bmp{long pressure;long temperature;}BMP;extern void init_BMP085(PORTx SDA, PORTx SCL, uc addr0);//addr0默认值为 0xee . 其它注释同 ADXL345extern 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_typedefstruct l3g{float x;float y;float z;uc temperature;}L3G;extern void init_L3G4200D(PORTx SDA, PORTx SCL, uc addr0);//addr0默认值为 0xd2 . 其它注释同 ADXL345extern 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_typedefstruct hmc{int x;int y;int z;double angle;}HMC;extern void init_HMC5883L(PORTx SDA, PORTx SCL, uc addr0);//addr0默认值为 0x3c . 其它注释同 ADXL345extern HMC HMC_count();#endif


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

注:*.c文件后续发布









原创粉丝点击