proteus仿真图
程序
- #include <reg51.h> // ??8051?????
- #include <intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
-
- sbit SCK=P2^0;
- sbit SI=P2^1;
- sbit SO=P2^2;
- sbit CS=P2^3;
- // ???SPI??????
- void SPI_Init(void); // SPI???
- void SPI_SendByte(unsigned char byte); // SPI??????
- unsigned char SPI_ReceiveByte(void); // SPI??????
- void SPI_CS_Low(void); // ??????
- void SPI_CS_High(void); // ??????
-
- unsigned char readData,readData1,readData2;
- // 25LC040???
- #define READ_INSTRUCTION 0x03 // ???(??25LC040,????????????)
- #define WRITE_INSTRUCTION 0x02 // ???(??,??????????)
- #define WREN_INSTRUCTION 0x06 // ?????
-
- // ????
- void EEPROM_WriteByte(unsigned char address, unsigned char date) {
- SPI_CS_Low(); // ??????
- SPI_SendByte(WREN_INSTRUCTION); // ???????
- SPI_CS_High(); // ??????,???????(??????)
-
- SPI_CS_Low(); // ????????
- SPI_SendByte(WRITE_INSTRUCTION); // ?????
- //SPI_SendByte((address >> 8) & 0xFF); // ???????(??25LC040,?????)
- SPI_SendByte(address); // ???????
- SPI_SendByte(date); // ????
- SPI_CS_High(); // ??????,?????
-
- // ???????????,?????EEPROM????
- }
-
- unsigned char EEPROM_ReadByte(unsigned char address) {
- unsigned char date;
-
- SPI_CS_Low(); // ??????
- SPI_SendByte(READ_INSTRUCTION); // ?????
- //SPI_SendByte((address >> 8) & 0xFF); // ???????(??25LC040,?????)
- SPI_SendByte(address ); // ???????
- date = SPI_ReceiveByte(); // ????
- SPI_CS_High(); // ??????,?????
-
- return date;
- }
- void EEPROM_ReadByte1(unsigned char address) {
- unsigned char date;
-
- SPI_CS_Low(); // ??????
- SPI_SendByte(READ_INSTRUCTION); // ?????
- //SPI_SendByte((address >> 8) & 0xFF); // ???????(??25LC040,?????)
- SPI_SendByte(address ); // ???????
- readData = SPI_ReceiveByte(); // ????
- readData1 = SPI_ReceiveByte();
- readData2 = SPI_ReceiveByte();
- SPI_CS_High(); // ??????,?????
-
- // return date;
- }
-
- void main(void) {
- uint i;
-
- SPI_Init(); // ???SPI??
-
- // ??:?????EEPROM
- EEPROM_WriteByte(0x00, 0xAB); // ???0x0000??0xAB
- for(i=0;i<10000;i++);
- EEPROM_WriteByte(0x01, 0x55); // ???0x0000??0xAB
- for(i=0;i<10000;i++);
- EEPROM_WriteByte(0x02, 0x66); // ???0x0000??0xAB
- for(i=0;i<10000;i++);
- // ??:?EEPROM????
- EEPROM_ReadByte1(0); // ???0x0000????
- P1= readData;
- _nop_();
- _nop_();
- //readData1 = EEPROM_ReadByte(0x01); // ???0x0000????
- P3= readData1;
- _nop_();
- _nop_();
- //readData2 = EEPROM_ReadByte(0x02); // ???0x0000????
- P0= readData2;
- // ?????????????????
-
- while (1) {
- // ???
- }
- }
-
- // ????????SPI???????
- void SPI_Init(void) {
- // ???SPI??,????????
- }
-
- void SPI_SendByte(unsigned char byte) {
- // ??SPI??????
- uchar i;
- for(i=0;i<8;i++)
- {
- SCK=0;
- _nop_();
- _nop_();
- if((byte&0x80)==0x80)
- SI=1;
- else
- SI=0;
- _nop_();
- _nop_();
- byte<<=1;
- SCK=1;
- _nop_();
- _nop_();
- }
- }
-
- unsigned char SPI_ReceiveByte(void) {
- // ??SPI??????
- uchar i,dat=0;
- for(i;i<8;i++)
- {
- dat<<=1;
- SCK=1; //第一位
- _nop_();
- _nop_();
- SCK=0;
- _nop_();
- _nop_();
- SO=1;
- if(SO)
- dat|=1;
-
- _nop_();
- _nop_();
-
- }
-
-
- return dat; // ??????????????
- }
-
- void SPI_CS_Low(void) {
- // ???????
- CS = 0; // ?????????P1.0??
- }
-
- void SPI_CS_High(void) {
- // ???????
- CS = 1; // ?????????P1.0??
- }
只有第一次读的是对的。
请问高手,哪里错了?谢谢
|