资讯详情

8051直流电机的开环控制程序(1)

/ 函数名称: check_ACK // 函数功能: 主机应答位检查子程序,迫使数据传输过程结束 //-------------------------------------------------------------------------------------------------- void check_ACK(void) { SDA = 1; // 将p1.0设置成输入,必须先向端口写1 SCL = 1; F0 = 0; if(SDA == 1) // 若SDA=1表明非应答,置位非应答标志F0 F0 = 1; SCL = 0; } //-------------------------------------------------------------------------------------------------- // 函数名称: IICSendByte // 入口参数: ch // 函数功能: 发送一个字节 //-------------------------------------------------------------------------------------------------- void IICSendByte(unsigned char ch) { unsigned char idata n=8; // 向SDA上发送一位数据字节,共八位 while(n--) { if((ch&0x80) == 0x80) // 若要发送的数据最高位为1则发送位1 { SDA = 1; // 传送位1 SCL = 1; delayNOP(); SDA = 0; SCL = 0; } else { SDA = 0; // 否则传送位0 SCL = 1; delayNOP(); SCL = 0; } ch = ch<<1; // 数据左移一位 } } //-------------------------------------------------------------------------------------------------- // 函数名称: IICreceiveByte // 返回接收的数据 // 函数功能: 接收一字节子程序 //-------------------------------------------------------------------------------------------------- unsigned char IICreceiveByte(void) { unsigned char idata n=8; // 从SDA线上读取一上数据字节,共八位 unsigned char tdata; while(n--) { SDA = 1; SCL = 1; tdata = tdata<<1; // 左移一位,或_crol_(temp,1) if(SDA == 1) tdata = tdata|0x01; // 若接收到的位为1,则数据的最后一位置1 else tdata = tdata&0xfe; // 否则数据的最后一位置0 SCL=0; } return(tdata); } //-------------------------------------------------------------------------------------------------- // 函数名称: writeNbyte // 入口参数: slave_add从机地址,n要发送的数据个数 // 函数功能: 发送n位数据子程序 //-------------------------------------------------------------------------------------------------- void writeNbyte(unsigned char slave_add, unsigned char n) { unsigned char idata send_da,i=0; iic_start(); // 启动I2C IICSendByte(slave_add); // 发送地址位 check_ACK(); // 检查应答位 if(F0 == 1) { SystemError = 1; return; // 若非应答表明器件错误或已坏,置错误标志位SystemError } while(n--) { send_da = sendbuf[i++]; IICSendByte(send_da); check_ACK(); // 检查应答位 if (F0 == 1) { SystemError=1; return; // 若非应答表明器件错误或已坏,置错误标志位SystemError } } iic_stop(); // 全部发完则停止 } //-------------------------------------------------------------------------------------------------- // 函数名称: receiveNbyte // 入口参数: slave_add从机地址,n要接收的数据个数 // 函数功能: 接收n位数据子程序 //-------------------------------------------------------------------------------------------------- void receiveNbyte(unsigned char idata slave_add, unsigned char n) { unsigned char idata receive_da,i=0; iic_start(); IICSendByte(slave_add); check_ACK(); if(F0 == 1) { SystemError = 1; return; } while(n--) { receive_da=IICreceiveByte(); receivebuf[i++]=receive_da; slave_ACK(); // 收到一个字节后发送一个应答位 } slave_NOACK(); // 收到最后一个字节后发送一个非应答位 iic_stop(); }

-电子元器件采购网(www.ruidan.com)是本土元器件目录分销商,采用“小批量、现货、样品”销售模式,致力于满足客户多型号、高质量、快速交付的采购需求。 自建高效智能仓储,拥有自营库存超过50,000种,提供一站式正品现货采购、个性化解决方案、选型替代等多元化服务。
锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台