24c256.c
上传用户:liao132
上传日期:2020-09-03
资源大小:26k
文件大小:6k
源码类别:

PropertySheet

开发平台:

C++ Builder

  1. /*编辑:赵大帅*/
  2. /*日期:2009-04-12*/
  3. /////////////////////////////////
  4. /*修改:XXX*/
  5. /*日期:XX-XX-XX*/
  6. /////////////////////////////////////////////////////////////////
  7. /*本文档是基于C8051F330单片机的EEPROM 24C512和时钟芯片FCP8563
  8. 的驱动程序,本文档可以对24C512实现单字节读写、多字节读写,还可
  9. 以实现对FCP8563的初始化和读操作;可以通过串口对24C512和FCP8563
  10. 进行调试查看*/
  11. /////////////////////////////////////////////////////////////////
  12. #include <c8051f330.h>
  13. //////////////////I2C接口
  14. sbit SCL=P0^6;
  15. sbit SDA=P0^0;
  16. ///////////////////////////////////////
  17. /*延时子程序:delay()*/
  18. /*输入参数:num1,num2*///设定延时时间
  19. /*输出参数:无*/
  20. /*返回:无*/
  21. void delay(unsigned char char1,unsigned int int1)
  22. {
  23. unsigned char j;
  24. unsigned int i;
  25.   for(j=0;j<char1;j++)
  26. {
  27. for(i=0;i<int1;i++)
  28. {
  29. }
  30. }
  31. }
  32. ////////////////////////////////////////
  33. /*IO初始化:IO_Init()*/
  34. /*输入参数:无*/
  35. /*输出参数:无*/
  36. /*返回:无*/
  37. void Io_init(void)
  38. {
  39. XBR0 =0x01;//USART 使能
  40. XBR1    =0X40;
  41. P0MDIN =0xF3;//P02、P03为模拟输入;其余为数字输入
  42. P0MDOUT =0x3e;//P04、P05为推挽输出;P06、P07为漏极开路输出
  43. P0SKIP =0xCF;
  44. P1MDIN =0xFF;//P1均为数字输入
  45. P1MDOUT =0xC7;//P13,P14,P15为漏极开路输出,P10,P11,P12为推挽输出
  46. P1SKIP =0xFF;
  47. }
  48. ///////////////////////////////////////
  49. /*晶振初始化:oscillator()*/
  50. /*输入参数:无*/
  51. /*输出参数:无*/
  52. /*返回:无*/
  53. void oscillator()
  54. OSCXCN  =0x67;//开启外部震荡(晶体振荡器方式,12MHZ)
  55.   while((OSCXCN & 0x80)  ==0X00 ){} //判断XTLVLD:晶体振荡器S是否工作稳定?
  56.   CLKSEL =0x01; //切换到外部晶振
  57. }
  58. /////////////////////////////////
  59. void WDT_reset()
  60. {
  61. PCA0MD =0x08;
  62. PCA0CPL2 =0xFF;
  63. PCA0H =PCA0L =0x00;
  64. PCA0MD =0x41;
  65. PCA0CPH2 =0x00;
  66. }
  67. /*起始位:I2C_Start()*/
  68. /*输入参数:无*/
  69. /*输出参数:无*/
  70. /*返回:无*/
  71. void I2C_Start()
  72. {
  73. SCL =1;
  74. SDA =1;
  75. delay(1,20);
  76. SDA =0;
  77. delay(1,20);
  78. WDT_reset();
  79. }
  80. ////////////////////////////////
  81. /*停止位:I2C_Stop()*/
  82. /*输入参数:无*/
  83. /*输出参数:无*/
  84. /*返回:无*/
  85. void I2C_Stop()
  86. {
  87. SCL =1;
  88. SDA =0;
  89. delay(1,20);
  90. SDA =1;
  91. delay(1,20);
  92. WDT_reset();
  93. // SCL =0;
  94. }
  95. ////////////////////////////////
  96. /*接受应答位:I2C_Receive_ACK()*/
  97. /*输入参数:无*/
  98. /*输出参数:无*/
  99. /*返回:无*/
  100. void I2C_Receive_ACK()
  101. {
  102. SCL =0;
  103. delay(1,20);
  104. SCL =1;
  105. delay(1,20);
  106. /*
  107. if(!SDA)
  108. {
  109. UART_send(0xAA);
  110. }
  111. */
  112. SCL =0;
  113. }
  114. ////////////////////////////////
  115. /*发送应答位:I2C_Send_ACK()*/
  116. /*输入参数:无*/
  117. /*输出参数:无*/
  118. /*返回:无*/
  119. void I2C_Send_ACK()
  120. {
  121. SCL =0;
  122. SDA =0;
  123. delay(1,20);
  124. SCL =1;
  125. delay(1,20);
  126. SCL =0;
  127. SDA =1;
  128. }
  129. ////////////////////////////////
  130. /*发送非应答位:I2C_Send_NOACK()*/
  131. /*输入参数:无*/
  132. /*输出参数:无*/
  133. /*返回:无*/
  134. void I2C_Send_NOACK()
  135. {
  136. SCL =0;
  137. SDA =1;
  138. delay(1,20);
  139. SCL =1;
  140. delay(1,20);
  141. SCL =0;
  142. }
  143. ////////////////////////////////
  144. /*写一个字节数据到24CXXX:I2Cwrite_byte_to24C256()*/
  145. /*输入参数:dat*///写24C512一个字节
  146. /*输出参数:无*/
  147. /*返回:无*/
  148. void I2Cwrite_byte_to24C256(unsigned char dat)
  149. {
  150. unsigned char i;
  151. for(i=0;i<8;i++)
  152. {
  153. SCL =0;
  154. if(dat & 0x80)
  155. {
  156. SDA =1;
  157. }
  158. else
  159. {
  160. SDA =0;
  161. }
  162. delay(1,20);
  163. SCL =1;
  164. delay(1,20);
  165. dat<<=1;
  166. }
  167. SCL =0;
  168. }
  169. ////////////////////////////////
  170. /*从24C256读一个字节的数据:I2Cread_byte_from24C256()*/
  171. /*输入参数:无*/
  172. /*输出参数:无*/
  173. /*返回:无*/
  174. unsigned char I2Cread_byte_from24C256()
  175. {
  176. unsigned char i;
  177. unsigned char dat;
  178. for(i=0;i<8;i++)
  179. {
  180. SCL =0;
  181. delay(1,20);
  182. SCL =1;
  183. if(SDA)
  184. {
  185. dat =(dat<<1)+1;
  186. }
  187. else
  188. {
  189. dat =dat<<1;
  190. }
  191. }
  192. SCL =0;
  193. return dat;
  194. }
  195. /////////////////////////////
  196. /*随机读24C256  n个字节的数据*/
  197. /*输入参数:I2C_add,addr*///I2C_add:24C512地址,addr:读EEPROM起始地址,num:字节个数
  198. /*输出参数:da*///数组首地址
  199. /*返回:无*/
  200. void READ_24C256(unsigned char I2C_add,unsigned int addr,unsigned char *da,unsigned char num)
  201. { unsigned char i;
  202. unsigned char buffer1,buffer2;
  203. buffer2=addr;//地址低8位
  204. buffer1=(addr>>8);//地址高8位
  205. I2C_Start();
  206. I2Cwrite_byte_to24C256(I2C_add);
  207. I2C_Receive_ACK(); //(sun)主机只发送脉冲,并不监测数据位
  208. I2Cwrite_byte_to24C256(buffer1);
  209. I2C_Receive_ACK();
  210. I2Cwrite_byte_to24C256(buffer2);
  211. I2C_Receive_ACK();
  212. I2C_Start();
  213. I2Cwrite_byte_to24C256((I2C_add|0x01));
  214. I2C_Receive_ACK();
  215. for(i=0;i<(num-1);i++)
  216. {
  217. *da=I2Cread_byte_from24C256();
  218. I2C_Send_ACK();
  219. da++;
  220. }
  221. *da=I2Cread_byte_from24C256();
  222. I2C_Send_NOACK();
  223. I2C_Stop();
  224. }
  225. ///////////////////////////////////////////////
  226. /*写24C256  n个字节的数据*/
  227. /*输入参数:I2C_add,addr*///I2C_add:24C512地址,addr:写EEPROM起始地址,da:数组首地址,num:字节数
  228. /*输出参数:无*/
  229. /*返回:无*/
  230. void WRITE_24C256(unsigned char I2C_add,unsigned int addr,unsigned char *da,unsigned char num)
  231. {
  232. unsigned char i;
  233. unsigned char buffer1,buffer2;
  234. buffer2=addr;//地址低8位
  235. buffer1=(addr>>8);//地址高8位
  236. I2C_Start();
  237. I2Cwrite_byte_to24C256(I2C_add);
  238. I2C_Receive_ACK();
  239. I2Cwrite_byte_to24C256(buffer1);
  240. I2C_Receive_ACK();
  241. I2Cwrite_byte_to24C256(buffer2);
  242. I2C_Receive_ACK();
  243. for(i=0;i<num;i++)
  244. {
  245. I2Cwrite_byte_to24C256(*da);
  246. I2C_Receive_ACK();
  247. da++;
  248. }
  249. I2C_Stop();
  250. }
  251. ///////////////////////////////////////
  252. /*波特率设置:Band_Init()*/
  253. /*输入参数:band///设定串口通信波特率
  254. /*输出参数:无*/
  255. /*返回:无*/
  256. void Band_init(unsigned char band)
  257. {
  258. TH1=TL1 =band;//9600:0xB8;14400:0xD0;28800:0xE8;57600:0xF4;115200:0xFA;230400:0xFD
  259. CKCON |=(1<<1)|(1<<0);//T1适用外部时钟8分频
  260. TMOD =0x20;//T1采用8位自动重装方式
  261. TCON =0x40;//T1允许,中断不使能
  262. }
  263. ///////////////////////////////////////
  264. /*UART初始化:UART_init()*/
  265. /*输入参数:无*/
  266. /*输出参数:无*/
  267. /*返回:无*/
  268. void UART_init()
  269. {
  270. SCON0=0x10; //允许接收
  271. ES0=1; //UART0中断允许
  272. }
  273. ///////////////////////////////////////
  274. /*发送数据:USART_Send()*/
  275. /*输入参数:KEY_DATA///UART发送的数据
  276. /*输出参数:无*/
  277. /*返回:无*/
  278. /*void UART_send(char c) 
  279. {
  280. SBUF0  = c;
  281.   while (!TI0);
  282.   TI0  = 0;
  283. }*/
  284. ///////////////////////////////////////////////////////////////////
  285. int main()
  286. {
  287. unsigned char a[6]={2,2,3,4,5,6};
  288. unsigned char b[6]={1,1,1,1,1,1};
  289. unsigned int ad=0;    
  290. PCA0MD=0x08; //关开门狗
  291. Io_init(); //IO初始化
  292. oscillator(); //晶振初始化
  293. Band_init(0xB8); //波特率设置
  294. UART_init();
  295. // for(i=0;i<512;i++) //串口初始化
  296. // {
  297. WRITE_24C256(0xA0,10,a,64);
  298. delay(10,1000);
  299. // ad+=64;
  300. // }
  301. READ_24C256(0xA0,10,b,6);
  302. delay(10,1000);
  303. return 0;
  304. }