📄 24c02.c
字号:
#include <reg51.h> //51系列单片机定义文件
#include <absacc.h>
#include <string.h>
#include <intrins.h>
#define uchar unsigned char //定义无符号字符
#define uint unsigned int //定义无符号整数
#define WriteDeviceAddress 0xa0 //写入的地址
#define ReadDviceAddress 0xa1 //读出的地址
#define WAIT _nop_()
#define WAIT2 WAIT;WAIT
#define WAIT3 WAIT2;WAIT
#define WAIT4 WAIT2;WAIT2
sbit MNSDA=P3^0;
sbit MNCLK=P3^1;
sbit IIC_SCL=P3^3; //串行时钟口
sbit IIC_SDA=P3^2; //串行数据口
void Write24c02(unsigned char Wdata,unsigned char RomAddress,unsigned char number);
void Read24c02(unsigned char *RamAddress,unsigned char RomAddress,unsigned char bytes);
code char jtled[18]=
{
0x09,/*0*/
0x7D,/*1*/
0x07,/*2*/
0x15,/*3*/
0x71,/*4*/
0x91,/*5*/
0x81,/*6*/
0x3D,/*7*/
0x01,/*8*/
0x11,/*9*/
0x21,/*A*/
0xC1,/*b*/
0x8B,/*C*/
0x45,/*d*/
0x83,/*E*/
0xA3,/*F*/
// 0x0A,0x7E,0x92,0x16,0x66,0x07,0x03,0x3E,0x02,0x26,0x22,0x43,0x8B,0x52,0x83,0xA3
// 0 1 2 3 4 5 6 7 8 9 A b C d E F
};
void delay(uint t) //定义延时函数
{
register uint bt;
for(;t;t--)
for(bt=0;bt<100;bt++);
}
void MN_Send_Byte(uchar d){
uchar i = 8;
while( i-- ){
MNCLK = 0;
MNSDA = (bit)(d&0x01);
d = d>>1;
MNCLK = 1;
}
}
/********************************************************************
函 数 名:Start_24c02()
功 能:24C02的启动函数
说 明:24c02的启动信号
入口参数:无
返 回 值:无
设 计:zhouhong 日 期:2005-08-25
修 改: 日 期:
***********************************************************************/
void Start_24C02(void)
{
IIC_SDA=1; //时钟线保持高,数据线从高到低一次跳变,通信开始
IIC_SCL=1; WAIT4;
IIC_SDA=0; WAIT4;
IIC_SCL=0; WAIT4;
}
/********************************************************************
函 数 名:Stop_24C02_()
功 能:24C02的停止函数
说 明:24c02的停止信号
入口参数:无
返 回 值:无
设 计:zhouhong 日 期:2005-08-25
修 改: 日 期:
***********************************************************************/
void Stop_24C02(void )
{
IIC_SCL=0; IIC_SDA=0; WAIT4; //时钟线保持高,数据线从低到高一次跳变,通信停止
IIC_SCL=1; WAIT4;
IIC_SDA=1; WAIT4;
// WP=0;
}
/********************************************************************
函 数 名:Ack_24C02()
功 能:24C02的发送应答函数
说 明:24c02的发送应答信号
入口参数:无
返 回 值:无
设 计:zhouhong 日 期:2005-08-25
修 改: 日 期:
***********************************************************************/
void Ack_24C02(void )
{
IIC_SDA=0; WAIT4; //数据线保持低,时钟线发生一次从高低的跳变 发送一个应答信号
IIC_SCL=1; WAIT4;
IIC_SCL=0; WAIT4;
}
/********************************************************************
函 数 名:24C02_NoAck()
功 能:24C02的反应答函数
说 明:24c02的反应答信号
入口参数:无
返 回 值:无
设 计:zhouhong 日 期:2005-08-25
修 改: 日 期:
***********************************************************************/
void NoAck_24C02(void)
{
IIC_SDA=1; WAIT4; //数据线保持高,时钟线发生一次从高低的跳变 没有应答
IIC_SCL=1; WAIT4;
IIC_SCL=0; WAIT4;
}
/********************************************************************
函 数 名:24C02_TextAck(void)
功 能:24C02的检测应答函数
说 明:24c02的检测应答信号
入口参数:无
返 回 值:bit 0或1
设 计:zhouhong 日 期:2005-08-25
修 改: 日 期:
***********************************************************************
bit TestAck_24C02(void)
{
bit ErrorBit;
SDA=1;
SCL=1; WAIT4;
ErrorBit=SDA;
SCL=0;
return(ErrorBit);
}
/********************************************************************
函 数 名:Write8Bit_24C02(void)
功 能:写入8bit数据
说 明:向24c02写入一字节数据
入口参数:要写的数据
返 回 值:无
设 计:zhouhong 日 期:2005-08-25
修 改: 日 期:
***********************************************************************/
void Write8Bit_24C02(unsigned char input)
{
unsigned char temp=8;
while(temp!=0)
{
IIC_SCL=0; WAIT4;
IIC_SDA=(bit)(input&0x80); //时钟保持低可以发送数据
input=input<<1;
WAIT4;
IIC_SCL=1;
WAIT4;
temp--;
}
IIC_SCL=0;
}
/********************************************************************
函 数 名:Write24c02(void)
功 能:写入数据
说 明:向24c02写入数据
入口参数:*Wdata 要写入的数据指针
RomAddress 要写入到24C02的地址
number 要写入的数据长度
返 回 值:无
设 计:zhouhong 日 期:2005-08-25
修 改: 日 期:
***********************************************************************/
void Write24c02(unsigned char Wdata,unsigned char RomAddress,unsigned char number)
{
Start_24C02();
Write8Bit_24C02(WriteDeviceAddress); //写入器件的地址
Ack_24C02();
Write8Bit_24C02(RomAddress); //写入要存储到24C02的地址
Ack_24C02();
Write8Bit_24C02(Wdata);
Ack_24C02();
Stop_24C02();
delay(20);
}
/********************************************************************
函 数 名:Read8_Bit24C02(void)
功 能:读出8bit数据
说 明:向24c02读出8bit的数据
入口参数:无
返 回 值:读出的数据值
设 计:zhouhong 日 期:2005-08-25
修 改: 日 期:
***********************************************************************/
unsigned char Read8Bit_24C02(void)
{
unsigned char temp,rbyte=0;
IIC_SDA=1;
for(temp=8;temp!=0;temp--)
{
IIC_SCL=0; WAIT4; //时钟做一次从低到高的跳变 可以接收数据
IIC_SCL=1; WAIT4;
rbyte=rbyte<<1;
rbyte=rbyte|((unsigned char)(IIC_SDA));
}
IIC_SCL=0;
return(rbyte);
}
/********************************************************************
函 数 名:24C02_Read24c02()
功 能:读出多字节数据函数
说 明:向24c02读出多字节数据
入口参数:*RamAddress 存储读出数据的指针
RomAddress 要读出数据的24C02地址
bytes 要读出的数据长度
返 回 值:无
设 计:zhouhong 日 期:2005-08-25
修 改: 日 期:
***********************************************************************/
void Read24c02(unsigned char *RamAddress,unsigned char RomAddress,unsigned char bytes)
{
Start_24C02();
Write8Bit_24C02(WriteDeviceAddress); //写入器件的地址
Ack_24C02();
Write8Bit_24C02(RomAddress); //写入要存储到24C02的地址
Ack_24C02();
Start_24C02();
Write8Bit_24C02(ReadDviceAddress); //写入读器件的地址
Ack_24C02();
*RamAddress=Read8Bit_24C02();
NoAck_24C02();
Stop_24C02();
}
void main(void){
uchar input = 0x25,*output;
delay(10);
Write24c02(input,0,1);
delay(10);
Read24c02(output,0,1);
MN_Send_Byte(jtled[*output/16]);
MN_Send_Byte(jtled[*output%16]);
while(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -