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

/***************************************************************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#endifAT24C02 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)。数字信号输出。#endifADXL345 加速度传感器函数头文件(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();//函数编写的返回值为结构体,调用见示例#endifBMP085 气压传感器函数头文件(ZL_BMP085.h)生气是拿别人做错的事来惩罚自己

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

相关文章:

你感兴趣的文章:

标签云: