24C02原理图及应用程序
24C02读写C程序

//选择性读操作,从 address 地址中读出 1 个字节 uchar Read24c02(uchar address) {
uchar ch; //伪写操作 Start(); Write8Bit(WriteDeviceAddress); //发送从器件地址,且方式为写。 while(TestAck()); Write8Bit(address); while(TestAck());
}
//从 24c02 中读出 8 个 bit uchar 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); }
#define WriteDeviceAddress 0xa0 #define ReadDeviceAddress 0xa1 sbit SCL=P2^7; sbit SDA=P2^6;
//定义器件在 IIC 总线中的地址,且方式为写 //定义器件在 IIC 总线中的地址,且方式为读
sbit P10=P1Stop();
//主机产
生停止信号 return(ch);
}
//本课试验写入一个字节到 24c02 并读出来
void main(void) // 主程序 {
uchar c1,c2; c1=Read24c02(0x02);
//从 24c02 中读出 1 个字节
Write24c02(0x88,0x03); c2=Read24c02(0x03); P3=c2;
24C02读写C程序
24c02读写程序大全

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)。
24C02与按键结合程序

//广西柳州市一职校电气自动化专业部//By: China o soft#include <r eg52.h>//使用8052内核单片机#include <stdlib.h>//使用rand随机数函数sbit SCL=P1^0;//IIC时钟线(SCL)定义sbit SDA=P1^1;//IIC数据线(SDA)定义sbit K EY1=P2^0;//按钮1,用于将地址+1sbit K EY2=P2^1;//按钮2,用于将地址-1sbit K EY3=P2^2;//按钮3,用于将数据+1sbit BEEP=P2^3;//蜂鸣器,当读写测试失败时报警sbit K EY5=P1^2;//按钮5,用于读取当前地址数据sbit K EY6=P1^3;//按钮6,用于在现地址写入当前数据sbit K EY7=P1^4;//按钮7,用于进行256字节的读写测试sbit K EY4=P1^5;//按钮4,用于将数据-1unsigned char code L ED_SEG[16]={0x88,0xBE,0xC4,0x94,0xB2,0x91,0x81,0xBC,0x80,0x90,0xA0,0x83,0xC9,0x86,0xC1,0xE1};//数码管段码表0-f;a:D1,b:D0,c:D6,d:D5,e:D4,f:D2,g:D3,dp:D 7unsigned char D1,D2,D3,D4;//显示在数码管上的值unsigned char ADDR,INDEX;//当前地址,当前数据变量void e eprom_write_byte(unsigned char addr,dat)//eeprom写字节,传递参数1:要写的地址,参数2:要写的数据{//写字节程序开始unsigned char t emp1,t emp2;//写入延时使用的临时变量SCL=1;//时钟线(SCL)拉高SDA=1;//数据线(SDA)拉高SDA=0;//在时钟线(SCL)为高电平时,数据线(SDA)发生下跳变,总线启动 SCL=0;//只有时钟线(SCL)为低电平时才可以改变数据线(SDA)的状态SDA=1;//AT24C02eeprom的器件地址(A0-A2接地),1010000x.SCL=1;//读入一位数据(1)SCL=0;//只有时钟线(SCL)为低电平时才可以改变数据线(SDA)的状态SDA=0;//将数据0放到总线上SCL=1;//读入一位数据(0)SCL=0;//只有时钟线(SCL)为低电平时才可以改变数据线(SDA)的状态SDA=1;//将数据1放到总线上SCL=1;//读入一位数据(1)SCL=0;//只有时钟线(SCL)为低电平时才可以改变数据线(SDA)的状态SDA=0;//将数据0放到总线上SCL=1;//读入一位数据(0)SCL=0;//只有时钟线(SCL)为低电平时才可以改变数据线(SDA)的状态SDA=0;//将数据0放到总线上SCL=1;//读入一位数据(0)SCL=0;//只有时钟线(SCL)为低电平时才可以改变数据线(SDA)的状态SDA=0;//将数据0放到总线上SCL=1;//读入一位数据(0)SCL=0;//只有时钟线(SCL)为低电平时才可以改变数据线(SDA)的状态SDA=0;//将数据0放到总线上SCL=1;//读入一位数据(0)SCL=0;//只有时钟线(SCL)为低电平时才可以改变数据线(SDA)的状态SDA=0;//将数据0放到总线上,此位特殊,为0代表写,为1代表读SCL=1;//读入一位数据(0,写数据)SCL=0;//只有时钟线(SCL)为低电平时才可以改变数据线(SDA)的状态SDA=1;//放开数据线(SDA),以使得eeprom能够应答SCL=1;//发送第九个脉冲,让eeprom应答,应答信号从数据线(SDA)输出SCL=0;//应答结束,如果需要判断是否应答,应检查数据线(SDA)电平,本程序不检查SDA=addr&0X80;//将地址的最高位(MSB)放到总线上SCL=1;//写入最高位(MSB D7)SCL=0;//只有时钟线(SCL)为低电平时才可以改变数据线(SDA)的状态SDA=addr&0X40;//将地址的D6位放到总线上SCL=1;//写入数据位(D6)SCL=0;//只有时钟线(SCL)为低电平时才可以改变数据线(SDA)的状态SDA=addr&0X20;//将地址的D5位放到总线上SCL=1;//写入数据位(D5)SCL=0;//只有时钟线(SCL)为低电平时才可以改变数据线(SDA)的状态SDA=addr&0X10;//将地址的D4位放到总线上SCL=1;//写入数据位(D4)SCL=0;//只有时钟线(SCL)为低电平时才可以改变数据线(SDA)的状态SDA=addr&0X08;//将地址的D3位放到总线上SCL=1;//写入数据位(D3)SCL=0;//只有时钟线(SCL)为低电平时才可以改变数据线(SDA)的状态SDA=addr&0X04;//将地址的D2位放到总线上SCL=1;//写入数据位(D2)SCL=0;//只有时钟线(SCL)为低电平时才可以改变数据线(SDA)的状态SDA=addr&0X02;//将地址的D1位放到总线上SCL=1;//写入数据位(D1)SCL=0;//只有时钟线(SCL)为低电平时才可以改变数据线(SDA)的状态SDA=addr&0X01;//将地址的(LSB D0)位放到总线上SCL=1;//写入数据位(D0)SCL=0;//只有时钟线(SCL)为低电平时才可以改变数据线(SDA)的状态SDA=1;//放开数据线(SDA),以使得eeprom能够应答SCL=1;//发送第九个脉冲,让eeprom应答,应答信号从数据线(SDA)输出SCL=0;//应答结束,如果需要判断是否应答,应检查数据线(SDA)电平,本程序不检查SDA=dat&0X80;//将数据的最高位(MSB)放到总线上SCL=1;//写入数据位(MSB D7)SCL=0;//只有时钟线(SCL)为低电平时才可以改变数据线(SDA)的状态SDA=dat&0X40;//将数据的D6位放到总线上SCL=1;//写入数据位(D6)SCL=0;//只有时钟线(SCL)为低电平时才可以改变数据线(SDA)的状态SDA=dat&0X20;//将数据的D5位放到总线上SCL=1;//写入数据位(D5)SCL=0;//只有时钟线(SCL)为低电平时才可以改变数据线(SDA)的状态SDA=dat&0X10;//将数据的D4位放到总线上SCL=1;//写入数据位(D4)SCL=0;//只有时钟线(SCL)为低电平时才可以改变数据线(SDA)的状态SDA=dat&0X08;//将数据的D3位放到总线上SCL=1;//写入数据位(D3)SCL=0;//只有时钟线(SCL)为低电平时才可以改变数据线(SDA)的状态SDA=dat&0X04;//将数据的D2位放到总线上SCL=1;//写入数据位(D2)SDA=dat&0X02;//将数据的D1位放到总线上SCL=1;//写入数据位(D1)SCL=0;//只有时钟线(SCL)为低电平时才可以改变数据线(SDA)的状态SDA=dat&0X01;//将数据的D0位(LSB)放到总线上SCL=1;//写入数据位(D0)SCL=0;//只有时钟线(SCL)为低电平时才可以改变数据线(SDA)的状态SDA=1;//放开数据线(SDA),以使得eeprom能够应答SCL=1;//发送第九个脉冲,让eeprom应答,应答信号从数据线(SDA)输出SCL=0;//应答结束,如果需要判断是否应答,应检查数据线(SDA)电平,本程序不检查SDA=0;//拉低数据线(SDA)SCL=1;//拉高时钟线(SCL)SDA=1;//在时钟线(SCL)为高电平时,数据线(SDA)发生上跳变,停止总线//按ATMEL的手册,每次写完,都应该延时5ms以上temp1=t emp2=20;//准备延时do//外层do-while循环{//外层循环开始do//内层do-while循环{//内层循环开始;//空操作,延时}while(--t emp2);//do-while结构}while(--t emp1);//do-while结构}//写字节程序结束unsigned char e eprom_read_byte(unsigned char addr)//eeprom读字节,传递参数为要读的地址,返回读到的数据{//读字节程序开始unsigned char temp;//接收数据用的临时变量SCL=1;//时钟线(SCL)拉高SDA=1;//数据线(SDA)拉高SDA=0;//在时钟线(SCL)为高电平时,数据线(SDA)发生下跳变,总线启动SCL=0;//只有时钟线(SCL)为低电平时才可以改变数据线(SDA)的状态SDA=1;//AT24C02eeprom的器件地址(A0-A2接地),1010000x.SCL=1;//读入一位数据(1)SCL=0;//只有时钟线(SCL)为低电平时才可以改变数据线(SDA)的状态SDA=0;//将数据0放到总线上SCL=1;//读入一位数据(0)SCL=0;//只有时钟线(SCL)为低电平时才可以改变数据线(SDA)的状态SDA=1;//将数据1放到总线上SCL=1;//读入一位数据(1)SCL=0;//只有时钟线(SCL)为低电平时才可以改变数据线(SDA)的状态SDA=0;//将数据0放到总线上SCL=1;//读入一位数据(0)SCL=0;//只有时钟线(SCL)为低电平时才可以改变数据线(SDA)的状态SDA=0;//将数据0放到总线上SCL=1;//读入一位数据(0)SCL=0;//只有时钟线(SCL)为低电平时才可以改变数据线(SDA)的状态SDA=0;//将数据0放到总线上SCL=1;//读入一位数据(0)SDA=0;//将数据0放到总线上SCL=1;//读入一位数据(0)SCL=0;//只有时钟线(SCL)为低电平时才可以改变数据线(SDA)的状态SDA=0;//将数据0放到总线上,此位特殊,为0代表写,为1代表读SCL=1;//读入一位数据(0,写数据)SCL=0;//只有时钟线(SCL)为低电平时才可以改变数据线(SDA)的状态SDA=1;//放开数据线(SDA),以使得eeprom能够应答SCL=1;//发送第九个脉冲,让eeprom应答,应答信号从数据线(SDA)输出SCL=0;//应答结束,如果需要判断是否应答,应检查数据线(SDA)电平,本程序不检查SDA=addr&0X80;//将地址的最高位(MSB)放到总线上SCL=1;//写入最高位(MSB D7)SCL=0;//只有时钟线(SCL)为低电平时才可以改变数据线(SDA)的状态SDA=addr&0X40;//将地址的D6位放到总线上SCL=1;//写入数据位(D6)SCL=0;//只有时钟线(SCL)为低电平时才可以改变数据线(SDA)的状态SDA=addr&0X20;//将地址的D5位放到总线上SCL=1;//写入数据位(D5)SCL=0;//只有时钟线(SCL)为低电平时才可以改变数据线(SDA)的状态SDA=addr&0X10;//将地址的D4位放到总线上SCL=1;//写入数据位(D4)SCL=0;//只有时钟线(SCL)为低电平时才可以改变数据线(SDA)的状态SDA=addr&0X08;//将地址的D3位放到总线上SCL=1;//写入数据位(D3)SCL=0;//只有时钟线(SCL)为低电平时才可以改变数据线(SDA)的状态SDA=addr&0X04;//将地址的D2位放到总线上SCL=1;//写入数据位(D2)SCL=0;//只有时钟线(SCL)为低电平时才可以改变数据线(SDA)的状态SDA=addr&0X02;//将地址的D1位放到总线上SCL=1;//写入数据位(D1)SCL=0;//只有时钟线(SCL)为低电平时才可以改变数据线(SDA)的状态SDA=addr&0X01;//将地址的(LSB D0)位放到总线上SCL=1;//写入数据位(D0)SCL=0;//只有时钟线(SCL)为低电平时才可以改变数据线(SDA)的状态SDA=1;//放开数据线(SDA),以使得eeprom能够应答SCL=1;//发送第九个脉冲,让eeprom应答,应答信号从数据线(SDA)输出SCL=0;//应答结束,如果需要判断是否应答,应检查数据线(SDA)电平,本程序不检查SCL=1;//时钟线(SCL)拉高SDA=1;//数据线(SDA)拉高SDA=0;//在时钟线(SCL)为高电平时,数据线(SDA)发生下跳变,总线启动SCL=0;//只有时钟线(SCL)为低电平时才可以改变数据线(SDA)的状态SDA=1;//AT24C02eeprom的器件地址(A0-A2接地),1010000x.SCL=1;//读入一位数据(1)SCL=0;//只有时钟线(SCL)为低电平时才可以改变数据线(SDA)的状态SDA=0;//将数据0放到总线上SCL=1;//读入一位数据(0)SCL=0;//只有时钟线(SCL)为低电平时才可以改变数据线(SDA)的状态SDA=1;//将数据1放到总线上SCL=1;//读入一位数据(1)SCL=0;//只有时钟线(SCL)为低电平时才可以改变数据线(SDA)的状态SDA=0;//将数据0放到总线上SCL=1;//读入一位数据(0)SCL=0;//只有时钟线(SCL)为低电平时才可以改变数据线(SDA)的状态SDA=0;//将数据0放到总线上SCL=1;//读入一位数据(0)SCL=0;//只有时钟线(SCL)为低电平时才可以改变数据线(SDA)的状态SDA=0;//将数据0放到总线上SCL=1;//读入一位数据(0)SCL=0;//只有时钟线(SCL)为低电平时才可以改变数据线(SDA)的状态SDA=0;//将数据0放到总线上SCL=1;//读入一位数据(0)SCL=0;//只有时钟线(SCL)为低电平时才可以改变数据线(SDA)的状态SDA=1;//将数据1放到总线上,此位特殊,为0代表写,为1代表读SCL=1;//读入一位数据(1,读数据)SCL=0;//只有时钟线(SCL)为低电平时才可以改变数据线(SDA)的状态SDA=1;//放开数据线(SDA),以使得eeprom能够应答SCL=1;//发送第九个脉冲,让eeprom应答,应答信号从数据线(SDA)输出SCL=0;//应答结束,如果需要判断是否应答,应检查数据线(SDA)电平,本程序不检查temp=temp|SDA;//应答结束后,第1位数据(MSB D7)已经送出,直接读取SCL=1;//释放时钟线(SCL),以准备产生下降沿SCL=0;//拉低时钟线(SCL),以产生下降沿,使eeprom送出第2位数据(D6)temp=temp<<1;//临时变量移位,以准备拼合新接收到的位temp=temp|SDA;//拼合新的数据位SCL=1;//释放时钟线(SCL),以准备产生下降沿SCL=0;//拉低时钟线(SCL),以产生下降沿,使eeprom送出第3位数据(D5)temp=temp<<1;//临时变量移位,以准备拼合新接收到的位temp=temp|SDA;//拼合新的数据位SCL=1;//释放时钟线(SCL),以准备产生下降沿SCL=0;//拉低时钟线(SCL),以产生下降沿,使eeprom送出第4位数据(D4)temp=temp<<1;//临时变量移位,以准备拼合新接收到的位temp=temp|SDA;//拼合新的数据位SCL=1;//释放时钟线(SCL),以准备产生下降沿SCL=0;//拉低时钟线(SCL),以产生下降沿,使eeprom送出第5位数据(D3)temp=temp<<1;//临时变量移位,以准备拼合新接收到的位temp=temp|SDA;//拼合新的数据位SCL=1;//释放时钟线(SCL),以准备产生下降沿SCL=0;//拉低时钟线(SCL),以产生下降沿,使eeprom送出第6位数据(D2)temp=temp<<1;//临时变量移位,以准备拼合新接收到的位temp=temp|SDA;//拼合新的数据位SCL=1;//释放时钟线(SCL),以准备产生下降沿SCL=0;//拉低时钟线(SCL),以产生下降沿,使eeprom送出第7位数据(D1)temp=temp<<1;//临时变量移位,以准备拼合新接收到的位temp=temp|SDA;//拼合新的数据位SCL=1;//释放时钟线(SCL),以准备产生下降沿SCL=0;//拉低时钟线(SCL),以产生下降沿,使eeprom送出第8位数据(D0)temp=temp<<1;//临时变量移位,以准备拼合新接收到的位temp=temp|SDA;//拼合新的数据位SDA=1;//放开数据线(SDA),以使得eeprom能够应答,此次eeprom将不应答.SCL=1;//发送第九个脉冲,让eeprom应答,应答信号从数据线(SDA)输出SCL=0;//应答结束,如果需要判断是否应答,应检查数据线(SDA)电平,本程序不检查SDA=0;//拉低数据线(SDA)SCL=1;//拉高时钟线(SCL)SDA=1;//在时钟线(SCL)为高电平时,数据线(SDA)发生上跳变,停止总线return(temp);//将读到的数据返回给调用程序}//读字节程序结束void init(void)//初始化程序,打开定时器0,用于扫描4位共阳LED{//初始化程序开始EA=1;//打开总中断ET0=1;//打开定时器0(T0)中断TMOD=0X01;//设置定时器0工作模式为方式1TR0=1;//启动定时器0}//初始化程序结束void L ED_SCAN(void)//LED扫描程序,用于扫描4位共阳LED,状态机机制{static unsigned char NUM;//静态局部变量,记录状态机switch(NUM)//切换状态机{case 0://0分支P2=P2|0XF0;//关闭所有数码管P0=L ED_SEG[D1];//通过查表,将D1内容换成段码放置到P0口P2=P2&0X7F;//打开对应的PNP三极管点亮LEDNUM=1;//状态转移break;//分支结束case 1://1分支P2=P2|0XF0;//关闭所有数码管P0=L ED_SEG[D2];//通过查表,将D2内容换成段码放置到P0口P2=P2&0XBF;//打开对应的PNP三极管点亮LEDNUM=2;//状态转移break;//分支结束case 2://2分支P2=P2|0XF0;//关闭所有数码管P0=L ED_SEG[D3];//通过查表,将D3内容换成段码放置到P0口P2=P2&0XDF;//打开对应的PNP三极管点亮LEDNUM=3;//状态转移break;//分支结束case 3://3分支P2=P2|0XF0;//关闭所有数码管P0=L ED_SEG[D4];//通过查表,将D4内容换成段码放置到P0口P2=P2&0XEF;//打开对应的PNP三极管点亮LEDNUM=0;//状态转移break;//分支结束default://默认、异常分支NUM=0;//恢复状态机到正常值break;//分支结束}//switch-case结束}//扫描程序结束void t imer0(void) interrupt 1 using 2//定时器0中断程序{TH0=(65536-6000)/256;//每6ms扫描一次数码管,高八位TL0=(65536-6000)%256;//每6ms扫描一次数码管,低八位D1=ADDR>>4;//获得高四位数据D2=ADDR&0X0F;//获得低四位数据,左边两位数码管显示地址D3=INDEX>>4;//获得高四位数据D4=INDEX&0X0F;//获得低四位数据,右边两位数码管显示数据LED_SCAN();//数据准备完毕,开始扫描}//定时器0中断程序结束void main(void)//主程序{//主程序开始init();//初始化while(1)//主循环{//主循环开始if(!K EY1){while(!K EY1);ADDR++;}//如果按钮1被按下,则地址+1if(!K EY2){while(!K EY2);ADDR--;}//如果按钮2被按下,则地址-1if(!K EY3){while(!K EY3);INDEX++;}//如果按钮3被按下,则数据+1if(!K EY4){while(!K EY4);INDEX--;}//如果按钮4被按下,则数据-1if(!K EY5){while(!K EY5);INDEX=e eprom_read_byte(ADDR);}//如果按钮5被按下,则在当前地址读出数据if(!K EY6){while(!K EY6);e eprom_write_byte(ADDR,INDEX);}//如果按钮6被按下,则在当前地址写入数据if(!K EY7)//如果按钮7被按下,则进行256字节读写测试 {unsigned char loop,readback;//循环计数变量,回读临时变量srand(T L0);//置随机数种子,不同的种子,将返回不同的随机数序列 BEEP=1;//关闭报警蜂鸣器do//使用do-while循环{//循环开始ADDR=loop;//地址跟随循环计数值变化INDEX=rand();//取随机数eeprom_write_byte(ADDR,INDEX);//在当前地址写入取到的随机数readback=e eprom_read_byte(ADDR);//立即将刚才写入的数据读出来if(INDEX!=readback){BEEP=0;while(K EY7);BEEP=1;}//判断写入的数据和读出的数据是否一致,如不一致则报警//报警后,需要再次按动按钮7来消除报警}while(--loop);//do-while循环结构}//按钮7处理程序结束}//主循环结束}//主程序结束。
24C02_2

