EEPROM AT24c02 [存儲(chǔ)\\讀取一個(gè)字節(jié)]
1 /*-----------------------------------------------
2 名稱(chēng):IIC協(xié)議 EEPROM24c02 存數(shù)讀取數(shù)據(jù)
3 內(nèi)容:此程序用于檢測(cè)EEPROM性能,測(cè)試方法如下:寫(xiě)入24c02一個(gè)數(shù)據(jù),然后在內(nèi)存中改變這些數(shù)據(jù),
4 掉電后主內(nèi)存將失去這些信息,然后從24c02中調(diào)入這些數(shù)據(jù)。看是否與寫(xiě)入的相同。這里用8個(gè)LED演示
5 函數(shù)是采用軟件延時(shí)的方法產(chǎn)生SCL脈沖,固對(duì)高晶振頻率要作 一定的修改....(本例是1us機(jī)器
6 周期,即晶振頻率要小于12MHZ)
7 ------------------------------------------------*/
8 #include
9 #include
10
11 #define _Nop() _nop_() //定義空指令
12 // 常,變量定義區(qū)
13 sbit SDA=P2^1; //模擬I2C數(shù)據(jù)傳送位
14 sbit SCL=P2^0; //模擬I2C時(shí)鐘控制位
15
16 bit ack; //應(yīng)答標(biāo)志位
17
18 void DelayUs2x(unsigned char t);//函數(shù)聲明
19 void DelayMs(unsigned char t);
20 /*------------------------------------------------
21 uS延時(shí)函數(shù),含有輸入?yún)?shù) unsigned char t,無(wú)返回值
22 unsigned char 是定義無(wú)符號(hào)字符變量,其值的范圍是
23 0~255 這里使用晶振12M,精確延時(shí)請(qǐng)使用匯編,大致延時(shí)
24 長(zhǎng)度如下 T=tx2+5 uS
25 ------------------------------------------------*/
26 void DelayUs2x(unsigned char t)
27 {
28 while(--t);
29 }
30 /*------------------------------------------------
31 mS延時(shí)函數(shù),含有輸入?yún)?shù) unsigned char t,無(wú)返回值
32 unsigned char 是定義無(wú)符號(hào)字符變量,其值的范圍是
33 0~255 這里使用晶振12M,精確延時(shí)請(qǐng)使用匯編
34 ------------------------------------------------*/
35 void DelayMs(unsigned char t)
36 {
37
38 while(t--)
39 {
40 //大致延時(shí)1mS
41 DelayUs2x(245);
42 DelayUs2x(245);
43 }
44 }
45
46 /*------------------------------------------------
47 啟動(dòng)總線(xiàn)
48 ------------------------------------------------*/
49 void Start_I2c()
50 {
51 SDA=1; //發(fā)送起始條件的數(shù)據(jù)信號(hào)
52 _Nop();
53 SCL=1;
54 _Nop(); //起始條件建立時(shí)間大于4.7us,延時(shí)
55 _Nop();
56 _Nop();
57 _Nop();
58 _Nop();
59 SDA=0; //發(fā)送起始信號(hào)
60 _Nop(); //起始條件鎖定時(shí)間大于4μ
61 _Nop();
62 _Nop();
63 _Nop();
64 _Nop();
65 SCL=0; //鉗住I2C總線(xiàn),準(zhǔn)備發(fā)送或接收數(shù)據(jù)
66 _Nop();
67 _Nop();
68 }
69 /*------------------------------------------------
70 結(jié)束總線(xiàn)
71 ------------------------------------------------*/
72 void Stop_I2c()
73 {
74 SDA=0; //發(fā)送結(jié)束條件的數(shù)據(jù)信號(hào)
75 _Nop(); //發(fā)送結(jié)束條件的時(shí)鐘信號(hào)
76 SCL=1; //結(jié)束條件建立時(shí)間大于4μ
77 _Nop();
78 _Nop();
79 _Nop();
80 _Nop();
81 _Nop();
82 SDA=1; //發(fā)送I2C總線(xiàn)結(jié)束信號(hào)
83 _Nop();
84 _Nop();
85 _Nop();
86 _Nop();
87 }
88
89
90
91
92 /*----------------------------------------------------------------
93 字節(jié)數(shù)據(jù)傳送函數(shù)
94 函數(shù)原型: void SendByte(unsigned char c);
95 功能: 將數(shù)據(jù)c發(fā)送出去,可以是地址,也可以是數(shù)據(jù),發(fā)完后等待應(yīng)答,并對(duì)
96 此狀態(tài)位進(jìn)行操作.(不應(yīng)答或非應(yīng)答都使ack=0 假)
97 發(fā)送數(shù)據(jù)正常,ack=1; ack=0表示被控器無(wú)應(yīng)答或損壞。
98 ------------------------------------------------------------------*/
99 void SendByte(unsigned char c)
100 {
101 unsigned char BitCnt;
102
103 for(BitCnt=0;BitCnt<8;BitCnt++) //要傳送的數(shù)據(jù)長(zhǎng)度為8位
104 {
105 if((c< 106 else SDA=0; 107 _Nop(); 108 SCL=1; //置時(shí)鐘線(xiàn)為高,通知被控器開(kāi)始接收數(shù)據(jù)位 109 _Nop(); 110 _Nop(); //保證時(shí)鐘高電平周期大于4μ 111 _Nop(); 112 _Nop(); 113 _Nop(); 114 SCL=0; 115 } 116 117 _Nop(); 118 _Nop(); 119 SDA=1; //8位發(fā)送完后釋放數(shù)據(jù)線(xiàn),準(zhǔn)備接收應(yīng)答位 120 _Nop(); 121 _Nop(); 122 SCL=1; 123 _Nop(); 124 _Nop(); 125 _Nop(); 126 if(SDA==1)ack=0; 127 else ack=1; //判斷是否接收到應(yīng)答信號(hào) 128 SCL=0; 129 _Nop(); 130 _Nop(); 131 } 132 /*---------------------------------------------------------------- 133 字節(jié)數(shù)據(jù)傳送函數(shù) 134 函數(shù)原型: unsigned char RcvByte(); 135 功能: 用來(lái)接收從器件傳來(lái)的數(shù)據(jù),并判斷總線(xiàn)錯(cuò)誤(不發(fā)應(yīng)答信號(hào)), 136 發(fā)完后請(qǐng)用應(yīng)答函數(shù)。 137 ------------------------------------------------------------------*/ 138 unsigned char RcvByte() 139 { 140 unsigned char retc; 141 unsigned char BitCnt; 142 143 retc=0; 144 SDA=1; //置數(shù)據(jù)線(xiàn)為輸入方式 145 for(BitCnt=0;BitCnt<8;BitCnt++) 146 { 147 _Nop(); 148 SCL=0; //置時(shí)鐘線(xiàn)為低,準(zhǔn)備接收數(shù)據(jù)位 149 _Nop(); 150 _Nop(); //時(shí)鐘低電平周期大于4.7us 151 _Nop(); 152 _Nop(); 153 _Nop(); 154 SCL=1; //置時(shí)鐘線(xiàn)為高使數(shù)據(jù)線(xiàn)上數(shù)據(jù)有效 155 _Nop(); 156 _Nop(); 157 retc=retc<<1; 158 if(SDA==1)retc=retc+1; //讀數(shù)據(jù)位,接收的數(shù)據(jù)位放入retc中 159 _Nop(); 160 _Nop(); 161 } 162 SCL=0; 163 _Nop(); 164 _Nop(); 165 return(retc); 166 } 167 168 169 170 /*---------------------------------------------------------------- 171 應(yīng)答子函數(shù) 172 原型: void Ack_I2c(void); 173 ----------------------------------------------------------------*/ 174 void Ack_I2c(void) 175 { 176 177 SDA=0; 178 _Nop(); 179 _Nop(); 180 _Nop(); 181 SCL=1; 182 _Nop(); 183 _Nop(); //時(shí)鐘低電平周期大于4μ 184 _Nop(); 185 _Nop(); 186 _Nop(); 187 SCL=0; //清時(shí)鐘線(xiàn),鉗住I2C總線(xiàn)以便繼續(xù)接收 188 _Nop(); 189 _Nop(); 190 } 191 /*---------------------------------------------------------------- 192 非應(yīng)答子函數(shù) 193 原型: void NoAck_I2c(void); 194 ----------------------------------------------------------------*/ 195 void NoAck_I2c(void) 196 { 197 198 SDA=1; 199 _Nop(); 200 _Nop(); 201 _Nop(); 202 SCL=1; 203 _Nop(); 204 _Nop(); //時(shí)鐘低電平周期大于4μ 205 _Nop(); 206 _Nop(); 207 _Nop(); 208 SCL=0; //清時(shí)鐘線(xiàn),鉗住I2C總線(xiàn)以便繼續(xù)接收 209 _Nop(); 210 _Nop();