|
|
| | -文章搜索 - 最新文章 - | |
第411篇:24C01的IIC 读写的c51程序 |
| 发布时间:2001年10月16日 点击次数:7710 |
| 来源: 作者: |
为了安全起见,程序中很多NOP是冗余的,希望读者能进一步精简,但必须经过验证。 Atmel 24C01 比较特殊,为简约型. 51晶振为11.0592MHz 〖参考〗http://www.c51bbs.com 〖版本〗V1.00A Build 0918 -----------------------------------------------------------------------------*/ #include "reg51.h" #include "intrins.h" sbit SCL= P1^5; sbit SDA= P1^4; delay() { unsigned int i=1200; while(i--); } /*---------------------------------------------------------------------------- 调用方式:write_8bit(unsigned char ch) ﹫2001/03/23 函数说明:内函数,私有,用户不直接调用。 ------------------------------------------------------------------------------- */ void write_8bit(unsigned char ch) { unsigned char i=8; SCL=0; _nop_();_nop_();_nop_();_nop_();_nop_(); while (i--) { SDA=(bit)(ch&0x80); _nop_();_nop_();_nop_();_nop_();_nop_(); ch<<=1; SCL=1; _nop_();_nop_();_nop_();_nop_();_nop_(); SCL=0; _nop_();_nop_();_nop_();_nop_();_nop_(); } _nop_();_nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_(); } /*------------------------------------------------------------------------------ 调用方式:void ACK(void) ﹫2001/03/23 函数说明:内函数,私有,用户不直接调用。 ------------------------------------------------------------------------------- */ void ACK(void) { unsigned char time_1; SDA=1; SCL=0; _nop_();_nop_();_nop_();_nop_();_nop_(); SCL=1; time_1=5; while(SDA) {if (!time_1) break;} //ACK SCL=0; _nop_();_nop_();_nop_();_nop_();_nop_(); } unsigned char ReadIIC_24C01(unsigned char address) { unsigned char ddata=0; unsigned char i=8; SCL=1; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); //Tsu:STA SDA=0; _nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); //Thd:STA SCL=0; //START write_8bit( (address<<1) | 0x01); //写页地址和操作方式 ACK(); while (i--) { SDA=1; ddata<<=1; SCL=0;_nop_();_nop_();_nop_();_nop_();_nop_();SCL=1; if (SDA) ddata|=0x01; } SCL=0;_nop_();SCL=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); SDA=0;_nop_();SCL=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); SDA=1; //STOP delay(); return ddata; } void WriteIIC_24C01(unsigned char address,unsigned char ddata) { SCL=1; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); //Tsu:STA SDA=0; _nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); //Thd:STA SCL=0; //START write_8bit( (address<<1) & 0xfe); //写页地址和操作方式,对于24C32- 24C256,page不起作用 ACK(); write_8bit(ddata); //发送数据 ACK(); SDA=0; _nop_();SCL=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); SDA=1; //STOP delay(); } |
|
|
|
|
[单片机] 相关文章: 在一块已设计好的电路板上增加新功能,原板是用汇编语言来编写的,而新增功能是用C语言写的,不知可否实现?简介: 各位大侠,你们好!小弟有一问题求教。我想在一块已设计好的电路板上增加新功能,原板是用汇编语言来编写的,而新增功能是用C语言写的,不知可否实现? 可以。用keil c可以做到 ...... 看门狗RESET时,程序是从初始化处还是从while(1)后运行。 学完了马忠梅的《单片机的c语言应用程序设计》后该学那一本书?请各位大虾推荐几本c51的好书! MCS51的串口能否工作在“二位停止位”的工作状态吗? 求教 7805 |
|
|
|