新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 51單片機(jī)—AT24C1024(帶程序解析!)—07

51單片機(jī)—AT24C1024(帶程序解析!)—07

作者: 時(shí)間:2016-11-25 來源:網(wǎng)絡(luò) 收藏

//------------------------------------------------------------------------------
//主控器件向被控器件發(fā)送應(yīng)答函數(shù)
void IIC_ack_send(bit a)
{
if(a==0) //發(fā)應(yīng)答信號(hào)
sda=0;
else
sda=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
scl=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
scl=0;
_nop_();
_nop_();
}
//------------------------------------------------------------------------------
//寫一個(gè)字節(jié)函數(shù)
void send_byte(uchar c)
{
uchar bit_cnt;
for(bit_cnt=0;bit_cnt<8;bit_cnt++)//循環(huán)傳送8位
{
if((c< //取當(dāng)前發(fā)送位
sda=1;
else
sda=0;
_nop_();
scl=1;//發(fā)送到數(shù)據(jù)線上
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
scl=0;
}
}
//------------------------------------------------------------------------------
//接收一個(gè)字節(jié)函數(shù)
//返回接收的8位數(shù)據(jù)
uchar receive_byte()
{
uchar temp;
uchar bit_cnt;
temp=0;
sda=1; //置數(shù)據(jù)線為輸入方式
for(bit_cnt=0;bit_cnt<8;bit_cnt++)
{
_nop_();
scl=0; //置時(shí)鐘線為低電平,準(zhǔn)備接收數(shù)據(jù)
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
scl=1;
_nop_();
_nop_();
temp<<=1;
if(sda==1)//接收當(dāng)前數(shù)據(jù)位,接收內(nèi)容放入temp中
temp+=1;
_nop_();
_nop_();
}
scl=0;
_nop_();
_nop_();
return(temp);
}

本文引用地址:http://m.butianyuan.cn/article/201611/321505.htm

AT24C1024.c(這個(gè)才是壓軸的哦~~

//------------------------------------------------------------------------------
//AT24C1024文件的函數(shù),便于以后調(diào)用
//用的1M的EEPROM
#include"reg52.h"
#include"IIC.h"
#include"MacroAndConst.h"
#include"intrins.h"
//------------------------------------------------------------------------------
//器件當(dāng)前地址寫字節(jié)數(shù)據(jù)
//入口參數(shù):器件地址碼和傳送的數(shù)據(jù)
//返回一位,1表示成功,否則有誤,使用后必須結(jié)束總線
bit mcu_send_byte(uchar add,uchar dat)
{
IIC_start();//發(fā)開始信號(hào)
send_byte(add);//寫器件地址碼到IIC總線
IIC_ack_acc();//其實(shí)我感覺應(yīng)該把這個(gè)程序固化到發(fā)送字節(jié),省得寫一遍又一遍~~~~
if(ack==0)
return(0);
send_byte(dat);//如果接收到應(yīng)答信號(hào),則發(fā)送一個(gè)字節(jié)數(shù)據(jù)
IIC_ack_acc();
if(ack==0)
return(0);
IIC_stop();//正常結(jié)束,發(fā)送結(jié)束信號(hào),返回1
return(1);
}
//------------------------------------------------------------------------------
//向器件指定地址按頁寫函數(shù)
//入口參數(shù)有4個(gè):器件地址碼、器件單元地址、寫入的數(shù)據(jù)串的指針、寫入的字節(jié)個(gè)數(shù)
//寫入成功,返回1;不成功,返回0,使用后必須結(jié)束總線
bit mcu_send_string(uchar add,uchar rom_add_h,uchar rom_add_l,uchar *s,uchar num)
{
uchar i;
IIC_start();
send_byte(add);//發(fā)送器件地址碼
IIC_ack_acc();
if(ack==0)
return(0);
send_byte(rom_add_h); //有應(yīng)答,發(fā)送ROM的單元地址的高8位
IIC_ack_acc();
if(ack==0)
return(0);
send_byte(rom_add_l); //有應(yīng)答,發(fā)送ROM的單元地址的低8位
IIC_ack_acc();
if(ack==0)
return(0);
for(i=0;i //連續(xù)發(fā)送num個(gè)字節(jié)數(shù)據(jù)
{
send_byte(*s);
IIC_ack_acc();
if(ack==0)
return(0);
s++;
}
IIC_stop();
return(1);
}
//------------------------------------------------------------------------------
//讀器件當(dāng)前地址單元數(shù)據(jù)函數(shù)
//入口參數(shù)兩個(gè):器件的地址碼、讀入位置,讀成功返回1,否則返回0
//在對(duì)AT24C1024芯片寫操作之前,需要將WP置0,允許寫,寫操作完成后,WP置1,禁止對(duì)AT24C1024改寫
bit mcu_receive_byte(uchar add,uchar *c)
{
IIC_start();
send_byte(add);
IIC_ack_acc();
if(ack==0)
return(0);
*c=receive_byte();//讀入字節(jié)送目的位置
IIC_ack_send(1);//送非應(yīng)答信號(hào):1
IIC_stop();
return(1);
}
//------------------------------------------------------------------------------
//從器件指定地址讀多個(gè)字節(jié)
//入口參數(shù)有4個(gè):器件地址碼、器件單元地址、讀出的數(shù)據(jù)串、讀出的字節(jié)個(gè)數(shù),寫入成功返回1,不成功返回0
bit mcu_receive_string(uchar add,uchar rom_add_h,uchar rom_add_l,uchar *s,uchar num)
{
uchar i;
IIC_start();
send_byte(add); //發(fā)送器件的地址碼,這里最低位為0,寫
IIC_ack_acc();
if(ack==0)
return(0);
send_byte(rom_add_h);//發(fā)送器件單元地址的高字節(jié)
IIC_ack_acc();
if(ack==0)
return(0);
send_byte(rom_add_l);//發(fā)送器件單元地址的低字節(jié)
IIC_ack_acc();
if(ack==0)
return(0);
//------------------------------------------------------------------------------
IIC_start(); //重新發(fā)送開始信號(hào),開始讀取數(shù)據(jù)
send_byte(add+1);//發(fā)送器件的地址碼,這里最后一位為1,讀
IIC_ack_acc();
if(ack==0)
return(0);
for(i=0;i{
*s=receive_byte();
IIC_ack_send(0); //送應(yīng)答信號(hào)
s++;
}
*s=receive_byte();
IIC_ack_send(1); //送非應(yīng)答信號(hào)
IIC_stop();
return(1);
}

要是程序有問題的看這個(gè):

http://blog.sina.com.cn/s/blog_7ec8fc2c01012pla.html

要是芯片資料有問題的話看這個(gè):

http://blog.sina.com.cn/s/blog_7ec8fc2c01012ksx.html



上一頁 1 2 3 下一頁

關(guān)鍵詞: 51單片機(jī)AT24C102程序解

評(píng)論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