 |
 |
培訓信息 |
|
|
|
 |
 |
贊助商 |
|
|
|
|
 |
 |
單片機讀寫24C01的C51程序 |
|
|
| 單片機讀寫24C01的C51程序 |
| 作者:jdzj868 來源:機電之家下載站 錄入:jdzj868 更新時間:2010-1-26 16:55:12 點擊數(shù):0 |
【字體:
】 |
/*--------------------------24C01的IIC 讀寫的c51程序--------------------- 程序中很多NOP是冗余的,希望讀者能進一步精簡,但必須經(jīng)過驗證。 Atmel 24C01 比較特殊,為簡約型. 51晶振為11.0592MHz ---------------------------------------------------------------*/ #include "reg51.h" #include "intrins.h"
sbit SCL= P1^5; sbit SDA= P1^4;
delay() { unsigned int i=1200; while(i--); } /*---------------------------------------------------------------------------- 調(diào)用方式:write_8bit(unsigned char ch) ﹫2001/03/23 函數(shù)說明:內(nèi)函數(shù),私有,用戶不直接調(diào)用。 ------------------------------------------------------------------------------- */ void write_8bit(unsigned char ch) { unsigned char i=8; SCL=0; _nop_();_nop_();_nop_();_nop_();_nop_(); while (i--) { SDA=(bit)(ch&0x80); _nop_();_nop_();_nop_();_nop_();_nop_(); ch<<=1; SCL=1; _nop_();_nop_();_nop_();_nop_();_nop_(); SCL=0; _nop_();_nop_();_nop_();_nop_();_nop_(); } _nop_();_nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_(); }
/*------------------------------------------------------------------------------ 調(diào)用方式:void ACK(void) ﹫2001/03/23 函數(shù)說明:內(nèi)函數(shù),私有,用戶不直接調(diào)用。 ------------------------------------------------------------------------------- */ void ACK(void) { unsigned char time_1; SDA=1; SCL=0; _nop_();_nop_();_nop_();_nop_();_nop_(); SCL=1; time_1=5; while(SDA) {if (!time_1) break;} //ACK SCL=0; _nop_();_nop_();_nop_();_nop_();_nop_(); }
unsigned char ReadIIC_24C01(unsigned char address) { unsigned char ddata=0; unsigned char i=8;
SCL=1; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); //Tsu:STA SDA=0; _nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); //Thd:STA SCL=0; //START
write_8bit( (address<<1) | 0x01); //寫頁地址和操作方式 ACK();
while (i--) { SDA=1; ddata<<=1; SCL=0;_nop_();_nop_();_nop_();_nop_();_nop_();SCL=1; if (SDA) ddata|=0x01; }
SCL=0;_nop_();SCL=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); SDA=0;_nop_();SCL=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); SDA=1; //STOP delay(); return ddata;
}
void WriteIIC_24C01(unsigned char address,unsigned char ddata) {
SCL=1; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); //Tsu:STA SDA=0; _nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); //Thd:STA SCL=0; //START
write_8bit( (address<<1) & 0xfe); //寫頁地址和操作方式,對于24C32- 24C256,page不起作用 ACK(); write_8bit(ddata); //發(fā)送數(shù)據(jù) ACK(); SDA=0; _nop_();SCL=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); SDA=1; //STOP delay(); }
2.這是一個讀寫24C系列EEPROM的程序,已經(jīng)經(jīng)過本人親自測試,通過。。。!
//************************************* //** M2401,M2402,M2404,M2408,M2416,M2432,M2464,M24128,M24256 //** 21c01,24c02:1010A2A1A0R/W; 24C04:1010A2A1P0R/W; 24C08:1010A2P1P0R/W //** 24C16:1010P2P1P0R/W; //** 以上6種芯片的讀寫格式為:start-device addr-ack-first word addr-ack-second word addr-ack-data-ack-stop //** 進行讀寫的字節(jié)數(shù),EEPROM首址,EEPROM控制字節(jié), //** 以及EEPROM類型。此程序結(jié)構(gòu)性良好,具有極好的容錯性,程序機器碼也不多: //** 以上5種芯片的讀寫格式為:start-device addr-ack-word addr-ack-data-ack-stop //** 24c32-24c512:1010A2A1A0R/W; 24C1024:1010A2A1P0R/W; 24c1024:1010A2A1P0R/W //** 通用的24C01-24C1024共11種EEPROM的字節(jié)讀寫操作程序,
//**************************24C01讀寫的c51源程序*********************************** #i nclude #i nclude #i nclude #i nclude
sbit SDA =P1^1; sbit SCL =P1^4; sbit WP =P1^7; sbit light =P1^0; sbit power =P1^6;
#define uchar unsigned char #define uint unsigned int
void iic_delay10ms(); void iic_delay(void); void iic_start(void); void iic_stop(void); void iic_ack(void); void read_byte(void); void send_byte(void); void initial(void); void ok(void); void error(void); void read_eeprom(void); void write_eeprom(void); void init(void);
uchar ack_flag,send_data,receive_data[32]; uchar rw,type,device_addr,addr[3],num;
void main(void) { initial(); power =0; light =0;
while(1) { ES =1; rw =0x55; WP =0; while(rw ==0x55); ES =0; switch(type) { case 0x01: case 0x02: case 0x04: case 0x08: case 0x16: type =0x02; addr[1] |=0xa0; device_addr <<=1; addr[1] |=device_addr; break; default: type =0x03; addr[2] |=0xa0; device_addr <<=1; addr[2] |=device_addr; } if(rw ==0x01) //讀EEPROM { read_eeprom(); } else if(rw ==0x00) //寫EEPROM { write_eeprom(); } else //error command { error(); ACC =0x01; SBUF =ACC; while(!TI); TI =0; } } }
void read_eeprom(void) { uchar i; WP =1; iic_start(); for(i=1;i<=type;i++) { send_data =addr[type-i]; send_byte(); iic_ack(); if(ack_flag ==0x01) break; } if(ack_flag ==0x00) { iic_start(); addr[type-1] |=0x01; send_data =addr[type-1]; send_byte(); iic_ack(); if(ack_flag ==0x00) { for(i=0;i { read_byte(); SBUF =send_data; while(!TI); TI =0; SDA =0; SCL =1; iic_delay(); SCL =0; } iic_stop(); rw =0x55; } else { error(); ACC =0x03; SBUF =ACC; while(!TI); TI =0; } } else { error(); ACC =0x02; SBUF =ACC; while(!TI); TI =0; } }
//如果你對本程序或者24C01讀寫還有什么疑問,歡迎到http://www.51hei.com的論壇去交流。
void write_eeprom(void) { uchar i; WP =0; iic_start(); for(i=1;i<=type;i++) { send_data =addr[type-i]; send_byte(); iic_ack(); if(ack_flag ==0x01) break; } if(ack_flag ==0x00) { for(i=0;i { send_data =receive_data[i]; send_byte(); iic_ack(); iic_delay10ms(); } iic_stop(); rw =0x55; } else { error(); ACC =0x04; SBUF =ACC; while(!TI); TI =0; } }
void read_byte(void) { uchar i,temp=0x80; send_data =0x00; SCL =0; for(i=0;i<8;i++) { SDA =1; SCL =1; if(SDA) send_data |=temp; temp/=2; SCL =0; iic_delay(); } }
void send_byte(void) { uchar i,temp=0x80; for(i=0;i<8;i++) { if((send_data&temp)==temp) { SDA =1; //sda=1 } else { SDA =0; //sda=0 } temp /=2; iic_delay(); SCL =1; iic_delay(); SCL =0; iic_delay(); } }
void iic_start(void) { SDA =1; SCL =1; WP =0; iic_delay(); SDA =0; iic_delay(); SCL =0; }
void iic_stop(void) { SDA =0; SCL =1; iic_delay(); SDA =1; //WP =1; }
void iic_ack(void) { ack_flag =0x00; //ack_flag等于0x00時有應答 SDA =1; iic_delay(); SCL =1; iic_delay(); if(SDA) { ack_flag =0x01; } SCL =0; }
void iic_delay(void) { _nop_(); _nop_(); _nop_(); _nop_(); }
void iic_delay10ms(void) { #pragma ASM MOV r6,#200 MOV r7,#10 delay: nop nop nop djnz r6,delay MOV r6,#200 djnz r7,delay #pragma ENDASM }
void initial(void) { TMOD =0x21; TH1 =0xfd; TL1 =0xfd; TH0 =0xfd; TL0 =0xfd; SCON =0x50; TR1 =1; EA =1; ES =1; ET0 =1; PT0 =1; }
void ok(void) { ACC =0x55; SBUF =ACC; while(!TI); TI =0; ACC =0xaa; SBUF =ACC; while(!TI); TI =0; }
void error(void) { ACC =0xaa; SBUF =ACC; while(!TI); TI =0; ACC =0x55; SBUF =ACC; while(!TI); TI =0; rw =0x55; } void es_int(void)interrupt 4 { uchar i; RI =0; type =SBUF; //型號 while(!RI); RI =0; device_addr =SBUF; //器件地址 for(i=0;i<3;i++) { while(!RI); RI =0; addr[2-i] =SBUF; //地址高、中、低位字節(jié) } while(!RI); RI =0; num =SBUF; //要操作的字節(jié)數(shù) while(!RI); RI =0; rw =SBUF; if(rw ==1) //接收到要讀的命令 { ok(); } else //接收到要寫的命令 { for(i=0;i { while(!RI); RI =0; receive_data[i]=SBUF; } ok(); } //else //{ // error(); //} }
|
|
|
發(fā)表評論 告訴好友 打印此文 收藏此頁 關(guān)閉窗口 返回頂部 |
|
|
 |
 |
網(wǎng)友評論:(只顯示最新5條。) |
|
|
|
|
|