No.17070 作者:whf68 邮件:whf68cn_cn@sina.com ID:5117 登陆:8次 文章数:29篇 最后登陆IP:222.72.9.229 最后登陆:2005/1/29 16:21:26 注册:2001/11/16 9:12:00 财富:135 发帖时间:2003/1/10 16:34:00 发贴者IP:218.79.62.190 标题:whf68:C51编程:请问谁有24c04的程序.p2.1(sDA)P2.0(SCL).用P1口来显示出来.???请大侠帮忙:_)) 摘要:No.17070C51编程:请问谁有24c04的程序.p2.1(sDA)P2.0(SCL).用P1口来显示出来.???请大侠帮忙:_)) //单主器件I2C总线模拟子程序// #include <at89x51.h> #include <intrins.h> #define uchar unsigned char sbit VSDA=P2^1; //将p1.0口模拟数据口 sbit VSCL=P2^0; //将p1.1口模拟时钟口 uchar idata SLA; //从器件地址 uchar idata SLAW; //从器件写地址 uchar idata SLAR; //从器件读地址 uchar idata NUMBYT; //数据传送字节 uchar idata MTD[10]={0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77}; //数据发送缓冲 区 uchar idata MRD[10]; //数据接收缓冲区 bit bdata NACK; //器件坏或错误标志位 //启动I2C总线子程序// void STA(void) { VSDA=1; //启动I2C总线 VSCL=1; _nop_(); //延时4.7us,根据晶振频率调整空操作个数,这里以fosc=12MHz, 下同 _nop_(); _nop_(); _nop_(); VSDA=0; _nop_(); _nop_(); _nop_(); _nop_(); VSCL=0; } //停止I2C总线数据传送子程序// void STOP(void) { VSDA=0; //停止I2C总线数据传送 VSCL=1; _nop_(); _nop_(); _nop_(); _nop_(); VSDA=1; _nop_(); _nop_(); _nop_(); _nop_(); VSCL=0; } //发送应答位子程序// void MACK(void) {VSDA=0; //发送应答位 VSCL=1; _nop_(); _nop_(); _nop_(); _nop_(); VSDA=1; VSCL=0; } //发送非应答位子程序// void MNACK(void) { VSDA=1; //发送非应答位 VSCL=1; _nop_(); _nop_(); _nop_(); _nop_(); VSDA=0; VSCL=0; } //应答位检查子程序// void CACK(void) { VSDA=1; //应答位检查(将p1.0设置成输入,必须先向端口写1) VSCL=1; F0=0; if (VSDA==1) F0=1; //若VSDA=1表明非应答,置位非应答标志F0 VSCL=0; } //发送一个字节数据子程序,程序入口p为发送缓冲区地址// void WRBYT(p) uchar idata *p; { uchar idata n=8; //向VSDA上发送一位数据字节,共八位 uchar idata temp; temp=*p; while (n--) { if ((temp&0x80)==0x80) //若要发送的数据最高位为1则发送位1 { VSDA=1; //传送位1 VSCL=1; _nop_(); _nop_(); _nop_(); _nop_(); VSDA=0; VSCL=0; } else { VSDA=0; //否则传送位0 VSCL=1; _nop_(); _nop_(); _nop_(); ......
>>返回讨论的主题
|