#include<reg52.h>#include <intrins.h>//***********************sbit SDA=P2^0;sbit SCL=P2^1;//************************//************************unsigned char Address;unsigned char I2CData;//************************/******************************************************************** *********///定义累加器A中的各位sbit a0 = ACC ^ 0;sbit a1 = ACC ^ 1;sbit a2 = ACC ^ 2;sbit a3 = ACC ^ 3;sbit a4 = ACC ^ 4;sbit a5 = ACC ^ 5;sbit a6 = ACC ^ 6;sbit a7 = ACC ^ 7;/******************************************************************** ********/bit ack=0; //应答信号标志位。
unsigned charDATA[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b, 0x0c,0x0d,0x0e,0x0f,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19 ,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f};//*********************************void delay(){unsigned char i,j,k;k=15;do{i=255;do{j=255;do{j--;}while(j);i--;}while(i);k--;}while(k);}//******************************//******************************//发送开始信号//I2C总线的起始信号的程序。
24C02-多花样流水灯演示程序

WRITE_DATA:
MOV R0,#00H ;数据写入首地址
MOV R1,#72 ;共写入72个字节的数据
MOV DPTR,#TAB ;查表
WR_LOOP:
CLR A
MOVC A,@A+DPTR
NOP
NOP
SETB SCL
NOP
NOP
NOP
MOV C,SDA
JC WAITACK ;SDA为低电平,返回了响应信号
CLR SDA
CLR SCL
ห้องสมุดไป่ตู้RET
;----------------------------------------------------
;启动信号子程序
;----------------------------------------------------
/* */
/* ME300B单片机开发系统演示程序-多花样流水灯*/
/* */
/* LED显示*/
/* */
/*将演示数据先写入24C02芯片内,再将其数据逐个读出送P0口LED显示。*/
/* */
/*邮箱: gguoqing@ */
/*网站: */
24C02-多花样流水灯演示程序
作者:gguoqing出处:willar更新时间:2006年07月08日
将72个演示数据先写入24C02芯片内,再将其数据逐个读出送P0口LED显示。
;*******************************************************************
AT24C02应用程序

