24c256.c
资源名称:24c256.rar [点击查看]
上传用户:liao132
上传日期:2020-09-03
资源大小:26k
文件大小:6k
源码类别:
PropertySheet
开发平台:
C++ Builder
- /*编辑:赵大帅*/
- /*日期:2009-04-12*/
- /////////////////////////////////
- /*修改:XXX*/
- /*日期:XX-XX-XX*/
- /////////////////////////////////////////////////////////////////
- /*本文档是基于C8051F330单片机的EEPROM 24C512和时钟芯片FCP8563
- 的驱动程序,本文档可以对24C512实现单字节读写、多字节读写,还可
- 以实现对FCP8563的初始化和读操作;可以通过串口对24C512和FCP8563
- 进行调试查看*/
- /////////////////////////////////////////////////////////////////
- #include <c8051f330.h>
- //////////////////I2C接口
- sbit SCL=P0^6;
- sbit SDA=P0^0;
- ///////////////////////////////////////
- /*延时子程序:delay()*/
- /*输入参数:num1,num2*///设定延时时间
- /*输出参数:无*/
- /*返回:无*/
- void delay(unsigned char char1,unsigned int int1)
- {
- unsigned char j;
- unsigned int i;
- for(j=0;j<char1;j++)
- {
- for(i=0;i<int1;i++)
- {
- }
- }
- }
- ////////////////////////////////////////
- /*IO初始化:IO_Init()*/
- /*输入参数:无*/
- /*输出参数:无*/
- /*返回:无*/
- void Io_init(void)
- {
- XBR0 =0x01;//USART 使能
- XBR1 =0X40;
- P0MDIN =0xF3;//P02、P03为模拟输入;其余为数字输入
- P0MDOUT =0x3e;//P04、P05为推挽输出;P06、P07为漏极开路输出
- P0SKIP =0xCF;
- P1MDIN =0xFF;//P1均为数字输入
- P1MDOUT =0xC7;//P13,P14,P15为漏极开路输出,P10,P11,P12为推挽输出
- P1SKIP =0xFF;
- }
- ///////////////////////////////////////
- /*晶振初始化:oscillator()*/
- /*输入参数:无*/
- /*输出参数:无*/
- /*返回:无*/
- void oscillator()
- {
- OSCXCN =0x67;//开启外部震荡(晶体振荡器方式,12MHZ)
- while((OSCXCN & 0x80) ==0X00 ){} //判断XTLVLD:晶体振荡器S是否工作稳定?
- CLKSEL =0x01; //切换到外部晶振
- }
- /////////////////////////////////
- void WDT_reset()
- {
- PCA0MD =0x08;
- PCA0CPL2 =0xFF;
- PCA0H =PCA0L =0x00;
- PCA0MD =0x41;
- PCA0CPH2 =0x00;
- }
- /*起始位:I2C_Start()*/
- /*输入参数:无*/
- /*输出参数:无*/
- /*返回:无*/
- void I2C_Start()
- {
- SCL =1;
- SDA =1;
- delay(1,20);
- SDA =0;
- delay(1,20);
- WDT_reset();
- }
- ////////////////////////////////
- /*停止位:I2C_Stop()*/
- /*输入参数:无*/
- /*输出参数:无*/
- /*返回:无*/
- void I2C_Stop()
- {
- SCL =1;
- SDA =0;
- delay(1,20);
- SDA =1;
- delay(1,20);
- WDT_reset();
- // SCL =0;
- }
- ////////////////////////////////
- /*接受应答位:I2C_Receive_ACK()*/
- /*输入参数:无*/
- /*输出参数:无*/
- /*返回:无*/
- void I2C_Receive_ACK()
- {
- SCL =0;
- delay(1,20);
- SCL =1;
- delay(1,20);
- /*
- if(!SDA)
- {
- UART_send(0xAA);
- }
- */
- SCL =0;
- }
- ////////////////////////////////
- /*发送应答位:I2C_Send_ACK()*/
- /*输入参数:无*/
- /*输出参数:无*/
- /*返回:无*/
- void I2C_Send_ACK()
- {
- SCL =0;
- SDA =0;
- delay(1,20);
- SCL =1;
- delay(1,20);
- SCL =0;
- SDA =1;
- }
- ////////////////////////////////
- /*发送非应答位:I2C_Send_NOACK()*/
- /*输入参数:无*/
- /*输出参数:无*/
- /*返回:无*/
- void I2C_Send_NOACK()
- {
- SCL =0;
- SDA =1;
- delay(1,20);
- SCL =1;
- delay(1,20);
- SCL =0;
- }
- ////////////////////////////////
- /*写一个字节数据到24CXXX:I2Cwrite_byte_to24C256()*/
- /*输入参数:dat*///写24C512一个字节
- /*输出参数:无*/
- /*返回:无*/
- void I2Cwrite_byte_to24C256(unsigned char dat)
- {
- unsigned char i;
- for(i=0;i<8;i++)
- {
- SCL =0;
- if(dat & 0x80)
- {
- SDA =1;
- }
- else
- {
- SDA =0;
- }
- delay(1,20);
- SCL =1;
- delay(1,20);
- dat<<=1;
- }
- SCL =0;
- }
- ////////////////////////////////
- /*从24C256读一个字节的数据:I2Cread_byte_from24C256()*/
- /*输入参数:无*/
- /*输出参数:无*/
- /*返回:无*/
- unsigned char I2Cread_byte_from24C256()
- {
- unsigned char i;
- unsigned char dat;
- for(i=0;i<8;i++)
- {
- SCL =0;
- delay(1,20);
- SCL =1;
- if(SDA)
- {
- dat =(dat<<1)+1;
- }
- else
- {
- dat =dat<<1;
- }
- }
- SCL =0;
- return dat;
- }
- /////////////////////////////
- /*随机读24C256 n个字节的数据*/
- /*输入参数:I2C_add,addr*///I2C_add:24C512地址,addr:读EEPROM起始地址,num:字节个数
- /*输出参数:da*///数组首地址
- /*返回:无*/
- void READ_24C256(unsigned char I2C_add,unsigned int addr,unsigned char *da,unsigned char num)
- { unsigned char i;
- unsigned char buffer1,buffer2;
- buffer2=addr;//地址低8位
- buffer1=(addr>>8);//地址高8位
- I2C_Start();
- I2Cwrite_byte_to24C256(I2C_add);
- I2C_Receive_ACK(); //(sun)主机只发送脉冲,并不监测数据位
- I2Cwrite_byte_to24C256(buffer1);
- I2C_Receive_ACK();
- I2Cwrite_byte_to24C256(buffer2);
- I2C_Receive_ACK();
- I2C_Start();
- I2Cwrite_byte_to24C256((I2C_add|0x01));
- I2C_Receive_ACK();
- for(i=0;i<(num-1);i++)
- {
- *da=I2Cread_byte_from24C256();
- I2C_Send_ACK();
- da++;
- }
- *da=I2Cread_byte_from24C256();
- I2C_Send_NOACK();
- I2C_Stop();
- }
- ///////////////////////////////////////////////
- /*写24C256 n个字节的数据*/
- /*输入参数:I2C_add,addr*///I2C_add:24C512地址,addr:写EEPROM起始地址,da:数组首地址,num:字节数
- /*输出参数:无*/
- /*返回:无*/
- void WRITE_24C256(unsigned char I2C_add,unsigned int addr,unsigned char *da,unsigned char num)
- {
- unsigned char i;
- unsigned char buffer1,buffer2;
- buffer2=addr;//地址低8位
- buffer1=(addr>>8);//地址高8位
- I2C_Start();
- I2Cwrite_byte_to24C256(I2C_add);
- I2C_Receive_ACK();
- I2Cwrite_byte_to24C256(buffer1);
- I2C_Receive_ACK();
- I2Cwrite_byte_to24C256(buffer2);
- I2C_Receive_ACK();
- for(i=0;i<num;i++)
- {
- I2Cwrite_byte_to24C256(*da);
- I2C_Receive_ACK();
- da++;
- }
- I2C_Stop();
- }
- ///////////////////////////////////////
- /*波特率设置:Band_Init()*/
- /*输入参数:band///设定串口通信波特率
- /*输出参数:无*/
- /*返回:无*/
- void Band_init(unsigned char band)
- {
- TH1=TL1 =band;//9600:0xB8;14400:0xD0;28800:0xE8;57600:0xF4;115200:0xFA;230400:0xFD
- CKCON |=(1<<1)|(1<<0);//T1适用外部时钟8分频
- TMOD =0x20;//T1采用8位自动重装方式
- TCON =0x40;//T1允许,中断不使能
- }
- ///////////////////////////////////////
- /*UART初始化:UART_init()*/
- /*输入参数:无*/
- /*输出参数:无*/
- /*返回:无*/
- void UART_init()
- {
- SCON0=0x10; //允许接收
- ES0=1; //UART0中断允许
- }
- ///////////////////////////////////////
- /*发送数据:USART_Send()*/
- /*输入参数:KEY_DATA///UART发送的数据
- /*输出参数:无*/
- /*返回:无*/
- /*void UART_send(char c)
- {
- SBUF0 = c;
- while (!TI0);
- TI0 = 0;
- }*/
- ///////////////////////////////////////////////////////////////////
- int main()
- {
- unsigned char a[6]={2,2,3,4,5,6};
- unsigned char b[6]={1,1,1,1,1,1};
- unsigned int ad=0;
- PCA0MD=0x08; //关开门狗
- Io_init(); //IO初始化
- oscillator(); //晶振初始化
- Band_init(0xB8); //波特率设置
- UART_init();
- // for(i=0;i<512;i++) //串口初始化
- // {
- WRITE_24C256(0xA0,10,a,64);
- delay(10,1000);
- // ad+=64;
- // }
- READ_24C256(0xA0,10,b,6);
- delay(10,1000);
- return 0;
- }