当前位置:编程学习 > 网站相关 >>

c8051单片机和AT24c1024B的通信(IIC协议)代码

利用51单片机的I/O口来模拟IIC协议,加深对其时序的理解,其次学习AT24c1024b的读写方法.已经通过运行代码如下:


[cpp]
include <reg51.h>  
#include<intrins.h>//包含_nop_()函数  
 
#define CTL_R 0xa1//AT24读控制  
#define CTL_W 0xa0//AT24写控制  
 
sbit SCL=P1^6; 
sbit SDA=P1^7; 
 
 
void Delay(int n) 

    int i,j; 
    for(i=0;i<n;i++) 
    for(j=0;j<1000;j++); 

 
void delay(void) //延时>4us  

    _nop_();//空指令  
    _nop_(); 
    _nop_(); 
    _nop_(); 

 
 
void IIC_start(void)//IIC开始  

    SDA=1; 
    SCL=1; 
    delay(); 
    SDA=0; 
    delay(); 
    SCL=0; 

 
void IIC_stop(void)//IIC结束  

    SDA=0; 
    SCL=1; 
    delay(); 
    SDA=1; 
    delay(); 
    SCL=0; 

 
void IIC_ACK(void)//发送应答ACK=0  

    SDA=0; 
    SCL=1; 
    delay(); 
    SCL=0; 
    SDA=1; 

 
void IIC_nACK(void)//发送非应答  

    SDA=1; 
    SCL=1; 
    delay(); 
    SCL=0; 

 
int IIC_CACK() //检查应答  

    int C=0; 
    while(C!=SDA); 
    SCL=1; 
    delay(); 
    SCL=0; 
    return C; 

 
void IIC_send(char n)//字节发送  

    int i; 
    char tmp=n; 
    for(i=0;i<8;i++) 
    { 
        SDA=(bit)(tmp>>7);//发送一个字节的高位  
        SCL=1; 
        delay(); 
        tmp<<=1; 
        SCL=0; 
    } 

 
char IIC_rec(void)//字节接收  

    int i; 
    char tmp=0; 
    for(i=0;i<8;i++) 
    { 
        tmp <<=1; 
        tmp |=SDA; 
        SCL=1; 
        delay(); 
        SCL=0; 
    } 
    return tmp; 

 
void IIC_W_AT24C1024B(int n,short int ADDR,char *from)//多字节发送  

    int i; 
    IIC_start(); 
    do 
    IIC_send(CTL_W); 
    while(IIC_CACK());//等待应答  
    do 
    IIC_send((char)(ADDR>>4));//1字节高位地址  
    while(IIC_CACK());//等待应答  
    do 
    IIC_send((char)ADDR);//1字节高位地址  
    while(IIC_CACK());//等待应答  
    for(i=0;i<n;i++) 
    { 
        do 
        IIC_send(*from);//发送一个字节  
        while(IIC_CACK());//等待应答  
        from++; 
    } 
    IIC_stop(); 

 
void IIC_R_AT24C1024B(int n,short int ADDR,char to[])//多字节接收  

    int i; 
    IIC_start(); 
    do 
    IIC_send(CTL_W); 
    while(IIC_CACK());//等待应答  
    do 
    IIC_send((char)(ADDR>>4));//1字节高位地址  
    while(IIC_CACK());//等待应答  
    do 
    IIC_send((char)ADDR);//1字节低位地址  
    while(IIC_CACK());//等待应答  
    IIC_start(); 
    do 
    IIC_send(CTL_R); 
    while(IIC_CACK());//等待应答  
    for(i=0;i<n;i++) 
    { 
        to[i]=IIC_rec();//接收一个字节  
        if(n!=i) 
        IIC_ACK();//发送应答  
        else 
        IIC_nACK(); 
    } 
    IIC_stop(); 

 
 
char a[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f, 
0x77,0x7c,0x39,0x5e,0x79,0x71};//0~F的字形码  
char s[16]={0}; 
int main(void) 

   int i; 
   IIC_W_AT24C1024B(16,0x0020,a); 
   Delay(30); 
   IIC_R_AT24C1024B(16,0x0020,s); 
   for(i=0;i<15;i++) 
   { 
        P3=b[i]; 
        Delay(60); 
    } 
 

#include <reg51.h>
#include<intrins.h>//包含_nop_()函数

#define CTL_R 0xa1//AT24读控制
#define CTL_W 0xa0//AT24写控制

sbit SCL=P1^6;
sbit SDA=P1^7;


void Delay(int n)
{
 int i,j;
 for(i=0;i<n;i++)
 for(j=0;j<1000;j++);
}

void delay(void) //延时>4us
{
 _nop_();//空指令
 _nop_();
 _nop_();
 _nop_();
}


void IIC_start(void)//IIC开始
{
 SDA=1;
 SCL=1;
 delay();
 SDA=0;
 delay();
 SCL=0;
}

void IIC_stop(void)//IIC结束
{
 SDA=0;
 SCL=1;
 delay();
 SDA=1;
 delay();
 SCL=0;
}

void IIC_ACK(void)//发送应答ACK=0
{
 SDA=0;
 SCL=1;
 delay();
 SCL=0;
 SDA=1;
}

voi

补充:综合编程 , 其他综合 ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,