新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 8051直流電機的開環控制程序(1)

        8051直流電機的開環控制程序(1)

        作者: 時間:2016-11-30 來源:網絡 收藏
        / 函數名稱: 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();
        }


        評論


        技術專區

        關閉
        主站蜘蛛池模板: 固镇县| 弋阳县| 延津县| 原平市| 邵阳县| 宁蒗| 长治县| 和龙市| 光泽县| 汉寿县| 兴安县| 宁乡县| 盐城市| 和龙市| 香格里拉县| 永德县| 灵丘县| 合江县| 偏关县| 社旗县| 武川县| 日土县| 芮城县| 沂水县| 耿马| 密山市| 咸宁市| 洱源县| 高阳县| 论坛| 偏关县| 泰来县| 三门县| 汉川市| 大余县| 宁化县| 鸡东县| 金昌市| 清丰县| 涿州市| 贡嘎县|