?? 24c02.c
字號:
/*******************************************************************************
* 標題: 北京藍海微芯LJD-SY-5200單片機開發系統演示程序 *
* 文件: 24C02.C *
* 日期: 2006-7-21 *
* 版本: 1.0 *
* 作者: 藍海微芯 *
* 網站: http://www.ljd-2008.com *
********************************************************************************
* 描述: *
* 向24C02寫入256字節數據并將剛寫入的數據讀出,通過仿真器可 *
* 以觀察達寫入和讀出的數據。使用本程序前請仔細閱讀24C02相關資料。 *
* *
* *
********************************************************************************
* 【版權】 Copyright(C)微芯科技 http://www.bluemcu.com All Rights Reserved *
* 【聲明】 此程序僅用于學習與參考,引用請注明版權和作者信息! *
*******************************************************************************/
#include <reg52.h>
#include <absacc.h>
#include <intrins.h>
typedef unsigned char uchar;
typedef unsigned int uint;
sbit SDA = P1^0; /* iic數據傳送位 */
sbit SCL = P1^1; /* iic時鐘控制位 */
sbit P1_4 = P1^4;
sbit P1_3 = P1^3;
sbit P1_5 = P1^5;
/* 函數聲明 */
void iic_wait(void); /* iic延時 */
void iic_start(void); /* 開啟iic總線 */
void iic_stop(void); /* 關閉iic總線 */
void iic_ack(void); /* 發送ACK信號 */
void iic_no_ack(void); /* 發送NOACK信號 */
bit iic_wait_ack(void); /* 等待ACK信號 */
void iic_send_byte(uchar demand); /* MCU向iic設備發送一個字節 */
uchar iic_receive_byte(void); /* MCU從iic設備接收一個字節 */
/* 聲明結束 */
void delay_1s(void)
{
uchar i;
uchar j;
for(i=0;i<100;i++)
for(j=0;j<100;j++);
}
/* iic延時 */
void iic_wait(void)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
/* 開啟iic總線 */
void iic_start(void)
{
SDA = 1;
SCL = 1;
iic_wait();
SDA = 0;
iic_wait();
SCL = 0;
}
/* 關閉iic總線 */
void iic_stop(void)
{
SDA=0;
SCL=0;
iic_wait();
SCL=1;
iic_wait();
SDA=1;
}
/* 發送ACK信號 */
void iic_ack(void)
{
SDA=0;
iic_wait();
SCL=1;
iic_wait();
SCL=0;
}
/* 發送NOACK信號 */
void iic_no_ack(void)
{
SDA=1;
iic_wait();
SCL=1;
iic_wait();
SCL=0;
}
/********************************************************************
函 數 名:iic_wait_ack
功 能:等待ACK信號
說 明:
入口參數:
返 回 值:1-ACK 0-ERROR
設 計:藍海微芯
***********************************************************************/
bit iic_wait_ack(void)
{
uchar errtime=255;
//uint errtime = 1000;
SDA=1;
iic_wait();
SCL=1;
iic_wait();
while(SDA)
{
errtime--;
if(!errtime)
return 0;
}
SCL=0;
return 1;
}
/********************************************************************
函 數 名:iic_send_byte
功 能:MCU向iic設備發送一個字節
說 明:
入口參數:sbyte 待發送的字節數據
返 回 值:
設 計:藍海微芯
***********************************************************************/
void iic_send_byte(uchar sbyte)
{
uchar i = 8;
while(i--)
{
SCL = 0;
_nop_();
SDA = (bit)(sbyte&0x80);
sbyte <<= 1;
iic_wait();
SCL = 1;
iic_wait();
}
SCL=0;
}
/********************************************************************
函 數 名:iic_receive_byte
功 能:MCU從iic設備接收一個字節
說 明:
入口參數:
返 回 值:ddata 接收數據
設 計:藍海微芯
***********************************************************************/
uchar iic_receive_byte(void)
{
uchar i=8;
uchar ddata=0;
SDA=1;
while(i--)
{
ddata <<= 1;
SCL=0;
iic_wait();
SCL=1;
iic_wait();
ddata |= SDA;
}
SCL=0;
return ddata;
}
/********************************************************************
函 數 名:write_iic_data
功 能:向iic設備寫入N個字節
說 明:
入口參數:write_data 存放寫入字節的數組
address 指定從address處開始寫入
num 寫入的字節數
返 回 值:無
設 計:藍海微芯
***********************************************************************/
void write_iic_data(uchar write_data[], uchar address, uchar num)
{
uchar n;
iic_start();
iic_send_byte(0xa0);
iic_wait_ack();
iic_send_byte(address);
iic_wait_ack();
for(n=0; n<num; n++)
{
iic_send_byte(write_data[n]);
iic_wait_ack();
}
iic_stop();
}
/********************************************************************
函 數 名:read_iic_data
功 能:從iic設備讀取N個字節
說 明:
入口參數:read_data 存放讀取字節的數組
address 指定從address處開始讀取
num 讀取的字節數
返 回 值:無
設 計:藍海微芯
***********************************************************************/
void read_iic_data(uchar read_data[], uchar address, uchar num)
{
uchar n;
uchar *pread_data;
pread_data = read_data;
iic_start();
iic_send_byte(0xa0);
iic_wait_ack();
iic_send_byte(address);
iic_wait_ack();
iic_start();
iic_send_byte(0xa1);
iic_wait_ack();
for (n=0; n<num; n++)
{
*pread_data = iic_receive_byte();
pread_data++;
if (n != (num - 1)) //最后一個數據不應答
{
iic_ack();
}
}
iic_no_ack();
iic_stop();
}
/**********************主程序**********************/
main()
{
uchar idata test_write[64];
uchar idata test_read [64];
uint i;
uchar j;
P1_4=1;
P1_4=0;
P1_5=1;
P1_3=1;
while(1)
{
for (i=0; i<64; i++)
{
test_read[i] = 0;
}
for (i=0; i<64; i++)
{
test_write[i] =i+0;
}
for(j=0;j<8;j++)
{
write_iic_data(&test_write[j*8],j*8,8); /*向24C02的0-63地址存儲單元寫數據*/
read_iic_data(&test_read[j*8], j*8,8); /*從24C02的0-63地址存儲單元讀數據*/
}
for (i=0; i<64; i++)
{
test_read[i] = 0;
}
for (i=0; i<64; i++)
{
test_write[i] =i+64;
}
for(j=0;j<8;j++)
{
write_iic_data(&test_write[j*8],j*8+64,8); /*向24C02的64-127地址存儲單元寫數據*/
read_iic_data(&test_read[j*8], j*8+64,8); /*從24C02的64-127地址存儲單元讀數據*/
}
for (i=0; i<64; i++)
{
test_read[i] = 0;
}
for (i=0; i<64; i++)
{
test_write[i] =i+128;
}
for(j=0;j<8;j++)
{
write_iic_data(&test_write[j*8],j*8+128,8); /*向24C02的128-191地址存儲單元寫數據*/
read_iic_data(&test_read[j*8], j*8+128,8); /*從24C02的128-191地址存儲單元讀數據*/
}
for (i=0; i<64; i++)
{
test_read[i] = 0;
}
for (i=0; i<64; i++)
{
test_write[i] =i+192;
}
for(j=0;j<8;j++)
{
write_iic_data(&test_write[j*8],j*8+192,8); /*向24C02的192-255地址存儲單元寫數據*/
read_iic_data(&test_read[j*8], j*8+192,8); /*從24C02的192-255地址存儲單元讀數據*/
}
_nop_();
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -