日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[51单片机] EEPROM 24c02 [I2C代码封装-保存实现流水灯]

發布時間:2024/4/15 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [51单片机] EEPROM 24c02 [I2C代码封装-保存实现流水灯] 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?

這里把EEPROM 24c02封裝起來,今后可以直接調用,其連線方式為:SDA-P2.1;SCL-P2.0;WP-VCC

>_<:i2c.c

1 /*----------------------------------------------- 2 名稱:IIC協議 3 內容:函數是采用軟件延時的方法產生SCL脈沖,固對高晶振頻率要作 一定的修改....(本例是1us機器 4 周期,即晶振頻率要小于12MHZ) 5 ------------------------------------------------*/ 6 #include "i2c.h" 7 #define _Nop() _nop_() //定義空指令 8 bit ack; //應答標志位 9 sbit SDA=P2^1; 10 sbit SCL=P2^0; 11 /*------------------------------------------------ 12 uS延時函數,含有輸入參數 unsigned char t,無返回值 13 unsigned char 是定義無符號字符變量,其值的范圍是 14 0~255 這里使用晶振12M,精確延時請使用匯編,大致延時 15 長度如下 T=tx2+5 uS 16 ------------------------------------------------*/ 17 void DelayUs2x(unsigned char t) 18 { 19 while(--t); 20 } 21 /*------------------------------------------------ 22 mS延時函數,含有輸入參數 unsigned char t,無返回值 23 unsigned char 是定義無符號字符變量,其值的范圍是 24 0~255 這里使用晶振12M,精確延時請使用匯編 25 ------------------------------------------------*/ 26 void DelayMs(unsigned char t) 27 { 28 while(t--) 29 { 30 //大致延時1mS 31 DelayUs2x(245); 32 DelayUs2x(245); 33 } 34 } 35 /*------------------------------------------------ 36 啟動總線 37 ------------------------------------------------*/ 38 void Start_I2c() 39 { 40 SDA=1; //發送起始條件的數據信號 41 _Nop(); 42 SCL=1; 43 _Nop(); //起始條件建立時間大于4.7us,延時 44 _Nop(); 45 _Nop(); 46 _Nop(); 47 _Nop(); 48 SDA=0; //發送起始信號 49 _Nop(); //起始條件鎖定時間大于4μ 50 _Nop(); 51 _Nop(); 52 _Nop(); 53 _Nop(); 54 SCL=0; //鉗住I2C總線,準備發送或接收數據 55 _Nop(); 56 _Nop(); 57 } 58 /*------------------------------------------------ 59 結束總線 60 ------------------------------------------------*/ 61 void Stop_I2c() 62 { 63 SDA=0; //發送結束條件的數據信號 64 _Nop(); //發送結束條件的時鐘信號 65 SCL=1; //結束條件建立時間大于4μ 66 _Nop(); 67 _Nop(); 68 _Nop(); 69 _Nop(); 70 _Nop(); 71 SDA=1; //發送I2C總線結束信號 72 _Nop(); 73 _Nop(); 74 _Nop(); 75 _Nop(); 76 } 77 /*---------------------------------------------------------------- 78 字節數據傳送函數 79 函數原型: void SendByte(unsigned char c); 80 功能: 將數據c發送出去,可以是地址,也可以是數據,發完后等待應答,并對 81 此狀態位進行操作.(不應答或非應答都使ack=0 假) 82 發送數據正常,ack=1; ack=0表示被控器無應答或損壞。 83 ------------------------------------------------------------------*/ 84 void SendByte(unsigned char c) 85 { 86 unsigned char BitCnt; 87 for(BitCnt=0;BitCnt<8;BitCnt++) //要傳送的數據長度為8位 88 { 89 if((c<<BitCnt)&0x80)SDA=1; //判斷發送位 90 else SDA=0; 91 _Nop(); 92 SCL=1; //置時鐘線為高,通知被控器開始接收數據位 93 _Nop(); 94 _Nop(); //保證時鐘高電平周期大于4μ 95 _Nop(); 96 _Nop(); 97 _Nop(); 98 SCL=0; 99 } 100 _Nop(); 101 _Nop(); 102 SDA=1; //8位發送完后釋放數據線,準備接收應答位 103 _Nop(); 104 _Nop(); 105 SCL=1; 106 _Nop(); 107 _Nop(); 108 _Nop(); 109 if(SDA==1)ack=0; 110 else ack=1; //判斷是否接收到應答信號 111 SCL=0; 112 _Nop(); 113 _Nop(); 114 } 115 /*---------------------------------------------------------------- 116 字節數據傳送函數 117 函數原型: unsigned char RcvByte(); 118 功能: 用來接收從器件傳來的數據,并判斷總線錯誤(不發應答信號), 119 發完后請用應答函數。 120 ------------------------------------------------------------------*/ 121 unsigned char RcvByte() 122 { 123 unsigned char retc; 124 unsigned char BitCnt; 125 126 retc=0; 127 SDA=1; //置數據線為輸入方式 128 for(BitCnt=0;BitCnt<8;BitCnt++) 129 { 130 _Nop(); 131 SCL=0; //置時鐘線為低,準備接收數據位 132 _Nop(); 133 _Nop(); //時鐘低電平周期大于4.7us 134 _Nop(); 135 _Nop(); 136 _Nop(); 137 SCL=1; //置時鐘線為高使數據線上數據有效 138 _Nop(); 139 _Nop(); 140 retc=retc<<1; 141 if(SDA==1)retc=retc+1; //讀數據位,接收的數據位放入retc中 142 _Nop(); 143 _Nop(); 144 } 145 SCL=0; 146 _Nop(); 147 _Nop(); 148 return(retc); 149 } 150 /*---------------------------------------------------------------- 151 應答子函數 152 原型: void Ack_I2c(void); 153 ----------------------------------------------------------------*/ 154 void Ack_I2c(void) 155 { 156 SDA=0; 157 _Nop(); 158 _Nop(); 159 _Nop(); 160 SCL=1; 161 _Nop(); 162 _Nop(); //時鐘低電平周期大于4μ 163 _Nop(); 164 _Nop(); 165 _Nop(); 166 SCL=0; //清時鐘線,鉗住I2C總線以便繼續接收 167 _Nop(); 168 _Nop(); 169 } 170 /*---------------------------------------------------------------- 171 非應答子函數 172 原型: void NoAck_I2c(void); 173 ----------------------------------------------------------------*/ 174 void NoAck_I2c(void) 175 { 176 SDA=1; 177 _Nop(); 178 _Nop(); 179 _Nop(); 180 SCL=1; 181 _Nop(); 182 _Nop(); //時鐘低電平周期大于4μ 183 _Nop(); 184 _Nop(); 185 _Nop(); 186 SCL=0; //清時鐘線,鉗住I2C總線以便繼續接收 187 _Nop(); 188 _Nop(); 189 } 190 /*---------------------------------------------------------------- 191 向無子地址器件發送字節數據函數 192 函數原型: bit ISendByte(unsigned char sla,ucahr c); 193 功能: 從啟動總線到發送地址,數據,結束總線的全過程,從器件地址sla. 194 如果返回1表示操作成功,否則操作有誤。 195 注意: 使用前必須已結束總線。 196 ----------------------------------------------------------------*/ 197 /*bit ISendByte(unsigned char sla,unsigned char c) 198 { 199 Start_I2c(); //啟動總線 200 SendByte(sla); //發送器件地址 201 if(ack==0)return(0); 202 SendByte(c); //發送數據 203 if(ack==0)return(0); 204 Stop_I2c(); //結束總線 205 return(1); 206 } 207 */ 208 /*---------------------------------------------------------------- 209 向有子地址器件發送多字節數據函數 210 函數原型: bit ISendStr(unsigned char sla,unsigned char suba,ucahr *s,unsigned char no); 211 功能: 從啟動總線到發送地址,子地址,數據,結束總線的全過程,從器件 212 地址sla,子地址suba,發送內容是s指向的內容,發送no個字節。 213 如果返回1表示操作成功,否則操作有誤。 214 注意: 使用前必須已結束總線。 215 ----------------------------------------------------------------*/ 216 bit ISendStr(unsigned char sla,unsigned char suba,unsigned char *s,unsigned char no) 217 { 218 unsigned char i; 219 for(i=0;i<no;i++) 220 { 221 Start_I2c(); //啟動總線 222 SendByte(sla); //發送器件地址 223 if(ack==0)return(0); 224 SendByte(suba); //發送器件子地址 225 if(ack==0)return(0); 226 227 SendByte(*s); //發送數據 228 229 if(ack==0)return(0); 230 Stop_I2c(); //結束總線 231 DelayMs(2); //必須延時等待芯片內部自動處理數據完畢 232 s++; 233 suba++; 234 } 235 return(1); 236 } 237 238 /*---------------------------------------------------------------- 239 向無子地址器件讀字節數據函數 240 函數原型: bit IRcvByte(unsigned char sla,ucahr *c); 241 功能: 從啟動總線到發送地址,讀數據,結束總線的全過程,從器件地 242 址sla,返回值在c. 243 如果返回1表示操作成功,否則操作有誤。 244 注意: 使用前必須已結束總線。 245 ----------------------------------------------------------------*/ 246 /*bit IRcvByte(unsigned char sla,unsigned char *c) 247 { 248 Start_I2c(); //啟動總線 249 SendByte(sla+1); //發送器件地址 250 if(ack==0)return(0); 251 *c=RcvByte(); //讀取數據 252 NoAck_I2c(); //發送非就答位 253 Stop_I2c(); //結束總線 254 return(1); 255 } 256 */ 257 /*---------------------------------------------------------------- 258 向有子地址器件讀取多字節數據函數 259 函數原型: bit ISendStr(unsigned char sla,unsigned char suba,ucahr *s,unsigned char no); 260 功能: 從啟動總線到發送地址,子地址,讀數據,結束總線的全過程,從器件 261 地址sla,子地址suba,讀出的內容放入s指向的存儲區,讀no個字節。 262 如果返回1表示操作成功,否則操作有誤。 263 注意: 使用前必須已結束總線。 264 ----------------------------------------------------------------*/ 265 bit IRcvStr(unsigned char sla,unsigned char suba,unsigned char *s,unsigned char no) 266 { 267 unsigned char i; 268 269 Start_I2c(); //啟動總線 270 SendByte(sla); //發送器件地址 271 if(ack==0)return(0); 272 SendByte(suba); //發送器件子地址 273 if(ack==0)return(0); 274 275 Start_I2c(); 276 SendByte(sla+1); 277 if(ack==0)return(0); 278 279 for(i=0;i<no-1;i++) 280 { 281 *s=RcvByte(); //發送數據 282 Ack_I2c(); //發送就答位 283 s++; 284 } 285 *s=RcvByte(); 286 NoAck_I2c(); //發送非應位 287 Stop_I2c(); //結束總線 288 return(1); 289 }

>_<:i2c.h

1 /*----------------------------------------------- 2 名稱:IIC協議 頭文件 3 ------------------------------------------------*/ 4 #ifndef __I2C_H__ 5 #define __I2C_H__ 6 #include <reg52.h> //頭文件的包含 7 #include <intrins.h> 8 #define _Nop() _nop_() //定義空指令 9 /*----------------------------------------------- 10 uS延時函數,含有輸入參數 unsigned char t,無返回值 11 unsigned char 是定義無符號字符變量,其值的范圍是 12 0~255 這里使用晶振12M,精確延時請使用匯編,大致延時 13 長度如下 T=tx2+5 uS 14 ------------------------------------------------*/ 15 void DelayUs2x(unsigned char t); 16 /*------------------------------------------------ 17 mS延時函數,含有輸入參數 unsigned char t,無返回值 18 unsigned char 是定義無符號字符變量,其值的范圍是 19 0~255 這里使用晶振12M,精確延時請使用匯編 20 ------------------------------------------------*/ 21 void DelayMs(unsigned char t); 22 /*------------------------------------------------ 23 啟動總線 24 ------------------------------------------------*/ 25 void Start_I2c(); 26 /*------------------------------------------------ 27 結束總線 28 ------------------------------------------------*/ 29 void Stop_I2c(); 30 /*---------------------------------------------------------------- 31 字節數據傳送函數 32 函數原型: void SendByte(unsigned char c); 33 功能: 將數據c發送出去,可以是地址,也可以是數據,發完后等待應答,并對 34 此狀態位進行操作.(不應答或非應答都使ack=0 假) 35 發送數據正常,ack=1; ack=0表示被控器無應答或損壞。 36 ------------------------------------------------------------------*/ 37 void SendByte(unsigned char c); 38 /*---------------------------------------------------------------- 39 字節數據傳送函數 40 函數原型: unsigned char RcvByte(); 41 功能: 用來接收從器件傳來的數據,并判斷總線錯誤(不發應答信號), 42 發完后請用應答函數。 43 ------------------------------------------------------------------*/ 44 unsigned char RcvByte(); 45 /*---------------------------------------------------------------- 46 應答子函數 47 原型: void Ack_I2c(void); 48 ----------------------------------------------------------------*/ 49 void Ack_I2c(void); 50 /*---------------------------------------------------------------- 51 非應答子函數 52 原型: void NoAck_I2c(void); 53 ----------------------------------------------------------------*/ 54 void NoAck_I2c(void); 55 /*---------------------------------------------------------------- 56 向無子地址器件發送字節數據函數 57 函數原型: bit ISendByte(unsigned char sla,ucahr c); 58 功能: 從啟動總線到發送地址,數據,結束總線的全過程,從器件地址sla. 59 如果返回1表示操作成功,否則操作有誤。 60 注意: 使用前必須已結束總線。 61 ----------------------------------------------------------------*/ 62 bit ISendByte(unsigned char sla,unsigned char c); 63 64 /*---------------------------------------------------------------- 65 向有子地址器件發送多字節數據函數 66 函數原型: bit ISendStr(unsigned char sla,unsigned char suba,ucahr *s,unsigned char no); 67 功能: 從啟動總線到發送地址,子地址,數據,結束總線的全過程,從器件 68 地址sla,子地址suba,發送內容是s指向的內容,發送no個字節。 69 如果返回1表示操作成功,否則操作有誤。 70 注意: 使用前必須已結束總線。 71 ----------------------------------------------------------------*/ 72 bit ISendStr(unsigned char sla,unsigned char suba,unsigned char *s,unsigned char no); 73 /*---------------------------------------------------------------- 74 向無子地址器件讀字節數據函數 75 函數原型: bit IRcvByte(unsigned char sla,ucahr *c); 76 功能: 從啟動總線到發送地址,讀數據,結束總線的全過程,從器件地 77 址sla,返回值在c. 78 如果返回1表示操作成功,否則操作有誤。 79 注意: 使用前必須已結束總線。 80 ----------------------------------------------------------------*/ 81 bit IRcvByte(unsigned char sla,unsigned char *c); 82 /*---------------------------------------------------------------- 83 向有子地址器件讀取多字節數據函數 84 函數原型: bit ISendStr(unsigned char sla,unsigned char suba,ucahr *s,unsigned char no); 85 功能: 從啟動總線到發送地址,子地址,讀數據,結束總線的全過程,從器件 86 地址sla,子地址suba,讀出的內容放入s指向的存儲區,讀no個字節。 87 如果返回1表示操作成功,否則操作有誤。 88 注意: 使用前必須已結束總線。 89 ----------------------------------------------------------------*/ 90 bit IRcvStr(unsigned char sla,unsigned char suba,unsigned char *s,unsigned char no); 91 #endif

