- UID
- 856476
|
今天学习了用51单片机对24C02的操作。资料是在同学那里找的,有关于24C02的介绍,也有C代码。原理和介绍以前也看过。看时序图的时候始终觉得很麻烦,不知具体的代码该怎么写,可以看了别人写的代码又觉得这么简单就实现了想要的功能。可以还是对原理理解得不够深入,有些代码不太懂,但大概思路没问题。
首先,24C02是IIC的方式进行通信的,所以先来看看IIC。IIC通信,涉及到的主要操作有:启动总线、停止总线、应答、非应答、写字节、读字节。下面是关于这些操作的代码.
#include
#include "intrins.h"
#include "iic.h"
void delay(void)
{
_nop_(); _nop_(); _nop_();
_nop_(); _nop_(); _nop_();
_nop_(); _nop_(); _nop_();
}
/**************************************
Function: void iic_start(void)
Description: 启动iic总线
Calls: 无
Input: 无
Output; 无
Return: 无
Others: 涉及到总线地址 scl & sda
****************************************/
void iic_start(void) //iic总线启动
{
scl = 1;
delay();
sda = 1;
delay();
sda = 0;
delay();
}
/**************************************
Function: void iic_stop(void)
Description: 停止iic总线
Calls: 无
Input: 无
Output; 无
Return: 无
Others: 涉及到总线地址 scl & sda
****************************************/
void iic_stop(void) //iic总线停止
{
sda = 0;
delay();
scl = 1;
delay();
sda = 1;
delay();
}
/***************************************
Function: void iic_ack(void)
Description: 应答信号
Calls: 无
Input: 无
Output; 无
Return: 无
Others:
****************************************/
void iic_ack(void) //iic总线应答
{
uint i;
scl = 1;
delay();
while((sda==1)&&(i<200))
{
i++;
}
scl = 0;
delay();
}
/**************************************
Function: void iic_noack(void)
Description: 无应答信号
Calls: 无
Input: 无
Output; 无
Return: 无
Others:
***************************************/
void iic_noack(void) //iic总线非应答
{
sda = 1;
delay();
scl = 1;
delay();
scl = 0;
delay();
}
/***************************************
Function: void iicwr_byte(void)
Description: iic总线写一位(8bit)数据
Calls: void delay(void)
Input: dat
Output; 无
Return: 无
Others: 涉及到总线地址 scl & sda
*****************************************/
void iicwr_byte(uchar dat)
{ //iic总线写一位(8bit)数据
uchar i;
scl = 0;
for(i=0;i<8;i++)
{
if(dat&0x80)
{
sda = 1;
}
else
{
sda = 0;
}
dat=dat<<1;
delay();
scl = 1;
delay();
scl = 0;
delay();
}
sda = 1;
delay();
}
/***************************************
Function: void iicre_byte(void)
Description: iic总线写一位(8bit)数据
Calls: void delay(void)
Input: 无
Output; 无
Return: dat
Others: 涉及到总线地址 scl & sda
*****************************************/
uchar iicre_byte() //iic总线读一位(8bit)数据
{
uchar i;
uchar dat;
scl = 0;
delay();
sda = 1;
delay();
for(i=0;i<8;i++)
{
scl = 1;
delay();
dat=dat<<1;
if(sda) dat++;
scl = 0;
delay();
}
sda = 1;
return dat; //数据返回
}
在读以上代码时,有这样一些问题:1、while((sda==1)&&(i<200))
{
i++;
}这句不太懂。2、非应答信号有什么用?
然后是24C02操作的一些代码:
#include
#include "iic.h"
#include "24c02.h"
/**************************************
Function: void write_byte(uchar add,uchar dat)
Description: 在24c02某一地址写一位数据
Calls: iic_star(),iic_ack(),iicwr_byte(),iic_stop()
Input: add,dat
Output; 无
Return: 无
Others:
****************************************/
void write_byte(uchar add,uchar dat)
{
scl = 1; //初始化iic总线
sda = 1;
iic_start();
iicwr_byte(0xa0);
iic_ack();
iicwr_byte(add); //写地址上
iic_ack();
iicwr_byte(dat); //要写的数据
iic_ack();
iic_stop();
}
/**************************************
Function: write_page(uchar *buff,uchar n,uchar add)
Description: 在24c02某一地址开始,连续写一数组
Calls: iic_star(),iic_ack(),iicwr_byte(),iic_stop()
Input: *buff(数组名),n(要写数组的个数),add(开始写的地址)
Output; 无
Return: 无
Others: 采用指针进行数组的读操作
****************************************/
void write_page(uchar *buff,uchar n,uchar add)
{
uint i;
iic_start();
iicwr_byte(0xa0);
iic_ack();
iicwr_byte(add);
iic_ack();
for(i=0;i<n;i++)
{
iicwr_byte(buff); //要写的数据
iic_ack();
}
iic_stop();
}</n;i++)
/**************************************
Function: uchar read_byte(uchar add)
Description: 从24c02中任一地址读取一位数据(随机读)
Calls: iic_star(),iic_ack(),iicwr_byte(),iicre_byte(),iic_stop()
Input: add(读数据的地址)
Output; 无
Return: i
Others: 使用随机读的方式,可对芯片内任一地址直接读操作
****************************************/
uchar read_byte(uchar add) //随机读
{
uchar i;
scl = 1; //初始化iic总线
sda = 1;
iic_start();
iicwr_byte(0xa0);
iic_ack();
iicwr_byte(add);
iic_ack();
iic_start();
iicwr_byte(0xa1);
iic_ack();
i = iicre_byte();
iic_noack();
iic_stop();
return i;
}
/**************************************
Function: uchar read_page(uchar *buff,uchar n,uchar add)
Description: 从24c02中任一地址开始连续读操作
Calls: iic_star(),iic_ack(),iicwr_byte(),iicre_byte(),iic_stop()
Input: *buff(数组名),n(要读数组的个数),add(开始读的地址)
Output; buff
Return: 无
Others: 此函数之前需要定义一个合适大小的数组,调用本函数后,将24c02中数据读进数组中
****************************************/
void read_page(uchar *buff,uchar n,uchar add)
{
uint i;
iic_start();
iicwr_byte(0xa0);
iic_ack();
iicwr_byte(add);
iic_ack();
iic_start();
iicwr_byte(0xa1);
iic_ack();
for(i=0;i<n;i++)
{
buff = iicre_byte();
if(i!=n-1)
{
iic_ack();
}
else
{
iic_noack();
}
}
iic_stop();
}</n;i++)
问题:iicwr_byte(0xa0);
iicwr_byte(0xa1);这两句不太懂。
哎,写到这儿,突然感觉自己完全没懂。 |
|