//------------------------------------------------------------------------------
//主控器件向被控器件發送應答函數
void IIC_ack_send(bit a)
{
if(a==0) //發應答信號
sda=0;
else
sda=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
scl=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
scl=0;
_nop_();
_nop_();
}
//------------------------------------------------------------------------------
//寫一個字節函數
void send_byte(uchar c)
{
uchar bit_cnt;
for(bit_cnt=0;bit_cnt<8;bit_cnt++)//循環傳送8位
{
if((c< //取當前發送位
sda=1;
else
sda=0;
_nop_();
scl=1;//發送到數據線上
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
scl=0;
}
}
//------------------------------------------------------------------------------
//接收一個字節函數
//返回接收的8位數據
uchar receive_byte()
{
uchar temp;
uchar bit_cnt;
temp=0;
sda=1; //置數據線為輸入方式
for(bit_cnt=0;bit_cnt<8;bit_cnt++)
{
_nop_();
scl=0; //置時鐘線為低電平,準備接收數據
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
scl=1;
_nop_();
_nop_();
temp<<=1;
if(sda==1)//接收當前數據位,接收內容放入temp中
temp+=1;
_nop_();
_nop_();
}
scl=0;
_nop_();
_nop_();
return(temp);
}本文引用地址:http://www.104case.com/article/201611/321505.htmAT24C1024.c(這個才是壓軸的哦~~
)
//------------------------------------------------------------------------------
//AT24C1024文件的函數,便于以后調用
//用的1M的EEPROM
#include"reg52.h"
#include"IIC.h"
#include"MacroAndConst.h"
#include"intrins.h"
//------------------------------------------------------------------------------
//器件當前地址寫字節數據
//入口參數:器件地址碼和傳送的數據
//返回一位,1表示成功,否則有誤,使用后必須結束總線
bit mcu_send_byte(uchar add,uchar dat)
{
IIC_start();//發開始信號
send_byte(add);//寫器件地址碼到IIC總線
IIC_ack_acc();//其實我感覺應該把這個程序固化到發送字節,省得寫一遍又一遍~~~~
if(ack==0)
return(0);
send_byte(dat);//如果接收到應答信號,則發送一個字節數據
IIC_ack_acc();
if(ack==0)
return(0);
IIC_stop();//正常結束,發送結束信號,返回1
return(1);
}
//------------------------------------------------------------------------------
//向器件指定地址按頁寫函數
//入口參數有4個:器件地址碼、器件單元地址、寫入的數據串的指針、寫入的字節個數
//寫入成功,返回1;不成功,返回0,使用后必須結束總線
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);//發送器件地址碼
IIC_ack_acc();
if(ack==0)
return(0);
send_byte(rom_add_h); //有應答,發送ROM的單元地址的高8位
IIC_ack_acc();
if(ack==0)
return(0);
send_byte(rom_add_l); //有應答,發送ROM的單元地址的低8位
IIC_ack_acc();
if(ack==0)
return(0);
for(i=0;i //連續發送num個字節數據
{
send_byte(*s);
IIC_ack_acc();
if(ack==0)
return(0);
s++;
}
IIC_stop();
return(1);
}
//------------------------------------------------------------------------------
//讀器件當前地址單元數據函數
//入口參數兩個:器件的地址碼、讀入位置,讀成功返回1,否則返回0
//在對AT24C1024芯片寫操作之前,需要將WP置0,允許寫,寫操作完成后,WP置1,禁止對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();//讀入字節送目的位置
IIC_ack_send(1);//送非應答信號:1
IIC_stop();
return(1);
}
//------------------------------------------------------------------------------
//從器件指定地址讀多個字節
//入口參數有4個:器件地址碼、器件單元地址、讀出的數據串、讀出的字節個數,寫入成功返回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); //發送器件的地址碼,這里最低位為0,寫
IIC_ack_acc();
if(ack==0)
return(0);
send_byte(rom_add_h);//發送器件單元地址的高字節
IIC_ack_acc();
if(ack==0)
return(0);
send_byte(rom_add_l);//發送器件單元地址的低字節
IIC_ack_acc();
if(ack==0)
return(0);
//------------------------------------------------------------------------------
IIC_start(); //重新發送開始信號,開始讀取數據
send_byte(add+1);//發送器件的地址碼,這里最后一位為1,讀
IIC_ack_acc();
if(ack==0)
return(0);
for(i=0;i{
*s=receive_byte();
IIC_ack_send(0); //送應答信號
s++;
}
*s=receive_byte();
IIC_ack_send(1); //送非應答信號
IIC_stop();
return(1);
}
要是程序有問題的看這個:
http://blog.sina.com.cn/s/blog_7ec8fc2c01012pla.html
要是芯片資料有問題的話看這個:
http://blog.sina.com.cn/s/blog_7ec8fc2c01012ksx.html
評論