资源下载(CSDN):http://download.csdn.net/download/zhlechn/5868923
/***************************************************************
IIC 通信函数
说明:此函数为模拟 IIC 函数,用在 IIC 器件的读写上,如 AT24C02,PCF8591等
示例:
见AT24C02
附注:都是自己一个一个打的,不足或错误之处还请联系我进行更正,谢谢!
E-mail : [email protected]
后续更新中....
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 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 : [email protected]
后续更新中...
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函数
说明: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 : [email protected]
后续更新中....
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 加速度传感器函数
说明:此传感器是 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 : [email protected]
后续更新中....
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 气压传感器函数
说明:此传感器是 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 : [email protected]
后续更新中...
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 角速度传感器函数
说明:此传感器是 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 : [email protected]
后续更新中....
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 磁场传感器函数
说明:此传感器是 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 : [email protected]
后续更新中....
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