/**************************************************24C02.C功能描述:PC端发送3个数据n0,n1,n2.n0=0,写,将n1写入n2地址中n0=1,读,读出n1地址中的数据,n2不起作用,但必须有收到一个字节后,将其地址值显示在数码管第1、2位上,数值显示在第5、6位上读出一个字节后,将其地址值显示在数码管第1、2位上,读出的值显示在第5、6位上;**************************************************/#define uchar unsigned char#define uint unsigned int#define Slaw0x0a; //写命令字#define Slar 0xa1; //读命令字#include "reg52.h"#include "intrins.h"sbit Scl=P2^1; //串行时钟sbit Sda=P2^0; //串行数据bit Rec; //接收到数据的标志uchar RecBuf[3]; //接收缓冲区#define Hidden 0x10; //消隐字符在字形码表中的位置sbit we=P2^7;sbit du=P2^6;uchar code dispbit[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};uchar code disptab[]={0x3f,0x6,0x5b,0x4f,0x66,0x6d,0x7d,0x27,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x0};uchar DispBuf[6];uchar code TH0V al=(65535-3000)/256;uchar code TL0V al=(65535-3000)%256;uchar code th1=0xfd;uchar code tl1=0xfd;//以下是中断程序,用于显示void timer0() interrupt 1{static uchar count;uchar tmp;P0|=0x3f;we=1;tmp=dispbit[count];P0&=tmp;we=0;du=1;tmp=DispBuf[count];tmp=disptab[tmp];P0=tmp;du=0;count++;if(count==6)count=0;TH0=TH0V al;TL0=TL0V al;}/*发送起始条件*/void Start(void) /*起始条件*/ {Sda=1;Scl=1;_nop_ ();_nop_ ();_nop_ ();_nop_ ();Sda=0;_nop_ ();_nop_ ();_nop_ ();_nop_ ();}void Stop(void) /*停止条件*/{Sda=0;Scl=1;_nop_ ();_nop_ ();_nop_ ();_nop_ ();Sda=1;_nop_ ();_nop_ ();_nop_ ();_nop_ ();}void Ack(void) /*应答位*/{Sda=0;_nop_ ();_nop_ ();_nop_ ();_nop_ ();Scl=1;_nop_ ();_nop_ ();_nop_ ();_nop_ ();Scl=0;}void NoAck(void) /*反向应答位*/{Sda=1;_nop_ ();_nop_ ();_nop_ ();_nop_ ();Scl=1;_nop_ ();_nop_ ();_nop_ ();_nop_ ();Scl=0;}void Send(uchar Data) /*发送数据子程序,Data为要求发送的数据*/ {uchar BitCounter=8; /*位数控制*/uchar temp; /*中间变量控制*/do{temp=Data;Scl=0;_nop_ ();_nop_ ();_nop_ ();_nop_ ();if((temp&0x80)==0x80)/* 如果最高位是1*/Sda=1;elseSda=0;Scl=1;temp=Data<<1; /*RLC*/Data=temp;BitCounter--;}while(BitCounter);Scl=0;}uchar Read(void) /*读一个字节的数据,并返回该字节值*/{uchar temp=0;uchar temp1=0;uchar BitCounter=8;Sda=1;do{Scl=0;_nop_ ();_nop_ ();_nop_ ();_nop_ ();Scl=1;_nop_ ();_nop_ ();_nop_ ();_nop_ ();if(Sda) /*如果Sda=1;*/temp=temp|0x01; /*temp的最低位置1*/elsetemp=temp&0xfe; /*否则temp的最低位清0*/ if(BitCounter-1){ temp1=temp<<1;temp=temp1;}BitCounter--;}while(BitCounter);return(temp);}void WrToROM(uchar Data[],uchar Address,uchar Num){uchar i=0;uchar *PData;PData=Data;Start();Send(0xa0);Ack();Send(Address);Ack();for(i=0;i<Num;i++){Send(*(PData+i));Ack();}Stop();}void RdFromROM(uchar Data[],uchar Address,uchar Num) {uchar i=0;uchar *PData;PData=Data;for(i=0;i<Num;i++){Start();Send(0xa0);Ack();Send(Address+i);Ack();Start();Send(0xa1);Ack();*(PData+i)=Read();Scl=0;NoAck();Stop();}}void Recive() interrupt 4 //串行中断程序{ static uchar Count=0;if(TI){ TI=0;return; //如果是发送中断,直接退出}RI=0; //清RI标志RecBuf[Count]=SBUF;Count++;Rec=0;if(Count>=3){ Count=0;Rec=1; //置位标志}}void Init(){ TMOD=0x21;RI=0;TH1=0xfd;TL1=0xfd;PCON|=0x80;TR1=1;SCON=0x50;TH0=TH0V al;TL0=TL0V al;ET0=1; //开T0中断EA=1; //开总中断ES=1;TR0=1; //T0开始运行TR1=1;}void Calc(uchar Dat1,uchar Dat2) //第一个参数放在第1、2位,第二个参数放入第5、6位{ DispBuf[0]=Dat1/16;DispBuf[1]=Dat1%16;DispBuf[4]=Dat2/16;DispBuf[5]=Dat2%16;}void main(){ uchar RomDat[4];Init(); //初始化DispBuf[2]=Hidden;DispBuf[3]=Hidden;for(;;){Calc(RecBuf[1],RomDat[0]); //分别显示地址和数据if(Rec) //接收到数据{ Rec=0; //清除标志if(RecBuf[0]==0) //第一种功能,写入{ RomDat[0]=RecBuf[2];WrToROM(RomDat,Rec Buf[1],1);SBUF=RomDat[0];}else{ RdFromROM(RomDat,RecBuf[1],1);SBUF=RomDat[0];}}}}。
上课铃响系统设计

