• 大小: 38KB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2021-06-15
  • 语言: 其他
  • 标签: AT24C64  12c5a60s2  

资源简介

使用STC的12C5A60S2单片机 因为要测试IIC通信协议,研究了好久终于改出来了,本程序适用于AT24c64 E2PROM芯片

资源截图

代码片段和文件信息

/*
本程序基于郭天祥《51单片机C语言教程》第188页改写,使用STC的12C5A60S2单片机
因为要测试IIC通信协议,研究了好久终于改出来了,本程序适用于AT24c64 E2PROM芯片
需要注意的是:
              24C64与24C02的地址指针长度不同,是16位的指针,而24C02是8位指针
          其次就是12c5a60s2的速度很快,需要修改延时函数(经示波器测试)
          使用的是11.0592MHZ的晶振,SDA为P3.4   SCL为P3.5引脚
          地址是000  即A0 A1 A2都接地   串口波特率为9600可自行修改
功能:随便往串口发送一个数据(内容无所谓,只要产生串口中断就行)会返回你写入EEPROM中的数据

于山西农业大学信息学院双体系Cat‘s lab.
     15.7.9
 如果可以的话本程序使用GPL授权:)
*/
#include <12c5a60s2.h>
#define uchar unsigned char
#define uint unsigned int
sbit sda=P3^4;
sbit scl=P3^5;
uchar Rx_flag=0; //串口接收标志
uint  RecData;   //串口接收到的数据
uint  SendData; //串口需要发送的数据
void delay() //12c5a60s2单片机 11.0592MHZ时延时4-5us
{
    uchar ab;
    for(b=1;b>0;b--)
        for(a=9;a>0;a--);
}
void start()//IIC起始信号
{
sda=1;
delay();
scl=1;
delay();
sda=0;
delay();
}
void stop()//IIC停止信号
{
sda=0;
delay();
scl=1;
delay();
sda=1;
delay();
}
void respons() //IIC应答信号
{
uchar i ;
scl=1;
delay();
while ((sda==1)&&(i<250))i++;
scl=0;
delay();

}
void init()  //IIC初始化
{
sda=1;
delay();
scl=1;
delay();

}
void write_byte(uchar date) //在任意地址 写一个字节的数据
{
uchar itemp;
temp=date;
for(i=0;i<8;i++)
{
temp=temp<<1;
scl=0;
delay();
sda=CY;
delay();
scl=1;
delay();

}
scl=0;
delay();
sda=1;
delay();

}
uchar read_byte()   //在任意地址 读一个字节的数据
{
uchar ik;
scl=0;
delay();
sda=1;
delay();
for(i=0;i<8;i++)
{
scl=1;
delay();
k=(k<<1)|sda;
scl=0;
delay();

}
return k;
}
void write_add(uchar addresshuchar addressluchar date)//写地址,参数为地址高八位和地址低八位还有数据内容
{
start();
write_byte(0xa0);
respons();
write_byte(addressh);
respons();
write_byte(addressl);
respons();
write_byte(date);
respons();
stop();

}
uchar read_add(uchar addresshuchar addressl)//读地址,参数为地址高八位和地址低八位
{
uchar date;
start();
write_byte(0xa0);
respons();
write_byte(addressh);
respons();
write_byte(addressl);
respons();
start();
write_byte(0xa1);
respons();
date=read_byte();
stop();
return date;

}
void Uart_init(void)
{
   TMOD = 0x20;       //T1 方式2
   PCON = 0x00;       //SMOD = 0
   SCON = 0x50;       //方式1 8个数据位   
   TH1=0xfd;          //波特率为9600 11.0592Mhz
   TL1=0xfd;
   TR1 = 1;           //启动定时器1
   ES=1;              //开串口中断
   EA=1;              //开总中断       
}
void main()
{
delay();
init();
Uart_init(); //串口初始化
delay();
write_add(020xAA); //向EEPROM的0x0002地址写数据,内容为0xAA可自行修改<----会向上位机串口助手返回的数据
delay();
while(1)
{
/*sda=1;   //示波器测试延时时间用
delay();
sda=0;
delay();*/

SendData=read_add(02);//Senddata是要发送给上位机的数据
if(Rx_flag)
    {
 SBUF=SendData;   //将数据放入缓冲区
 while(!TI);      //等待发送完毕
 TI=0;           //清中断
 Rx_flag=0;      //清除接收标志


}
void Uart_rec(void) interrupt 4 using 1  //串口中断服务程序
{
 if(RI)               //接收中断标志被置位说明串口已经接收到数据
  {
   RI=0;              //清除中断标志
   RecData=

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件      17731  2014-05-20 13:09  12c5a60s2.h

     文件       9062  2015-07-09 10:06  at24c64

     文件       3607  2015-07-09 10:09  at24c64.c

     文件       1533  2015-07-09 10:06  at24c64.hex

     文件         47  2015-07-09 10:06  at24c64.lnp

     文件       8100  2015-07-09 10:06  at24c64.LST

     文件      14224  2015-07-09 10:06  at24c64.M51

     文件       9761  2015-07-09 10:06  at24c64.OBJ

     文件        401  2015-07-09 10:06  at24c64.plg

    .......     55634  2015-07-09 10:10  at24c64.uvopt

    .......     13399  2015-07-09 10:10  at24c64.uvproj

    .......      5624  2015-07-09 10:06  at24c64_uvopt.bak

    .......     13429  2015-07-09 10:06  at24c64_uvproj.bak

     文件       6376  2009-05-07 14:37  STARTUP.A51

     文件      14048  2015-07-09 10:06  STARTUP.LST

     文件        749  2015-07-09 10:06  STARTUP.OBJ

    .......     71272  2015-07-09 10:06  at24c64.uvgui.Administrator

----------- ---------  ---------- -----  ----

               244997                    17


评论

共有 条评论