>_<:下面是main函數中如何調用封裝好的函數來實現流水燈的效果的:
>_<:流水燈8個的連線這里用的是P1

1 /*----------------------------------------------- 2 名稱:IIC協議 24c02存儲花樣燈程序 3 內容:將表格內容寫入24c02,然后批量刪除這些數據, 4 并從24c02中讀取數據并顯示 5 ------------------------------------------------*/ 6 #include <reg52.h> 7 #include "i2c.h" 8 /*------------------------------------------------ 9 花樣燈表格 10 ------------------------------------------------*/ 11 unsigned char dat[]={0x7f,0xbf,0xdf,0xef, 12 0xf7,0xfb,0xfd,0xfe, 13 0xff,0xff,0x00,0x00, 14 0x55,0x55,0xaa,0xaa 15 };//ram允許情況可以無限添加 16 /*------------------------------------------------ 17 主函數 18 ------------------------------------------------*/ 19 main() 20 { 21 //bit flag; 22 unsigned char i; 23 ISendStr(0xae,80,dat,16); //寫入24c02 24 DelayMs(1); //寫入后必須延時等待24c02內部 25 //燒錄數據處理完畢方可繼續其他操作 26 for(i=0;i<16;i++) //清除數據 27 dat[i]=0; 28 IRcvStr(0xae,80,dat,16); //從24c02讀出數據 29 while(1) 30 { 31 for(i=0;i<16;i++) //查表 32 { 33 DelayMs(200); 34 P1=dat[i]; 35 } 36 } 37 }

?

?

轉載于:https://www.cnblogs.com/zjutlitao/p/3704072.html

總結

以上是生活随笔為你收集整理的[51单片机] EEPROM 24c02 [I2C代码封装-保存实现流水灯]的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。