1.1 课题的选题背景和意义 ......................................1 1.2 课题的系统论证 ............................................1 第二章 系统硬件设计 ..............................................................................................4 2.1 系统原理框图 ................................................4 2.2 硬件电路原理图 .............................................4 2.3 硬件电路介绍 ...............................................4
24c02参考实例程序

{
Scl=0; _nop_();_nop_();_nop_();_nop_();_nop_(); Scl=1; _nop_();_nop_();_nop_();_nop_();_nop_(); if(Sda)
temp=temp|0x01; else
temp=temp&0xfe;
if(BitCounter-1) { temp1=temp<<1; temp=temp1; } BitCounter--; }
Ack();
*(PData+i)=Read();//读数据
Scl=0;
NoAck();
Stop();
}
}
/*------------------------------------------------
主程序
------------------------------------------------*/
sbit Sda=P1^2; sbit Scl=P1^1; sbit WP=P1^0;
//定义总线连接端口 //写保护,这里不使用
/*-----------------------------------------------延时程序
------------------------------------------------*/ void mDelay(unsigned char j) { unsigned int i; for(;j>0;j--) { for(i=0;i<125;i++) {;} } }
void main()
{
unsigned char Number[4]={0x06,0x5b,0x4f,0x66};// 显示码值 1234
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
程序:
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
sbit SCL=P3^6; //I2C 时钟
sbit SDA=P3^7; //I2C 数据
sbit anjian_1=P3^5;
uchar code LED[]=
{0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71}; void delay_us()
{
_nop_(); /*起始条件建立时间大于4.7us,延时*/
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
delay_ms()
{
unsigned int i;
for(i=0;i<20000;i++);
}
void delayms(unsigned int k)
{
unsigned int j,i;
for(j=k;j>0;j--)
for(i=110;i>0;i--);
}
void Start_I2c()
{
SDA=1; /*发送起始条件的数据信号*/ delay_us();
SCL=1;
delay_us();
SDA=0; /*发送起始信号*/
delay_us();
}
void Stop_I2c()
{
SDA=0; /*发送结束条件的数据信号*/ delay_us();
SCL=1;
delay_us();
SDA=1; /*发送I2C总线结束信号*/ delay_us();
}
void Ack_I2c() //应答函数
{
uchar i=0;
SCL=1;
delay_us();
while(SDA==1&&i<200)
i++;
SCL=0;
delay_us();
}
void No_ack() //非应答函数
{
SDA=1;
delay_us();
SCL=1;
delay_us();
SCL=0;
delay_us();
}
void init()
{
SDA=1;
SCL=1;
}
void wr_byte(uchar date) //写一个字节,该函数将数据写入24C02
{
uchar i;
SCL=0; //IC总线在写数据时,在时钟低电平的时候改变数据,高电平的
时候传送数据
delay_us();
for(i=0;i<8;i++) /*要传送的数据长度为8位*/
{
if((date<<i)&0x80)
SDA=1; /*判断发送位*/
else
SDA=0;
delay_us();
SCL=1; /*置时钟线为高,通知被控器开始接收数据位*/
//IC总线在写数据时,在时钟低电平的时候改变数据,高电平的时候传送数据delay_us();
SCL=0;
delay_us();
}
SDA=1; /*8位发送完后释放数据线,准备接收应答位*/
delay_us();
}
uchar re_byte() //读一个字节,该函数将数据读出24C02
{
uchar i,temp=0;
SCL=0;
delay_us();
SDA=1;
delay_us();
for(i=0;i<8;i++)
temp<<=1;
if(SDA)
{
temp|=0x01;
}
SCL=1;
delay_us();
SCL=0;
}
return temp;
}
void write(uchar add,uchar dat)
{
init();
Start_I2c();
wr_byte(0xa0);
Ack_I2c();
wr_byte(add);
Ack_I2c();
wr_byte(dat);
Ack_I2c();
Stop_I2c();
}
uchar read(uchar add)
{
uchar value;
init();
Start_I2c();
wr_byte(0xa0); //写器件地址,前面四位是芯片24C02本身确定的,它不变,之后三
位是引脚地址,因为我们都接地了,所以这三位都为0,最后一位
位读写位,写的话为0,读为1
Ack_I2c();
wr_byte(add); //希望写到哪个地址
Ack_I2c();
Start_I2c();
wr_byte(0xa1); //写数据
Ack_I2c();
value=re_byte();
No_ack();
Stop_I2c();
return value;
}
void main()
uchar k;
delay_ms();
k=read(5); //上电后马上读取断电前的数据(必须的语句)
// P2=LED[k%10]; //k%10表示只显示个位
// k++;
while(1)
{
if(anjian_1==0)
{
delayms(100);
if(anjian_1==0)
k++;
P2=LED[k];
if(k>9)
k=0;
}
write(5,k); //k为断电前需要保存的数据,5为地址,需要保存的数据用这条语句保存(必须的语句)
P2=LED[k];
}
}。