24c02典型程序
- 格式:doc
- 大小:28.00 KB
- 文档页数:6
这是一个单片机控制的收音机程序完整代码和原理图下载地址:/bbs/dpj-19294-1.html 下面我我截图的一个子程序.#include "STC12C5620AD.H"#include "EEPROM.H"#include "Channel_Handle.H"/********************** 声明外部变量**************************//********************** EEPROM 存储电台PLL*************************/void EEPROM_Save_PLL(uchar Index,uint Udata){uchar Temp_H;uchar Temp_L; //PLL转换缓存uchar EEPROM_H;uchar EEPROM_L; //EEPROM读取缓存Temp_H=Udata>>8;Temp_L=Udata%256;switch (Index){case 1:EEPROM_H=EEPROM_Read_Byte(0x00,0x02); //暂存N0.8电台PLL高位EEPROM_L=EEPROM_Read_Byte(0x00,0x03); //暂存N0.8电台PLL高位EEPROM_Earse(0x00,0x00); //擦除第1扇区EEPROM_Write_Byte(Temp_H,0x00,0x00); //写入N0.1电台PLL高位EEPROM_Write_Byte(Temp_L,0x00,0x01); //写入N0.1电台PLL低位EEPROM_Write_Byte(EEPROM_H,0x00,0x02); //写入N0.8电台PLL高位EEPROM_Write_Byte(EEPROM_L,0x00,0x03); //写入N0.8电台PLL低位EEPROM_Earse(0x0e,0x00); //擦除第8扇区EEPROM_Write_Byte(Index,0x0e,0x00); //写入电台序号break;case 2:EEPROM_H=EEPROM_Read_Byte(0x02,0x02); //暂存N0.9电台PLL高位EEPROM_L=EEPROM_Read_Byte(0x02,0x03); //暂存N0.9电台PLL高位EEPROM_Earse(0x02,0x00); //擦除第2扇区EEPROM_Write_Byte(Temp_H,0x02,0x00); //写入N0.2电台PLL高位EEPROM_Write_Byte(Temp_L,0x02,0x01); //写入N0.2电台PLL低位EEPROM_Write_Byte(EEPROM_H,0x02,0x02); //写入N0.9电台PLL高EEPROM_Write_Byte(EEPROM_L,0x02,0x03); //写入N0.9电台PLL低位EEPROM_Earse(0x0e,0x00); //擦除第8扇区EEPROM_Write_Byte(Index,0x0e,0x00); //写入电台序号break;case 3:EEPROM_H=EEPROM_Read_Byte(0x04,0x02); //暂存N0.10电台PLL 高位EEPROM_L=EEPROM_Read_Byte(0x04,0x03); //暂存N0.10电台PLL 高位EEPROM_Earse(0x04,0x00); //擦除第3扇区EEPROM_Write_Byte(Temp_H,0x04,0x00); //写入N0.3电台PLL高位EEPROM_Write_Byte(Temp_L,0x04,0x01); //写入N0.3电台PLL低位EEPROM_Write_Byte(EEPROM_H,0x04,0x02); //写入N0.10电台PLL 高位EEPROM_Write_Byte(EEPROM_L,0x04,0x03); //写入N0.10电台PLL 低位EEPROM_Earse(0x0e,0x00); //擦除第8扇区EEPROM_Write_Byte(Index,0x0e,0x00); //写入电台序号break;case 4:EEPROM_H=EEPROM_Read_Byte(0x06,0x02); //暂存N0.11电台PLL 高位EEPROM_L=EEPROM_Read_Byte(0x06,0x03); //暂存N0.11电台PLL 高位EEPROM_Earse(0x06,0x00); //擦除第4扇区EEPROM_Write_Byte(Temp_H,0x06,0x00); //写入N0.4电台PLL高位EEPROM_Write_Byte(Temp_L,0x06,0x01); //写入N0.4电台PLL低位EEPROM_Write_Byte(EEPROM_H,0x06,0x02); //写入N0.11电台PLL 高位EEPROM_Write_Byte(EEPROM_L,0x06,0x03); //写入N0.11电台PLL 低位EEPROM_Earse(0x0e,0x00); //擦除第8扇区EEPROM_Write_Byte(Index,0x0e,0x00); //写入电台序号break;case 5:EEPROM_H=EEPROM_Read_Byte(0x08,0x02); //暂存N0.12电台PLL 高位EEPROM_L=EEPROM_Read_Byte(0x08,0x03); //暂存N0.12电台PLL 高位EEPROM_Earse(0x08,0x00); //擦除第5扇区EEPROM_Write_Byte(Temp_H,0x08,0x00); //写入N0.5电台PLL高位EEPROM_Write_Byte(Temp_L,0x08,0x01); //写入N0.5电台PLL低位EEPROM_Write_Byte(EEPROM_H,0x08,0x02); //写入N0.12电台PLL 高位EEPROM_Write_Byte(EEPROM_L,0x08,0x03); //写入N0.12电台PLL 低位EEPROM_Earse(0x0e,0x00); //擦除第8扇区EEPROM_Write_Byte(Index,0x0e,0x00); //写入电台序号break;case 6:EEPROM_H=EEPROM_Read_Byte(0x0a,0x02); //暂存N0.13电台PLL 高位EEPROM_L=EEPROM_Read_Byte(0x0a,0x03); //暂存N0.13电台PLL 高位EEPROM_Earse(0x0a,0x00); //擦除第6扇区EEPROM_Write_Byte(Temp_H,0x0a,0x00); //写入N0.6电台PLL高位EEPROM_Write_Byte(Temp_L,0x0a,0x01); //写入N0.6电台PLL低位EEPROM_Write_Byte(EEPROM_H,0x0a,0x02); //写入N0.13电台PLL 高位EEPROM_Write_Byte(EEPROM_L,0x0a,0x03); //写入N0.13电台PLL 低位EEPROM_Earse(0x0e,0x00); //擦除第8扇区EEPROM_Write_Byte(Index,0x0e,0x00); //写入电台序号break;case 7:EEPROM_H=EEPROM_Read_Byte(0x0c,0x02); //暂存N0.14电台PLL 高位EEPROM_L=EEPROM_Read_Byte(0x0c,0x03); //暂存N0.14电台PLL 高位EEPROM_Earse(0x0c,0x00); //擦除第7扇区EEPROM_Write_Byte(Temp_H,0x0c,0x00); //写入N0.7电台PLL高位EEPROM_Write_Byte(Temp_L,0x0c,0x01); //写入N0.7电台PLL低位EEPROM_Write_Byte(EEPROM_H,0x0c,0x02); //写入N0.14电台PLL 高位EEPROM_Write_Byte(EEPROM_L,0x0c,0x03); //写入N0.14电台PLL 低位EEPROM_Earse(0x0e,0x00); //擦除第8扇区EEPROM_Write_Byte(Index,0x0e,0x00); //写入电台序号break;case 8:EEPROM_H=EEPROM_Read_Byte(0x00,0x00); //暂存N0.1电台PLL高位EEPROM_L=EEPROM_Read_Byte(0x00,0x01); //暂存N0.1电台PLL高位EEPROM_Earse(0x00,0x00); //擦除第1扇区EEPROM_Write_Byte(Temp_H,0x00,0x02); //写入N0.8电台PLL高位EEPROM_Write_Byte(Temp_L,0x00,0x03); //写入N0.8电台PLL低位EEPROM_Write_Byte(EEPROM_H,0x00,0x00); //写入N0.1电台PLL高位EEPROM_Write_Byte(EEPROM_L,0x00,0x01); //写入N0.1电台PLL低位EEPROM_Earse(0x0e,0x00); //擦除第8扇区EEPROM_Write_Byte(Index,0x0e,0x00); //写入电台序号break;case 9:EEPROM_H=EEPROM_Read_Byte(0x02,0x00); //暂存N0.2电台PLL高位EEPROM_L=EEPROM_Read_Byte(0x02,0x01); //暂存N0.2电台PLL高位EEPROM_Earse(0x02,0x00); //擦除第2扇区EEPROM_Write_Byte(Temp_H,0x02,0x02); //写入N0.9电台PLL高位EEPROM_Write_Byte(Temp_L,0x02,0x03); //写入N0.9电台PLL低位EEPROM_Write_Byte(EEPROM_H,0x02,0x00); //写入N0.2电台PLL高位EEPROM_Write_Byte(EEPROM_L,0x02,0x01); //写入N0.2电台PLL低位EEPROM_Earse(0x0e,0x00); //擦除第8扇区EEPROM_Write_Byte(Index,0x0e,0x00); //写入电台序号break;case 10:EEPROM_H=EEPROM_Read_Byte(0x04,0x00); //暂存N0.3电台PLL高位EEPROM_L=EEPROM_Read_Byte(0x04,0x01); //暂存N0.3电台PLL高位EEPROM_Earse(0x04,0x00); //擦除第3扇区EEPROM_Write_Byte(Temp_H,0x04,0x02); //写入N0.10电台PLL高位EEPROM_Write_Byte(Temp_L,0x04,0x03); //写入N0.10电台PLL低位EEPROM_Write_Byte(EEPROM_H,0x04,0x00); //写入N0.3电台PLL高位EEPROM_Write_Byte(EEPROM_L,0x04,0x01); //写入N0.3电台PLL低位EEPROM_Earse(0x0e,0x00); //擦除第8扇区EEPROM_Write_Byte(Index,0x0e,0x00); //写入电台序号break;case 11:EEPROM_H=EEPROM_Read_Byte(0x06,0x00); //暂存N0.4电台PLL高位EEPROM_L=EEPROM_Read_Byte(0x06,0x01); //暂存N0.4电台PLL高位EEPROM_Earse(0x06,0x00); //擦除第4扇区EEPROM_Write_Byte(Temp_H,0x06,0x02); //写入N0.11电台PLL高位EEPROM_Write_Byte(Temp_L,0x06,0x03); //写入N0.11电台PLL低位EEPROM_Write_Byte(EEPROM_H,0x06,0x00); //写入N0.4电台PLL高位EEPROM_Write_Byte(EEPROM_L,0x06,0x01); //写入N0.4电台PLL低位EEPROM_Earse(0x0e,0x00); //擦除第8扇区EEPROM_Write_Byte(Index,0x0e,0x00); //写入电台序号break;case 12:EEPROM_H=EEPROM_Read_Byte(0x08,0x00); //暂存N0.5电台PLL高位EEPROM_L=EEPROM_Read_Byte(0x08,0x01); //暂存N0.5电台PLL高位EEPROM_Earse(0x08,0x00); //擦除第5扇区EEPROM_Write_Byte(Temp_H,0x08,0x02); //写入N0.12电台PLL高位EEPROM_Write_Byte(Temp_L,0x08,0x03); //写入N0.12电台PLL低位EEPROM_Write_Byte(EEPROM_H,0x08,0x00); //写入N0.5电台PLL高位EEPROM_Write_Byte(EEPROM_L,0x08,0x01); //写入N0.5电台PLL低位EEPROM_Earse(0x0e,0x00); //擦除第8扇区EEPROM_Write_Byte(Index,0x0e,0x00); //写入电台序号break;case 13:EEPROM_H=EEPROM_Read_Byte(0x0a,0x00); //暂存N0.6电台PLL高位EEPROM_L=EEPROM_Read_Byte(0x0a,0x01); //暂存N0.6电台PLL高位EEPROM_Earse(0x0a,0x00); //擦除第6扇区EEPROM_Write_Byte(Temp_H,0x0a,0x02); //写入N0.13电台PLL高位EEPROM_Write_Byte(Temp_L,0x0a,0x03); //写入N0.13电台PLL低位EEPROM_Write_Byte(EEPROM_H,0x0a,0x00); //写入N0.6电台PLL高位EEPROM_Write_Byte(EEPROM_L,0x0a,0x01); //写入N0.6电台PLL低位EEPROM_Earse(0x0e,0x00); //擦除第8扇区EEPROM_Write_Byte(Index,0x0e,0x00); //写入电台序号break;case 14:EEPROM_H=EEPROM_Read_Byte(0x0c,0x00); //暂存N0.7电台PLL高位EEPROM_L=EEPROM_Read_Byte(0x0c,0x01); //暂存N0.7电台PLL高位EEPROM_Earse(0x0c,0x00); //擦除第7扇区EEPROM_Write_Byte(Temp_H,0x0c,0x02); //写入N0.14电台PLL高位EEPROM_Write_Byte(Temp_L,0x0c,0x03); //写入N0.14电台PLL低位EEPROM_Write_Byte(EEPROM_H,0x0c,0x00); //写入N0.7电台PLL高位EEPROM_Write_Byte(EEPROM_L,0x0c,0x01); //写入N0.7电台PLL低位EEPROM_Earse(0x0e,0x00); //擦除第8扇区EEPROM_Write_Byte(Index,0x0e,0x00); //写入电台序号break;case 15:EEPROM_Earse(0x0e,0x00); //擦除第8扇区EEPROM_Write_Byte(Index,0x0e,0x00); //写入电台序号EEPROM_Write_Byte(Temp_H,0x0e,0x02); //写入N0.15电台PLL高位EEPROM_Write_Byte(Temp_L,0x0e,0x03); //写入N0.15电台PLL低位break;default:break;}}/********************** EEPROM 读取电台PLL*************************/uint EEPROM_Get_PLL(uchar Index){uint PLL_Temp;uchar Temp_H;uchar Temp_L;switch (Index){case 1: //NO.1电台PLLTemp_H=EEPROM_Read_Byte(0x00,0x00); //获取PLL高位Temp_L=EEPROM_Read_Byte(0x00,0x01); //获取PLL高位PLL_Temp=Temp_H<<8|Temp_L;break;case 2: //NO.2电台PLL Temp_H=EEPROM_Read_Byte(0x02,0x00); //获取PLL高位Temp_L=EEPROM_Read_Byte(0x02,0x01); //获取PLL高位PLL_Temp=Temp_H<<8|Temp_L;break;case 3: //NO.3电台PLL Temp_H=EEPROM_Read_Byte(0x04,0x00); //获取PLL高位Temp_L=EEPROM_Read_Byte(0x04,0x01); //获取PLL高位PLL_Temp=Temp_H<<8|Temp_L;break;case 4: //NO.4电台PLL Temp_H=EEPROM_Read_Byte(0x06,0x00); //获取PLL高位Temp_L=EEPROM_Read_Byte(0x06,0x01); //获取PLL高位PLL_Temp=Temp_H<<8|Temp_L;break;case 5: //NO.5电台PLL Temp_H=EEPROM_Read_Byte(0x08,0x00); //获取PLL高位Temp_L=EEPROM_Read_Byte(0x08,0x01); //获取PLL高位PLL_Temp=Temp_H<<8|Temp_L;break;case 6: //NO.6电台PLL Temp_H=EEPROM_Read_Byte(0x0a,0x00); //获取PLL高位Temp_L=EEPROM_Read_Byte(0x0a,0x01); //获取PLL高位PLL_Temp=Temp_H<<8|Temp_L;case 7: //NO.7电台PLL Temp_H=EEPROM_Read_Byte(0x0c,0x00); //获取PLL高位Temp_L=EEPROM_Read_Byte(0x0c,0x01); //获取PLL高位PLL_Temp=Temp_H<<8|Temp_L;break;case 8: //NO.8电台PLL Temp_H=EEPROM_Read_Byte(0x00,0x02); //获取PLL高位Temp_L=EEPROM_Read_Byte(0x00,0x03); //获取PLL高位PLL_Temp=Temp_H<<8|Temp_L;break;case 9: //NO.9电台PLL Temp_H=EEPROM_Read_Byte(0x02,0x02); //获取PLL高位Temp_L=EEPROM_Read_Byte(0x02,0x03); //获取PLL高位PLL_Temp=Temp_H<<8|Temp_L;break;case 10: //NO.10电台PLL Temp_H=EEPROM_Read_Byte(0x04,0x02); //获取PLL高位Temp_L=EEPROM_Read_Byte(0x04,0x03); //获取PLL高位PLL_Temp=Temp_H<<8|Temp_L;break;case 11: //NO.11电台PLL Temp_H=EEPROM_Read_Byte(0x06,0x02); //获取PLL高位Temp_L=EEPROM_Read_Byte(0x06,0x03); //获取PLL高位PLL_Temp=Temp_H<<8|Temp_L;break;case 12: //NO.12电台PLL Temp_H=EEPROM_Read_Byte(0x08,0x02); //获取PLL高位Temp_L=EEPROM_Read_Byte(0x08,0x03); //获取PLL高位PLL_Temp=Temp_H<<8|Temp_L;break;case 13: //NO.13电台PLL Temp_H=EEPROM_Read_Byte(0x0a,0x02); //获取PLL高位Temp_L=EEPROM_Read_Byte(0x0a,0x03); //获取PLL高位PLL_Temp=Temp_H<<8|Temp_L;break;case 14: //NO.14电台PLL Temp_H=EEPROM_Read_Byte(0x0c,0x02); //获取PLL高位Temp_L=EEPROM_Read_Byte(0x0c,0x03); //获取PLL高位PLL_Temp=Temp_H<<8|Temp_L;break;case 15: //NO.15电台PLL Temp_H=EEPROM_Read_Byte(0x0e,0x02); //获取PLL高位Temp_L=EEPROM_Read_Byte(0x0e,0x03); //获取PLL高位PLL_Temp=Temp_H<<8|Temp_L;break;default:break;}return PLL_Temp;}/********************** EEPROM 读取最后一次序号*************************/ uchar EEPROM_Get_Index(){uchar Index;Index=EEPROM_Read_Byte(0x0e,0x00);return Index;}/********************** EEPROM 写入最后一次序号*************************/ void EEPROM_Write_Index(uchar Index){EEPROM_Earse(0x0e,0x00); //首先擦除第8扇区EEPROM_Write_Byte(Index,0x0e,0x00); //写入电台序号}。
24c02读写程序大全2C总线的应用(24C02子程序)// 对24C02的读、写// extern void DelayMs(unsigned int);// extern void Read24c02(unsigned char *RamAddress,unsigned char Ro mAddress,unsigned char bytes);// extern void Write24c02(unsigned char *RamAddress,unsigned char Ro mAddress,unsigned char bytes);/***************************************************************************/#define WriteDeviceAddress 0xa0#define ReadDviceAddress 0xa1#include <reg52.h>#include <stdio.h>#include <absacc.h>/***************************************************************************/sbit SCL=P2^7;sbit SDA=P2^6;bit DOG;/***************************************************************************/void DelayMs(unsigned int number) {unsigned char temp;for(;number!=0;number--,DOG=!DOG) {for(temp=112;temp!=0;temp--) {}}}/***************************************************************************/void Start() {SDA=1;SCL=1;SDA=0;SCL=0;}/***************************************************************************/void Stop() {SCL=0;SDA=0;SDA=1;}/***************************************************************************/void Ack() {SDA=0;SCL=1;SCL=0;SDA=1;}/***************************************************************************/void NoAck() {SDA=1;SCL=1;SCL=0;}/***************************************************************************/bit TestAck() {bit ErrorBit;SDA=1;SCL=1;ErrorBit=SDA;SCL=0;return(ErrorBit);}/***************************************************************************/void Write8Bit(unsigned char input) {unsigned char temp;for(temp=8;temp!=0;temp--) {SDA=(bit)(input&0x80);SCL=1;SCL=0;input=input<<1;}}/***************************************************************************/void Write24c02(unsigned char *Wdata,unsigned char RomAddress,unsign ed char number) {Write8Bit(WriteDeviceAddress);TestAck();Write8Bit(RomAddress);TestAck();for(;number!=0;number--) {Write8Bit(*Wdata);TestAck();Wdata++;}Stop();DelayMs(10);}/***************************************************************************/ unsigned char Read8Bit() {unsigned char temp,rbyte=0;for(temp=8;temp!=0;temp--) {SCL=1;rbyte=rbyte<<1;rbyte=rbyte|((unsigned char)(SDA));SCL=0;}return(rbyte);}/***************************************************************************/void Read24c02(unsigned char *RamAddress,unsigned char RomAddress, unsigned char bytes) {//unsigned char temp,rbyte;Start();Write8Bit(WriteDeviceAddress);TestAck();Write8Bit(RomAddress);TestAck();Start();Write8Bit(ReadDviceAddress);TestAck();while(bytes!=1) {*RamAddress=Read8Bit();RamAddress++;bytes--;}*RamAddress=Read8Bit();NoAck();Stop();}[单片机应用]24c02的读写程序电子工匠发表于2007-1-4 22:33:07;---------------从24C02整组读数据RD_INI: LCALL DELAYRD_AREA: LCALL DELAYLCALL STARTLCALL DELAYLCALL WRITE ;24C02信息的读入LCALL DELAYLCALL ACKLCALL DELAYJC RD_AREAMOV R2, #8CLR P1.7 ;起始地址为00 ADDR_0: LCALL DELAYLCALL DELAYSETB P1.6LCALL DELAYLCALL DELAYCLR P1.6LCALL DELAYDJNZ R2, ADDR_0LCALL ACKLCALL DELAYJC RD_AREALCALL DELAYLCALL STARTMOV R0, #SAVE0MOV R3, #8 ;6个字节LCALL DELAYLCALL READLCALL DELAYLCALL ACKJC RD_AREARD_R_0: LCALL DELAYLCALL DELAYLCALL RD_INFOLCALL DELAYINC R0DJNZ R3, RD_R_1lcall ack_2lcall delayLCALL STOPRETrd_r_1: lcall ack_1sjmp rd_r_0;---------------向24C02整组写数据WR_INI: LCALL DELAYLCALL STARTLCALL DELAYLCALL WRITELCALL DELAYLCALL ACKLCALL DELAYJC WR_INICLR P1.7MOV R2, #8WR_W_0: LCALL DELAY ;写地址SETB P1.6LCALL DELAYLCALL DELAYCLR P1.6LCALL DELAYDJNZ R2, WR_W_0LCALL DELAYLCALL ACKLCALL DELAYJC WR_INIMOV R0, #SAVE0MOV R3, #8 ;6个字节WR_W_1: LCALL WR_INFOLCALL DELAYLCALL ACKLCALL DELAYJC WR_INIINC R0DJNZ R3, WR_W_1LCALL DELAYLCALL STOPRET;---------------24C02启动START: SETB P1.7SETB P1.6LCALL DELAYCLR P1.7LCALL DELAYCLR P1.6RET;---------------24C02读命令字;片选为"00";---------------------------- READ: MOV A, #10100001B MOV R2, #8RD1: RLC AMOV P1.7, CSETB P1.6LCALL DELAYCLR P1.6LCALL DELAYDJNZ R2, RD1RET;---------------24C02写命令字;片选为"00";---------------------------- WRITE: MOV A, #10100000B MOV R2, #8WR1: RLC AMOV P1.7, CSETB P1.6LCALL DELAYCLR P1.6CLR P1.7LCALL DELAYDJNZ R2, WR1RET;---------------24C02结束命令字STOP: CLR P1.7LCALL DELAYSETB P1.6LCALL DELAYSETB P1.7LCALL DELAYCLR P1.6RET;---------------24C02的应答信息ACK: SETB P1.7SETB P1.6LCALL DELAYmov a, p1MOV C, a.7LCALL DELAYCLR P1.6RETack_1: CLR P1.7 ;应答SETB P1.6lcall delayCLR P1.6lcall delaySETB P1.7lcall delayRETack_2: SETB P1.7 ;非应答SETB P1.6lcall delayCLR P1.6CLR P1.7lcall delayRET;---------------24C02的读;R0:数据的存储地址;-------------------------------- RD_INFO: SETB P1.7LCALL DELAYMOV R2, #8MOV R7, #0MOV A, #0RD_I_0: SETB P1.6LCALL DELAYMOV A, P1MOV C, A.7LCALL DELAYCLR P1.6MOV A, R7RLC AMOV R7, ALCALL DELAYDJNZ R2, RD_I_0MOV @R0, ARET;---------------24C02的写;R0:数据的写数据地址;-----------------------------------WR_INFO: MOV A, @R0MOV R2, #8WR_O_0: RLC AMOV P1.7, CLCALL DELAYSETB P1.6LCALL DELAYLCALL DELAYCLR P1.6LCALL DELAYDJNZ R2, WR_O_0RET24Cxx I2C EEPROM字节读写驱动程序,芯片A0-A1-A2要接GND(24C65接VCC,具体看DataSheet)。
IIC总线有关24C02 实验程序;-----------------------------------------------------------------------;*程序名称:E2PROM.ASM? *;*功能说明:此程序为I2C总线E2PROM的读写实验程序,程序中将AT24C02 *;* 采用集几种模式写入,然后采用几种模式读出,将读出的数据 *;* 和写入的数据进行比较,如果有一个数据不相等则p1.0的LED *;* 指示灯点亮。
*;*创建时间:2003-06-23 *;*修改时间: *;---------------------------------------------------------------------------------------------------------SDA EQU P1.7 ;定义P1.7为I2C总线的数据线SCL EQU P1.6 ;定义P1.6为I2C总线的时钟线SLAW EQU 50H ;定义I2C器件的写地址存放空间SLAR EQU 51H ;定义I2C器件的读地址存放空间ADDRESS EQU 52H ;定义I2C器件的内部地址存放空间WR_DATA EQU 53H ;定义写数据的存放地址NB EQU 54H ;定义读写数据的数目的存放空间ORG 0000HLJMP MAINORG 0100HMAIN:MOV SP,#70H ;设定堆栈指针MOV SLAW,#0A0H ;初始化定义变量MOV SLAR,#0A1HMOV ADDRESS,#00HMOV WR_DATA,#00HMOV NB,#08HMOV R0,#30H ;写入缓冲区30H—38H赋初值MOV A,#00HMOV R5,NBW_DATA: MOV @R0,AINC R0INC ADJNZ R5,W_DATAMOV @R0,WR_DATAMOV R0,#30H ;写入缓冲区指向30HLCALL PAGE_WRITE ;对E2PROM进行页写操作LCALL DELAYMOV ADDRESS,#08H ;写入地址指向08LCALL BYTE_WRITE ;对E2PROM进行字节写操作LCALL DELAYMOV R0,#40H ;读出缓冲区指向40HMOV ADDRESS,#00H ;对E2PROM进行连续读操作LCALL RANDOM_READLCALL DELAYLCALL CURRENT_READ ;对E2PROM进行立即地址读操作INC R0MOV @R0,AMOV R0,#30HMOV R1,#40HMOV R5,#09HSETB P1.0COMP:MOV A,@R0 ;比较30H开始和40H开始的9个单元内容 MOV 08H,@R1CJNE A,08H,LED_OFF ;如有一个不相同,转到LED点亮并结束 INC R0INC R1DJNZ R5, COMPSETB P1.0 ;全部相同,熄灭LED,结束SJMP TEST_ENDLED_OFF:CLR P1.3TEST_END:SJMP $;—————————————————————————————————*;*函数名称:DELAY *;*功能描述:产生2MS的延时 *;*调用函数:无 *;*入口条件:无 *;*占用资源:R6、R7 * ;—————————————————————————————————* DELAY: ;2mS DELAYMOV R6,#0FFHDE1: MOV R7,#0AHDE2: DJNZ R7,DE2DJNZ R6,DE1RET ;—————————————————————————————————*;*函数名称:BYTE_WRITE *;*功能描述:对E2PROM指定地址写入数据 *;*调用函数:STA、WRBYT、CACK、STOP *;*入口条件:SLAW——I2C器件写地址 *;* ADDRESS——I2C的内部地址 *;* WR_DATA——写入的数据 *;*占用资源:ACC、F0、SLAW、ADDRESS、WR_DATA * ;—————————————————————————————————*BYTE_WRITE:LCALL STAMOV A,SLAWLCALL WRBYT ;写器件地址LCALL CACKJB F0,BYTE_WRITEMOV A,ADDRESS ;写入地址LCALL WRBYTLCALL CACKJB F0,BYTE_WRITEMOV A,WR_DATALCALL WRBYT ;写入数据LCALL CACKJB F0,BYTE_WRITELCALL STOPRET ;————————————————————————————————* ;*函数名称:PAGE_WRITE * ;*功能描述:对E2PROM指定的页写入8个字节的数据 * ;*调用函数:STA、WRBYT、CACK、STOP * ;*入口条件:SLAW——I2C器件写地址 * ;* ADDRESS——I2C的内部地址 * ;* R0——写数据的首地址 * ;*占用资源:ACC、R0、R7、F0、SLAW、ADDRESS、NB * ;————————————————————————————————* PAGE_WRITE:LCALL STAMOV A,SLAWLCALL WRBYT ;写器件的写地址LCALL CACKJB F0,PAGE_WRITEMOV A,ADDRESS ;写入地址LCALL WRBYTLCALL CACKJB F0,PAGE_WRITEMOV R7,#08HWR_16BYT: ;向E2PROM写入8个字节的数据MOV A,@R0LCALL WRBYTLCALL CACKJB F0,WR_16BYTINC R0DJNZ R7,WR_16BYTLCALL STOPRET ;————————————————————————————————* ;*函数名称:CURRENT_READ * ;*功能描述:读E2PROM当前地址计数器所指地址数据 *;*调用函数:STA、RDBYT、CACK、MNACK、STOP *;*入口条件:SLAR——I2C器件读地址 *;*占用资源:ACC * ;————————————————————————————————* CURRENT_READ:LCALL STAMOV A,SLARLCALL WRBYT ;写器件的读地址LCALL CACKJB F0,CURRENT_READLCALL RDBYT ;读数据LCALL MNACKLCALL STOPRET ;————————————————————————————————*;*函数名称:RANDOM_READ *;*功能描述:对E2PROM从指定地址读出NB个字节的数据 *;*调用函数:STA、WRBYT、CACK、STOP、MACK、MNACK *;*入口条件:SLAW——I2C器件的写地址 *;* SLAR——I2C器件的读地址 *;* ADDRESS——I2C的内部地址 *;* R0——读出数据存储区的首地址 *;*占用资源:ACC、F0、SLAW、SLAR、ADDRESS、R0 * ;————————————————————————————————*RANDOM_READ:LCALL STAMOV A,SLAWLCALL WRBYT ;写器件的写地址LCALL CACKJB F0,RANDOM_READMOV A,ADDRESSLCALL WRBYT ;读的内部地址LCALL CACKJB F0,RANDOM_READRDNBYT: LCALL STAMOV A,SLAR ;写读地址LCALL WRBYTLCALL CACKJB F0,RDNBYTRDN1: LCALL RDBYT ;读数据MOV @R0,ADJNZ NB,ACK ;判断是否读到最后一个字节,如果是发出非应答 LCALL MNACK ;信号,如果不是发出应答信号,继续读数据LCALL STOPRETACK: LCALL MACKINC R0SJMP RDN1;*******************************************************************;*并行总线P1.7,P1.6模拟IIC总线软件包 P1.7--SDA, P1.6--SCL * ;*入口:分配以下符号的内存地址: * ;* R0--读写出数据缓冲区首址指针 * ;* SLA--从器件地址存放单元(写地址或地址) * ;* NB--发送(读或写)数据字节数存放单元 * ;*出口:发送N个字节调用WRNBYT,接受N个字节调用RDNBYT,发送N * ;* 个字节但不要STOP调用WRNBYTS * ;*占用资源:F0标志位,C,R0,R1(第三组) * ;******************************************************************** STA:SETB SDA ;发启始位SETB SCLNOPNOPNOPNOPCLR SDANOPNOPNOPNOPCLR SCLRETSTOP: ;发停止位CLR SDASETB SCLNOPNOPNOPNOPNOPSETB SDANOPNOPNOPNOPCLR SCLRETMACK: ;发应答位CLR SDASETB SCLNOPNOPNOPNOPCLR SCLSETB SDARETMNACK: ;发非应答位SETB SDASETB SCLNOPNOPNOPNOPCLR SCLCLR SDARETCACK: ;发非应答位SETB SDASETB SCLCLR F0MOV A,P1JNB ACC.7,CEND ;应答位为1,不置位F0 SETB F0CEND: CLR SCLNOPRETWRBYT: ;写单字节MOV R1,#08HWLP: RLC AJC WR1AJMP WR0 ;跳入写0WLP1: DJNZ R1,WLPRETWR1: ;写1SETB SDASETB SCLNOPNOPNOPNOPCLR SCLCLR SDAAJMP WLP1WR0: ;写0CLR SDASETB SCLNOPNOPNOPNOPCLR SCLAJMP WLP1RDBYT: ;读单字节MOV R1,#08HRLP:SETB SDASETB SCLMOV A,P1JNB ACC.7,RD0 ;转读0AJMP RD1 ;转读1RLP1:DJNZ R1,RLP ;8位全接收完毕,转退出 RETRD0:CLR CMOV A,R2RLC AMOV R2,ACLR SCLAJMP RLP1RD1:SETB CMOV A,R2RLC AMOV R2,ACLR SCLAJMP RLP1END。
本程序是HCS系列都可以本人已通过实验下面是程序代码/*****************头文件*****************************************/#include <hidef.h> /* for EnableInterrupts macro */#include "derivative.h" /* include peripheral declarations */#include "iic24c02.h"/*********************延时函数************************************/ void delay(void){byte i;i=8;while(i>0){i--;}}/*********************ICC初始化************************************/ void Init_IIC(void){SOPT1_IICPS=0; //IIC 在PTA引脚上// IICF=0x0d; //设置波特率<100kbps// IICF=0X4B;IICF=0X24;IICC_IICEN=1;//使能IICIICC_TXAK=0; //当接收完一字节数据产生确认位IICC_IICIE=0;//禁止中断// IICA=0x38;}/*********************写函数************************************/void WRITE_IIC(uchar addres,uchar date){byte temp;IICC_IICEN = 0;IICC_IICEN = 1; //使能IICtemp = IICS; //清中断IICS_IICIF = 1;IICC_MST=0;IICS_SRW=0;IICC_TX=1; //写使能IICC_MST=1; //设为主模式delay();IICD=0xA0; //发送芯片地址,写命令while(!IICS_IICIF );temp = IICS;IICS_IICIF=1;IICD=addres; //发送寄存器地址while(!IICS_IICIF);temp = IICS;IICS_IICIF=1;IICD=date;//写第1个字节while(!IICS_IICIF);temp = IICS;IICS_IICIF=1;IICC1_TX=0;IICS_SRW=0;IICC1_MST=0;}/*********************读一个字节************************************/byte IIC_read_one_byte(byte address){byte temp;IICC_RSTA=0;IICC_IICEN = 0;IICC_IICEN = 1; //使能IICtemp = IICS; /* Clear any pending interrupt */IICS_IICIF = 1;IICC1_MST=0;IICS_SRW=0;IICC_TX=1; //写使能IICC_MST=1; //置为主模式delay();IICD=0xA0; //发送芯片地址,写命令while(!IICS_IICIF);temp = IICS;IICS_IICIF=1;IICD=address; //发送寄存器地址while(!IICS_IICIF);temp = IICS;IICS_IICIF=1;IICC_TXAK=1;IICC_RSTA=1; //重新启动IICD=0xA1; //读命令while(!IICS_IICIF);temp = IICS;IICS_IICIF=1;IICC_TX=0; //读使能temp=IICD;while(!IICS_IICIF);temp = IICS;IICS_IICIF=1;temp=IICD; //读一个字节IICC_MST=0;delay();return(temp);}。
24c02典型程序
#include<reg52.h>
#include<i2c.h>
#include<lcd.h>
#define uchar unsigned char
#define uint unsigned int
#define adwrite 0xae //24c02地址(写)
#define adread 0xaf //24c02地址(读)
uchar num_wr[4]={'a','b','c','d'}; //存放写入数据(液晶显示abcd)
//uchar num_rd[4]; //存放读24c02回的数据
/**************************************** ***
函数名称:delayms()
功能:延迟j毫秒
参数:char j
返回值:无
***************************************** ***/
void delayms(uchar j)
{
uint i;
for(;j>0;j--)
{
for(i=0;i<125;i++)
{;}
}
}
/**************************************** ***
函数名称:rom_write()
功能:循环写进num个字节
参数:如下
返回值:无
***************************************** ***/
void rom_write(uchar date[],uchar
address,uchar num)
{
uchar i; // 循环次数
iic_start();
iic_write(adwrite); // 24c02写地址
iic_ack();
iic_write(address); // 24c02起始存储地址写入可自动+1
iic_ack();
for(i=0;i<num;i++) // 循环写入num个字节{
iic_write(date[i]);
iic_ack();
}
iic_stop(); // 结束
}
/**************************************** ***
函数名称:rom_read()
功能:读回1个字节
参数:uchar address
返回值:q
***************************************** ***/
unsigned char rom_read (uchar address)
{ uchar q;
iic_start();
iic_write(0xae); //写入芯片地址
iic_ack();
iic_write(address); //写入存储地址
iic_ack();
iic_start();
iic_write(0xaf); //读回地址
iic_ack();
q=iic_read(); //读数据
iic_noack();
iic_stop(); //最后非应答
return q; //读回该地址存储的数}
/****************************************
***
函数名称:main()
功能:初始化及循环调用子函数显示
参数:无
返回值:无
***************************************** ***/
/*void main()
{
uchar i;
init(); //1602初始化
wp=0;
P2=0xff;
rom_write(num_wr,6,4); //从24c02地址6开始写入4个数据
delayms(40);
for(i=6;i<10;i++) //液晶1602显示'abcd' w_dat(rom_read(i));
while(1);
}
*/。