新聞中心

        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();
        }


        評論


        技術專區

        關閉
        主站蜘蛛池模板: 临夏市| 灌阳县| 三台县| 灵川县| 荆门市| 临城县| 莱阳市| 西昌市| 延寿县| 盐池县| 长岭县| 桃园市| 新平| 讷河市| 金寨县| 齐河县| 扶绥县| 遂平县| 宾阳县| 夏津县| 武义县| 盐城市| 兰溪市| 阳泉市| 桃园县| 江川县| 泸定县| 宁波市| 安康市| 壤塘县| 汤原县| 南川市| 慈溪市| 镇远县| 新巴尔虎左旗| 黄骅市| 德州市| 宣汉县| 三都| 客服| 辽阳市|