| 
  |||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機 | DSP技術(shù) | MCU技術(shù) | IC 設計 | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe  | 
  
I2C 原程序 | 
  
| 作者:kfawj 欄目:單片機 | 
/*以下程是按周立功網(wǎng)上的例程做的,也24C32通訊的程序 晶振12M,MCU 89S52,但不知為什么總是不是返ACK信號。 輸入與輸出就更不用說了。哪位大俠可以幫忙指導一下,不勝感激!*/ #include <REG51.h> #include <intrins.h> void Delay_24C(void); void Start_24C(void); void Stop_24C(void); bit Send_Char(unsigned CHAR); unsigned CHAR Rece_Char(void); bit Write_Data(unsigned CHAR,unsigned CHAR,unsigned CHAR); unsigned CHAR Read_Data(unsigned CHAR,unsigned CHAR); sbit SCL=P0^7; sbit SDA=P0^6; void main() { unsigned CHAR i,j; unsigned CHAR xx; i=j=0; while(1){ //j++; xx=0; Write_Data(0x00,i,0x55); xx=Read_Data(0x00,i++); _nop_(); } } /*void Delay_24C() { _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); }*/ void Start_24C(void) { SDA=1; _nop_(); SCL=1; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); //Delay_24C(); SDA=0; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); //Delay_24C(); SCL=0; _nop_(); _nop_(); } void Stop_24C(void) { SDA=0; _nop_(); SCL=1; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); //Delay_24C(); SDA=1; _nop_(); _nop_(); _nop_(); _nop_(); //Delay_24C(); } bit Send_Char(unsigned CHAR ch) { auto unsigned CHAR i; for(i=0;i<8;i++){ if((ch<<i)& 0x80) SDA=1; else SDA=0; _nop_(); SCL=1; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); //Delay_24C(); SCL=0; } _nop_(); _nop_(); SDA=1; _nop_(); _nop_(); SCL=1; _nop_(); _nop_(); _nop_(); //Delay_24C(); if(SDA==1) i=0; else i=1; SCL=0; _nop_(); _nop_(); return(i); } unsigned CHAR Rece_Char() { auto unsigned CHAR i,j; j=0; SDA=1; for(i=0;i<8;i++){ _nop_(); SCL=0; //Delay_24C(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); SCL=1; _nop_(); _nop_(); j=j<<1; if(SDA==1) j++; _nop_(); _nop_(); } SCL=0; _nop_(); _nop_(); return(j); } bit Write_Data(unsigned CHAR ch1,unsigned CHAR ch2,unsigned CHAR ch) { auto unsigned CHAR i; i=1; Start_24C(); do{ i=ch1 & 0x70; i=i>>3; i=i & 0x0E; i=i | 0xA0; i=Send_Char(i); }while(!i); if(!i) return(0); do{ i=ch1 & 0x0F; i=Send_Char(i); }while(!i); if(!i) return(0); do{ i=1; i=Send_Char(ch2); }while(!i); if(!i) return(0); do{ i=Send_Char(ch); }while(!i); if(!i) return(0); Stop_24C(); return(1); } unsigned CHAR Read_Data(unsigned CHAR ch1,unsigned CHAR ch2) { auto unsigned CHAR i,j; i=1; Start_24C(); do{ j=ch1 & 0x70; j=j>>3; j=j & 0x0E; j=j | 0xA0; i=Send_Char(j); }while(!i); if(!i) return(0); do{ j=ch1 & 0x0F; i=Send_Char(j); }while(!i); if(!i) return(0); do{ i=1; i=Send_Char(ch2); }while(!i); if(!i) return(0); Start_24C(); do{ j=ch1 & 0x70; j=j>>3; &  | 
  
| 2樓: | >>參與討論 | 
| 作者: iC921 于 2006/4/15 0:45:00 發(fā)布:
         但不知為什么總是不是返ACK信號……  | 
  |
| 3樓: | >>參與討論 | 
| 作者: hotpower 于 2006/4/15 1:26:00 發(fā)布:
         從地址不對或時序不對肯定不能返回ACK信號  | 
  |
| 4樓: | >>參與討論 | 
| 作者: kfawj 于 2006/4/17 9:51:00 發(fā)布:
         to: IC921 如果沒有ACK返回信號怎么進行下面的操作呢?  | 
  |
| 5樓: | >>參與討論 | 
| 作者: kfawj 于 2006/4/17 9:57:00 發(fā)布:
         to:hotpower 我就是不知道哪里不對呀? 程序基本上完全按周立功網(wǎng)上提供的資料寫的,但就是不能正常的完成讀寫。整個板子的其他控制程序都跑通了,就這兩個子程序就是跑不過去。 現(xiàn)在,整個程序就一個寫數(shù)據(jù),和寫0x55了;還是不能正常運行。還請大俠不惜指教一下。 小弟在此謝過了!  | 
  |
| 6樓: | >>參與討論 | 
| 作者: kfawj 于 2006/4/19 11:51:00 發(fā)布:
         謝謝樓上的兩位。問題解決了。 程序沒有任何問題。 電路也沒有錯誤。 是仿真器的問題,不知道為什么就是不能仿真?我用的是偉福的E6000/L。  | 
  |
  | 
    
 
  | 
  
| 免費注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點此進入 | 
Copyright © 1998-2006 www.udpf.com.cn 浙ICP證030469號  |