24C02原理图及应用程序

合集下载

24C02读写C程序

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读写程序大全

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与按键结合程序

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

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-多花样流水灯演示程序

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应用程序

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];}}}}。

上课铃响系统设计

上课铃响系统设计
Embedded systems from the system point of view function are defined as the completion of complex hardware and software, and its tight coupling with the computer system. Therefore, the thesis would be from both hardware and software design to describe the design of the design process. Part of hardware design from the various functional modules, Including the main control module, display module, ring tones playback module, the clock circuit modules, memory modules and power supply circuit module. Software is divided into four sections: The main program design, program design, when transferred, the time display program ring design, and broadcast programming from time to time.
1.1 课题的选题背景和意义 ......................................1 1.2 课题的系统论证 ............................................1 第二章 系统硬件设计 ..............................................................................................4 2.1 系统原理框图 ................................................4 2.2 硬件电路原理图 .............................................4 2.3 硬件电路介绍 ...............................................4

24c02参考实例程序

24c02参考实例程序
Sda=1; do
{
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. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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];
}
}。

相关文档
最新文档