📄 iic-tune.c
字号:
#include<reg51.h>
#include<intrins.h>
#include <stdio.h>
#define DEBUG 1
#define uchar unsigned char
#define uint unsigned int
sbit sdat=P2^1;
sbit sclt=P2^2;
sbit ac0=ACC^0; /*定义ACC的位,利用ACC操作速度最快*/
sbit ac1=ACC^1;
sbit ac2=ACC^2;
sbit ac3=ACC^3;
sbit ac4=ACC^4;
sbit ac5=ACC^5;
sbit ac6=ACC^6;
sbit ac7=ACC^7;
extern void delay1(unsigned int i);
extern void delay0();
void i2c_start_t(void); /*起始*/
void i2c_stop_t(void); /*停止*/
bit wait_ack_t(void); /*等待24c02应答*/
//void send_ack(void); /*向24c02发送应答*/
void sendnot_ack_t(void); /*向24c02发送非应答*/
void i2c_sendbyte_t(uchar ch);/*写发送移位*/
unsigned char i2c_readbyte_t(void); /*读移位*/
unsigned char i2c_read_a(unsigned char slave,
unsigned char address);//单字节读
bit i2c_write_a(unsigned char slave,uchar address,
unsigned char fb[],unsigned char sun);//多字节写
bit i2c_write_b(unsigned char slave, uchar address, unsigned char fb);
void write_b(unsigned char slave, unsigned char address, unsigned char fb);
void write_a(unsigned char slave,unsigned char address,
unsigned char fb[],unsigned char sun);
void i2c_start_t(void)
{
sclt=1;
sdat=1;
delay0();
sclt=1;
delay0();
sdat=0;
delay0();
sclt=0;
delay0();
}
void i2c_stop_t(void)
{
sclt=0;
_nop_();
sdat=0;
delay0();
sclt=1;
delay0();
sdat=1;
delay0();
// sclt=0;
// sdat=0;
}
bit wait_ack_t(void)
{
uchar i;
sclt=0;
_nop_();
_nop_();
sdat=1;
delay0();
sclt=1;
delay0();
while(sdat)
{
for(i=0;i<=5;i++)
{
if(!sdat)
{
sclt=0;
return(0);
}
}
return(1);
}
sclt=0;
return(0);
}
/*
void send_ack(void)
{
sdat=0;
delay0();
sclt=1;
delay0();
sclt=0;
}
*/
void sendnot_ack_t(void)
{
sdat=1;
delay0();
sclt=1;
delay0();
sclt=0;
}
void i2c_sendbyte_t(uchar ch)
{
ACC=ch;
sdat=ac7;_nop_();sclt=1;delay0();sclt=0;delay0();
sdat=ac6;_nop_();sclt=1;delay0();sclt=0;delay0();
sdat=ac5;_nop_();sclt=1;delay0();sclt=0;delay0();
sdat=ac4;_nop_();sclt=1;delay0();sclt=0;delay0();
sdat=ac3;_nop_();sclt=1;delay0();sclt=0;delay0();
sdat=ac2;_nop_();sclt=1;delay0();sclt=0;delay0();
sdat=ac1;_nop_();sclt=1;delay0();sclt=0;delay0();
sdat=ac0;_nop_();sclt=1;delay0();sclt=0;delay0();
}
unsigned char i2c_readbyte_t(void)
{
uchar sf;
sdat=1;_nop_();_nop_();
sclt=1;delay0();ac7=sdat;sclt=0;delay0();
sclt=1;delay0();ac6=sdat;sclt=0;delay0();
sclt=1;delay0();ac5=sdat;sclt=0;delay0();
sclt=1;delay0();ac4=sdat;sclt=0;delay0();
sclt=1;delay0();ac3=sdat;sclt=0;delay0();
sclt=1;delay0();ac2=sdat;sclt=0;delay0();
sclt=1;delay0();ac1=sdat;sclt=0;delay0();
sclt=1;delay0();ac0=sdat;sclt=0;delay0();
sf=ACC;
return(sf);
}
unsigned char i2c_read_a(unsigned char slave,
unsigned char address)//单字节读
{
unsigned char dd=slave&0xfe;//写
unsigned char dc=slave|0x01;//读
unsigned char ae;
delay1(2000);
i2c_start_t();
i2c_sendbyte_t(dd);
if(wait_ack_t())
{
i2c_stop_t();
return(0);
}
i2c_sendbyte_t(address);
if(wait_ack_t())
{
i2c_stop_t();
return(0);
}
i2c_stop_t();
delay1(300);
i2c_start_t();
i2c_sendbyte_t(dc);
if(wait_ack_t())
{
i2c_stop_t();
return(0);
}
ae=i2c_readbyte_t();
sendnot_ack_t();
i2c_stop_t();
return(ae);
}
bit i2c_write_a(unsigned char slave,uchar address,
unsigned char fb[],unsigned char sun)//多字节写
{
uchar dd;//写
uchar i;
dd=slave&0xfe;//写
delay1(600);
i2c_start_t();
i2c_sendbyte_t(dd);
if(wait_ack_t())
{
i2c_stop_t();
#if(DEBUG)
// printf("写多字节器件地址off=0x%2x\n",slave);
#endif
return(0);
}
i2c_sendbyte_t(address);
if(wait_ack_t())
{
i2c_stop_t();
return(0);
}
for(i=0;i<sun;i++)
{
i2c_sendbyte_t(fb[i]);
if(wait_ack_t())
{
i2c_stop_t();
#if(DEBUG)
// printf("多字节写a,器件地址=0x%2x\n",slave);
// printf("多字节写b,address=0x%2x\n",i);
#endif
return(0);
}
delay1(200);
}
i2c_stop_t();
return(1);
}
bit i2c_write_b(unsigned char slave, uchar address, unsigned char fb)
{ //单字节写
uchar dd;//写
dd=slave&0xfe;//写
delay1(600);
i2c_start_t();
i2c_sendbyte_t(dd);
if(wait_ack_t())
{
i2c_stop_t();
return(0);
}
i2c_sendbyte_t(address);
if(wait_ack_t())
{
i2c_stop_t();
return(0);
}
i2c_sendbyte_t(fb);
if(wait_ack_t())
{
i2c_stop_t();
return(0);
}
i2c_stop_t();
return(1);
}
void write_a(unsigned char slave,unsigned char address,
unsigned char fb[],unsigned char sun)
{
unsigned char i;
for(i=0;i<4;i++)
{
if(i2c_write_a(slave,address,fb,sun))
return;
}
#if(DEBUG)
printf("多字节写入调谐器失败,器件地址=0x%2x,address=0x%2x\n",slave,address);
#endif
}
void write_b(unsigned char slave, unsigned char address, unsigned char fb)
{
unsigned char i;
for(i=0;i<4;i++)
{
if(i2c_write_b(slave,address,fb))
{
#if(DEBUG)
// printf("单字节写入调谐器成功,器件地址=0x%2x,address=0x%2x,fb=0x%2x\n",slave,address,fb);
#endif
return;
}
}
#if(DEBUG)
printf("单字节写入调谐器失败,器件地址=0x%2x,address=0x%2x,fb=0x%2x\n",slave,address,fb);
#endif
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -