項目9 信號發(fā)生器的設(shè)計
2021/6/16 1電子工業(yè)出版社 單 片 機 控 制 技 術(shù) 項 目 式 教 程 ( C語 言 版 ) 2021/6/16 2電子工業(yè)出版社 項 目 9 信 號 發(fā) 生 器 的 設(shè) 計 2021/6/16 3 l 能 了 解 D/A轉(zhuǎn) 換 器 的 相 關(guān) 技 術(shù) 指 標(biāo) ; l 能 理 解 DAC0832的 工 作 原 理 與 應(yīng) 用 方 法 ; l 能 掌 握 DAC0832與 51單 片 機 的 接 口 方 法 ;l 能 掌 握 信 號 發(fā) 生 器 的 硬 件 電 路 的 分 析 與 設(shè) 計 方 法 ;l 能 熟 練 編 寫 信 號 發(fā) 生 器 產(chǎn) 生 各 種 波 形 信 號 的 單 片 機 控 制程 序 。 學(xué) 習(xí) 目 標(biāo) 2021/6/16 4 l 敘 述 D/A轉(zhuǎn) 換 器 的 技 術(shù) 指 標(biāo) 要 求 ;l 敘 述 DAC0832的 工 作 原 理 ;l 設(shè) 計 單 片 機 控 制 的 信 號 發(fā) 生 器 的 工 作 電 路 ;l 編 寫 信 號 發(fā) 生 器 產(chǎn) 生 各 種 波 形 信 號 的 單 片 機 控 制 程 序 。 工 作 任 務(wù) 2021/6/16 5 任 務(wù) 9.1 燈 光 亮 度 調(diào) 節(jié) 器 的 設(shè) 計任 務(wù) 9.2 信 號 發(fā) 生 器 的 設(shè) 計項 目 拓 展 串 行 D/A轉(zhuǎn) 換 芯 片 PCF8591在 實 驗 板 上 的 應(yīng) 用項 目 小 結(jié)思 考 與 訓(xùn) 練項 目 9 信 號 發(fā) 生 器 的 設(shè) 計 2021/6/16 6 任 務(wù) 9.1 燈 光 亮 度 調(diào) 節(jié) 器 的 設(shè) 計l D/A轉(zhuǎn) 換 的 功 能 就 是 將 數(shù) 字 量 轉(zhuǎn) 換 成 模 擬 量 。l 基 本 的 D/A轉(zhuǎn) 換 器 由 電 壓 基 準 或 電 流 基 準 、 精 密 電 阻 網(wǎng) 絡(luò) 、電 子 開 關(guān) 及 全 電 流 求 和 電 路 構(gòu) 成 。9.1.1 D/A轉(zhuǎn) 換 器 的 基 本 原 理1 D/A 轉(zhuǎn) 換 器 的 分 類按 工 作 方 式 分 : 并 行 D/A轉(zhuǎn) 換 器 ( 權(quán) 電 阻 D/A轉(zhuǎn) 換 器 、 R- 2R T型 D/A轉(zhuǎn) 換 器 ) 串 行 D/A轉(zhuǎn) 換 器 間 接 D/A轉(zhuǎn) 換 器 2021/6/16 7 按 D/A轉(zhuǎn) 換 的 分 辨 率 分 : 低 分 辨 率 D/A轉(zhuǎn) 換 器 中 分 辨 率 D/A轉(zhuǎn) 換 器 高 分 辨 率 D/A轉(zhuǎn) 換 器按 模 擬 量 輸 出 方 式 分 : 電 流 輸 出 D/A轉(zhuǎn) 換 器 電 壓 輸 出 D/A轉(zhuǎn) 換 器按 模 擬 電 子 開 關(guān) 電 路 的 不 同 分 : CMOS開 關(guān) 型 D/A轉(zhuǎn) 換 器 ( 速 度 要 求 不 高 ) 雙 極 型 開 關(guān) D/A轉(zhuǎn) 換 器 電 流 開 關(guān) 型 ( 速 度 要 求 較 高 ) ECL電 流 開 關(guān) 型 ( 轉(zhuǎn) 換 速 度 更 高 ) 2021/6/16 8 2 D/A 轉(zhuǎn) 換 器 的 組 成 D/A轉(zhuǎn) 換 器 由 數(shù) 碼 寄 存 器 、 模 擬 電 子 開 關(guān) 電 路 、 解 碼 網(wǎng)絡(luò) 、 求 和 電 路 及 基 準 電 壓 等 幾 部 分 組 成 。 以 R-2R T型 D/A轉(zhuǎn) 換 器 為 例 , 其 由 基 準 電 壓 Vref、 T型( R-2R) 電 阻 網(wǎng) 絡(luò) 、 位 切 換 開 關(guān) 和 運 算 放 大 器 組 成 。 2021/6/16 9 3 D/A 轉(zhuǎn) 換 器 的 工 作 原 理 數(shù) 字 量 是 用 代 碼 按 數(shù) 位 組 合 起 來 表 示 的 , 對 于 有 權(quán) 碼 ,每 位 代 碼 都 有 一 定 的 位 權(quán) 。 為 了 將 數(shù) 字 量 轉(zhuǎn) 換 成 模 擬 量 ,必 須 將 每 1位 的 代 碼 按 其 位 權(quán) 的 大 小 轉(zhuǎn) 換 成 相 應(yīng) 的 模 擬 量 ,然 后 將 這 些 模 擬 量 相 加 , 即 可 得 到 與 數(shù) 字 量 成 正 比 的 總 模擬 量 , 實 現(xiàn) 數(shù) 字 模 擬 轉(zhuǎn) 換 。 2021/6/16 10 R-2R T型 D/A轉(zhuǎn) 換 器 工 作 原 理 : 圖 9.1 R-2R T型 D/A轉(zhuǎn) 換 器 原 理 電 路 2021/6/16 11 圖 示 的 電 路 是 一 個 3位 二 進 制 數(shù) 的 D/A轉(zhuǎn) 換 電 路 , 每 位 二進 制 數(shù) 控 制 一 個 開 關(guān) S。 當(dāng) 第 i位 的 數(shù) 碼 為 “ 0”時 , 開 關(guān) Si打在 左 邊 ; 當(dāng) 第 i位 的 數(shù) 碼 為 “ 1”時 , 開 關(guān) Si打 在 右 邊 。 當(dāng) S0接通 時 , I0 I0 I0 , I1 I0+ I0 2I0同 理 I1 I1 I1 , I2 2I1 I2 I2 I2 , I 2I2推 出 I0 I/8 , I1 I/4 , I2 I/2 I I0 + I1 + I2 ( 1/8 + 1/4 + 1/2) I - Uref( 1/8 + 1/4 + 1/2) /R 2021/6/16 12 將 上 式 推 廣 到 n位 二 進 制 數(shù) 的 轉(zhuǎn) 換 , 可 得 一 般 表 達 式 I - Uref( a0/2n + a1/2n-1 + + an-1/21 +an/20) /R則 輸 出 電 壓 為 Uo ( I) Rf -Uref( a0/2n+ a1/2n-1+ +an-1/21+an/20) Rf/R 輸 出 電 壓 會 因 器 件 誤 差 、 集 成 運 放 的 非 理 想 特 性 而 產(chǎn) 生一 定 的 轉(zhuǎn) 換 誤 差 。 2021/6/16 13 一 般 D/A轉(zhuǎn) 換 器 : OUT B Ur其 中 : Ur為 常 量 , 由 參 考 Uref決 定 。 B為 輸 入 數(shù) 字 量 , 為 二 進 制 數(shù) 。 B可 為 8位 、 12位 、 16 位 等 , 由 DAC芯 片 型 號 決 定 。當(dāng) B為 n位 時 : B bn-1bn-2b1b0 bn-1 2 n-1+ bn-2 2n-2+ b1 21+b0 20 式 中 , bn-1為 最 高 位 ; b0為 最 低 位 。 2021/6/16 14 1 分 辨 率 分 辨 率 是 D/A轉(zhuǎn) 換 器 對 輸 入 量 變 化 敏 感 程 度 的 描 述 , 與輸 入 數(shù) 字 量 的 位 數(shù) 有 關(guān) 。 如 果 數(shù) 字 量 的 位 數(shù) 為 n, 則 D/A轉(zhuǎn)換 器 的 分 辨 率 為 1/2n。 即 數(shù) /模 轉(zhuǎn) 換 器 能 對 滿 刻 度 的 1/2n輸 入量 作 出 反 應(yīng) 。 9.1.2 D/A轉(zhuǎn) 換 器 的 技 術(shù) 性 能 指 標(biāo)分 辨 率 輸 出 模 擬 量 的 滿 量 程 值 2n如 : 8位 數(shù) 的 分 辨 率 為 1/256, 10位 數(shù) 分 辨 率 為 1/1024通 常 用 D/A轉(zhuǎn) 換 器 輸 入 數(shù) 字 量 的 位 數(shù) 來 表 示 分 辨 率 。D/A轉(zhuǎn) 換 器 常 可 分 為 8位 、 10位 、 12位 三 種 。 2021/6/16 15 2 精 度 如 果 不 考 慮 D/A的 轉(zhuǎn) 換 誤 差 , D/A轉(zhuǎn) 換 的 精 度 為 其 分 辨率 的 大 小 。 因 此 , 要 獲 得 一 定 精 度 的 D/A轉(zhuǎn) 換 結(jié) 果 , 首 要 條件 是 選 擇 有 足 夠 分 辨 率 的 D/A轉(zhuǎn) 換 器 。 轉(zhuǎn) 換 速 度 是 DAC每 秒 可 以 轉(zhuǎn) 換 的 次 數(shù) , 其 倒 數(shù) 為 轉(zhuǎn) 換時 間 。 轉(zhuǎn) 換 時 間 是 指 從 輸 入 數(shù) 字 量 到 轉(zhuǎn) 換 為 模 擬 量 輸 出 所需 的 時 間 。 當(dāng) D/A轉(zhuǎn) 換 器 的 輸 出 形 式 為 電 流 時 , 轉(zhuǎn) 換 時 間 較短 ; 當(dāng) D/A轉(zhuǎn) 換 器 的 輸 出 形 式 為 電 壓 時 , 轉(zhuǎn) 換 時 間 要 加 上 運算 放 大 器 的 延 遲 時 間 而 長 一 點 , 一 般 在 幾 十 微 秒 內(nèi) 。3 轉(zhuǎn) 換 速 度 2021/6/16 16 4 建 立 時 間 建 立 時 間 是 指 從 輸 入 數(shù) 字 量 變 化 到 輸 出 達 到 終 值 誤 差 (1/2)LSB(最 低 有 效 位 )時 所 需 的 時 間 , 即 輸 入 的 數(shù) 字 量 變 化后 , 輸 出 模 擬 量 穩(wěn) 定 到 相 應(yīng) 的 數(shù) 字 范 圍 內(nèi) 所 需 的 時 間 。 通 常 以 建 立 時 間 來 表 示 轉(zhuǎn) 換 速 度 。 輸 入 編 碼 形 式 是 指 D/A轉(zhuǎn) 換 電 路 輸 入 的 數(shù) 字 量 的 形 式 。如 二 進 制 碼 、 BCD碼 等 。5 輸 入 編 碼 形 式 2021/6/16 17 6 線 性 度 線 性 度 是 指 D/A轉(zhuǎn) 換 器 的 實 際 轉(zhuǎn) 移 特 性 與 理 想 直 線 之 間 的最 大 誤 差 , 或 最 大 偏 移 。 通 常 給 出 在 一 定 溫 度 下 的 最 大 非 線性 度 , 一 般 為 0.01% 0.03 。 大 部 分 D/A轉(zhuǎn) 換 芯 片 是 電 壓 型 輸 出 , 一 般 為 5 10V; 也有 高 壓 輸 出 型 的 , 為 24 30V。 有 一 些 是 電 流 型 的 輸 出 , 低者 為 20mA左 右 , 高 者 可 達 3A。7 輸 出 電 平 8 尖 峰 尖 峰 是 輸 入 的 數(shù) 字 量 發(fā) 生 變 化 時 產(chǎn) 生 的 瞬 時 誤 差 。 通 常尖 峰 的 轉(zhuǎn) 換 時 間 很 短 , 但 幅 度 很 大 。 在 許 多 場 合 是 不 允 許有 尖 峰 存 在 的 , 應(yīng) 采 取 措 施 予 以 消 除 。 2021/6/16 18 正 確 了 解 D/A轉(zhuǎn) 換 器 件 的 技 術(shù) 性 能 參 數(shù) , 對 于 合 理 選 用轉(zhuǎn) 換 芯 片 、 正 確 設(shè) 計 接 口 電 路 十 分 重 要 。 D/A轉(zhuǎn) 換 器 的 性 能 指 標(biāo) 很 多 , 但 在 選 用 合 適 的 芯 片 型 號時 主 要 考 慮 的 是 它 的 分 辨 率 、 精 度 和 轉(zhuǎn) 換 速 度 。 2021/6/16 19 目 前 單 片 機 系 統(tǒng) 常 用 的 D/A轉(zhuǎn) 換 器 的 轉(zhuǎn) 換 精 度 有 8位 、 10位 、 12位 等 , 與 單 片 機 的 接 口 方 式 有 并 行 接 口 、 串 行 接 口 。9.1.3 DAC0832芯 片 及 其 與 單 片 機 接 口 電 路 1 DAC0832芯 片 介 紹( 1) DAC0832的 性 能 8位 D/A轉(zhuǎn) 換 器 , 單 電 源 供 電 , 在 +5 +15 V范 圍 均 可 正 常工 作 。 基 準 電 壓 的 范 圍 為 10V; 電 流 建 立 時 間 為 1 s; CMOS工 藝 , 低 功 耗 (僅 為 20 mW)。 2021/6/16 20 DAC0832主 要 特 性 : 輸 出 電 流 線 性 度 可 在 滿 量 程 下 調(diào) 節(jié) ; 轉(zhuǎn) 換 時 間 ( 電 流 建 立 時 間 ) 為 ; 數(shù) 據(jù) 輸 入 可 采 用 雙 緩 沖 、 單 緩 沖 或 直 通 方 式 ; 增 益 溫 度 補 償 為 0.02%FS/ ; 每 次 輸 入 數(shù) 字 為 8位 二 進 制 數(shù) ; 低 功 耗 , 20mW; 邏 輯 電 平 輸 入 與 TTL兼 容 ; 基 準 電 壓 的 范 圍 為 10V; 單 電 源 供 電 , 可 在 5 15V 內(nèi) 正 常 工 作 。 2021/6/16 21 ( 2) DAC0832的 內(nèi) 部 結(jié) 構(gòu) 2021/6/16 22 該 轉(zhuǎn) 換 器 由 輸 入 寄 存 器 和 DAC寄 存 器 構(gòu) 成 兩 級 數(shù) 據(jù) 輸 入鎖 存 。 使 用 時 數(shù) 據(jù) 輸 入 可 以 采 用 兩 級 鎖 存 (雙 鎖 存 )形 式 , 或單 級 鎖 存 (一 級 鎖 存 , 一 級 直 通 )形 式 , 或 直 接 輸 入 (兩 級 直通 )形 式 。 此 外 , 由 3個 與 門 電 路 可 組 成 寄 存 器 輸 出 控 制 邏 輯 電 路 ,該 邏 輯 電 路 的 功 能 是 進 行 數(shù) 據(jù) 鎖 存 控 制 。 當(dāng) =0時 , 輸 入數(shù) 據(jù) 被 鎖 存 ; 當(dāng) =1時 , 鎖 存 器 的 輸 出 跟 隨 輸 入 的 數(shù) 據(jù) 。 D/A轉(zhuǎn) 換 電 路 是 一 個 R-2R T型 電 阻 網(wǎng) 絡(luò) , 可 實 現(xiàn) 8位 數(shù) 據(jù)的 轉(zhuǎn) 換 。 ILE ILE 2021/6/16 23 ( 3) DAC0832的 引 腳 DAC0832為 20引 腳 、 雙 列 直 插 式 封 裝 。Vcc: 電 源 線 。 DAC0832的 電 源 可 以在 5 15V內(nèi) 變 化 。 典 型 使 用 時 用+15V電 源 。AGND和 DGND: AGND為 模 擬 量 地 線 ,DGND為 數(shù) 字 量 地 線 。 使 用 時 , 這 兩 個接 地 端 應(yīng) 始 終 連 在 一 起 。CS: 片 選 輸 入 信 號 , 低 電 平 有 效 。 只 有 當(dāng) CS=0時 ,這 片 DAC0832才 被 選 中 。DI0 DI7: 8位 數(shù) 字 量 輸 入 端 。 應(yīng) 用 時 , 如 果 數(shù) 據(jù) 不足 8位 , 則 不 用 的 位 一 般 接 地 。 2021/6/16 24 ILE: 輸 入 鎖 存 允 許 信 號 , 高 電 平 有 效 。 只 有 當(dāng) ILE=1時 , 輸 入 數(shù) 字 量 才可 能 進 入 8位 輸 入 寄 存 器 。WR1: 寫 信 號 1, 低 電 平 有 效 , 控 制 輸 入 寄 存 器 的 寫 入 。 ILE和 WR1信號 控 制 輸 入 寄 存 器 是 數(shù) 據(jù) 直 通 方 式 還 是 數(shù) 據(jù) 鎖 存 方 式 : 當(dāng) ILE=1且WR1=0時 , 為 輸 入 寄 存 器 直 通 方 式 ; 當(dāng) ILE=1且 WR1=1時 , 為 輸 入 寄存 器 鎖 存 方 式 。WR2: 寫 信 號 2, 低 電 平 有 效 , 控 制 DAC寄 存 器 的 寫 入 。XFER: 數(shù) 據(jù) 傳 送 控 制 輸 入 信 號 , 低 電 平 有 效 , 控 制 數(shù) 據(jù) 從 輸 入 寄 存 器到 DAC寄 存 器 的 傳 送 。 WR2和 XFER信 號 控 制 DAC寄 存 器 是 數(shù) 據(jù) 直 通 方式 還 是 數(shù) 據(jù) 鎖 存 方 式 : 當(dāng) WR2=0且 XFER =0時 , 為 DAC寄 存 器 直 通 方式 ; 當(dāng) WR2=1或 XFER =1時 , 為 DAC寄 存 器 鎖 存 方 式 。 2021/6/16 25 Vref: 參 考 電 壓 線 。 Vref接 外 部 的 標(biāo) 準 電 源 , 與 芯 片 內(nèi) 的電 阻 網(wǎng) 絡(luò) 相 連 接 , 該 電 壓 可 正 可 負 , 范 圍 為 10 10V。Iout1和 Iout2: 電 流 輸 出 端 。 Iout1為 DAC電 流 輸 出 1, 當(dāng)DAC寄 存 器 中 的 數(shù) 據(jù) 為 0 xFF時 , 輸 出 電 流 最 大 , 當(dāng) DAC寄存 器 中 的 數(shù) 據(jù) 為 0 x00時 , 輸 出 電 流 為 。 Iout2為 DAC電流 輸 出 2。 DAC轉(zhuǎn) 換 器 的 特 性 之 一 是 Iout1 Iout2=常 數(shù)。 在 實 際 使 用 時 , 總 是 將 電 流 轉(zhuǎn) 為 電 壓 來 使 用 , 即 將Iout1和 Iout2加 到 一 個 運 算 放 大 器 的 輸 入 端 。 2021/6/16 26 Rfb: 運 算 放 大 器 的 反 饋 電 阻 端 , 電 阻 ( 15k ) 已 固 化 在芯 片 中 。 因 為 DAC0832是 電 流 輸 出 型 D/A轉(zhuǎn) 換 器 , 為 得 到電 壓 的 轉(zhuǎn) 換 輸 出 , 使 用 時 需 在 兩 個 電 流 輸 出 端 接 運 算 放大 器 , Rfb即 為 運 算 放 大 器 的 反 饋 電 阻 。 圖 9.5 運 算 放 大 器 的 接 法 2021/6/16 27 ( 4) DAC0832的 工 作 原 理 將 數(shù) 字 量 的 每 一 位 按 權(quán) 值 分 別 轉(zhuǎn) 換 成 模 擬 量 , 再 通 過運 算 放 大 器 求 和 相 加 , D/A轉(zhuǎn) 換 器 內(nèi) 部 有 一 個 解 碼 網(wǎng) 絡(luò) ,以 實 現(xiàn) 按 權(quán) 值 分 別 進 行 D/A轉(zhuǎn) 換 。( 5) DAC0832的 輸 出 DAC0832是 電 流 輸 出 型D/A轉(zhuǎn) 換 器 。 圖 9.6 DAC0832單 極 性 電 壓 輸 出 電 路單 極 性 輸 出 運 放 :Vout Iout1 Rfb B Vref/256 2021/6/16 28 雙 極 性 輸 出 運 放 :Vout ( Vout1/R Vref/2R ) 2R 2Vout1 Vref 2B Vref/256 Vref B Vref/128 Vref Vref (B 128)/128 圖 9.7 DAC0832雙 極 性 電 壓 輸 出 電 路 當(dāng) Vref為 正 , 數(shù) 字量 在 0 x01 0 x7F之間 變 化 時 , Vout為負 值 ; 當(dāng) 數(shù) 字 量 在0 x80 0 xFF之 間變 化 時 , Vout為 正值 。 2021/6/16 29 ( 1) 直 通 方 式 下 的 接 口 電 路 直 通 方 式 是 數(shù) 據(jù) 直 接 輸 入 (兩 級 直 通 )的 形 式 。 兩 個 8位 數(shù) 據(jù) 寄 存 器 都 處 于 數(shù) 據(jù) 接 收 狀 態(tài) , LE1=1,LE2=1, ILE=1, 而 WR1、 WR2、 CS和 XFER均 為 0。 輸 入 數(shù) 據(jù) 直接 送 到 內(nèi) 部 D/A轉(zhuǎn) 換 器 去 轉(zhuǎn) 換 。 2 DAC0832與 51單 片 機 的 接 口 電 路 DAC0832的 工 作 方 式 : 直 通 方 式 、 單 緩 沖 方 式 和 雙 緩 沖 方 式 2021/6/16 30圖 9.8 直 通 方 式 下 89C51與 DAC0832的 連 接 圖 2021/6/16 31 ( 2) 單 緩 沖 方 式 下 的 接 口 電 路 單 緩 沖 方 式 是 單 級 鎖 存 (一 級 鎖 存 , 一 級 直 通 )形 式 ,就 是 使 DAC0832的 兩 個 8位 數(shù) 據(jù) 寄 存 器 中 有 一 個 處 于 直 通 方式 , 而 另 一 個 處 于 受 控 的 鎖 存 方 式 , 或 者 兩 個 8位 數(shù) 據(jù) 寄 存器 處 于 同 時 受 控 的 方 式 , 即 同 時 送 數(shù) , 同 時 鎖 存 。 在 單 緩 沖 工 作 方 式 下 , 可 以 將 8位 DAC寄 存 器 置 于 直 通方 式 。 為 此 , 應(yīng) 將 WR2和 XFER接 地 , 而 輸 入 寄 存 器 的 工 作 狀態(tài) 受 單 片 機 的 控 制 。 2021/6/16 32 WR=0, P2.7=0, DAC0832的 地 址 為 0 x7FFF,將 數(shù) 字 量 0 x08轉(zhuǎn) 換 為 模 擬 量 的 程 序 :#define DAC0832 XBYTE0 x7FFFDAC0832=0 x08;或 output(0 x7FFF, 0 x08); 2021/6/16 33 兩 個 輸 入 寄 存 器 同 時 受 控 的 連 接 方 法 , WR1和 WR2一 起接 89C51的 WR, CS和 XFER共 同 接 89C51的 P2.7, 因 此 兩 個寄 存 器 的 地 址 相 同 。 2021/6/16 34 ( 3) 雙 緩 沖 方 式 下 的 接 口 電 路 雙 緩 沖 方 式 的 數(shù) 據(jù) 輸 入 可 以 采 用 兩 級 鎖 存 (雙 鎖 存 )的 形 式 ,就 是 把 DAC0832的 兩 個 鎖 存 器 都 接 成 受 控 鎖 存 方 式 。 DAC0832的WR1、 WR2、 CS和 XFER都 受 單 片 機 送 來 的 信 號 的 控 制 。 當(dāng) WR=0, P2.7=0, P2.6=1, 8位 輸 入 寄 存 器 處 于 送 數(shù) 狀 態(tài) , 8位 DAC寄 存 器 處 于 鎖 存 狀 態(tài) , 不 能 進 行 D/A轉(zhuǎn) 換 。 2021/6/16 35 雙 緩 沖 方 式 下 89C51與 兩 片 DAC0832的 連 接 圖 2021/6/16 36 如 DAC0832的 8位 輸 入 寄 存 器 地 址 為 0 x7FFF, WR=0,P2.7=1, P2.6=0, 8位 DAC寄 存 器 處 于 送 數(shù) 據(jù) 狀 態(tài) , 開 始 進行 D/A轉(zhuǎn) 換 。 DAC0832的 8位 DAC寄 存 器 的 地 址 為 0 xBFFF, 將一 個 數(shù) 字 量 轉(zhuǎn) 換 為 模 擬 量 的 程 序 : #define DAC0832_1 XBYTE0 xBFFF#define DAC0832_2 XBYTE0 x7FFFDAC0832_1=0 x08;DAC0832_2=0 x08;或 output(0 xBFFF, 0 x08) ; output(0 x7FFF, 0 x08) ; 2021/6/16 37 1 任 務(wù) 要 求9.1.4 燈 光 亮 度 調(diào) 節(jié) 器 的 設(shè) 計 用 AT89C51單 片 機 和 DAC0832控 制 一 個 發(fā) 光 二 極 管 , 使發(fā) 光 二 極 管 的 亮 度 逐 漸 變 暗 , 再 逐 漸 變 亮 , 不 斷 循 環(huán) 。 2 任 務(wù) 分 析 改 變 發(fā) 光 二 極 管 的 亮 度 , 就 要 改 變 通 過 發(fā) 光 二 極 管的 電 流 。 方 法 很 多 , 利 用 AT89C51控 制 DAC0832數(shù) 模 轉(zhuǎn) 換芯 片 , DAC0832的 輸 出 轉(zhuǎn) 換 成 電 壓 去 驅(qū) 動 發(fā) 光 二 極 管 。 當(dāng)DAC0832的 輸 入 數(shù) 字 量 變 化 時 , 輸 出 電 壓 改 變 , 通 過 發(fā) 光二 極 管 的 電 流 變 化 , 發(fā) 光 二 極 管 的 亮 度 就 改 變 。 2021/6/16 38 3 任 務(wù) 設(shè) 計 ( 1) 器 件 選 擇器 件 名 稱 數(shù) 量 ( 只 )AT89C51 16MHz 晶 體 122pF瓷 片 電 容 210uF電 解 電 容 110k電 阻 1470電 阻 1uA471 1DAC0832 1 發(fā) 光 二 極 管 LED 1 2021/6/16 39 ( 2) 硬 件 原 理 圖 設(shè) 計 DAC0832單 緩 沖 方 式 , P2和 P0決 定 地 址 , 片 選 信 號 CS低 電 平有 效 , P2.7為 0, DAC0832的 地 址 為 0 x7FFF。 8 123 456 7 123 4 876 5 XTAL218 XTAL119 ALE30 EA31 PSEN29 RST9 P0.0/AD0 39P0.1/AD1 38P0.2/AD2 37 P0.3/AD3 36P0.4/AD4 35P0.5/AD5 34 P0.6/AD6 33P0.7/AD7 32 P1.01 P1.12 P1.23 P1.34 P1.45 P1.56 P1.67 P1.78 P3.0/RXD 10P3.1/TXD 11P3.2/INT0 12 P3.3/INT1 13P3.4/T0 14 P3.7/RD 17P3.6/WR 16P3.5/T1 15 P2.7/A15 28 P2.0/A8 21P2.1/A9 22P2.2/A10 23 P2.3/A11 24P2.4/A12 25P2.5/A13 26 P2.6/A14 27 U1 AT89C51 C1 22pFC2 22pF C3 10uF R110k VREF8 GND3 VCC 20CS1 WR12 DI34 DI2 5 DI16 DI07 RFB9 GND10 IOUT1 11IOUT2 12DI7 13DI6 14 DI5 15DI4 16XFER 17 WR2 18ILE(BY1/BY2) 19 U2 DAC0832 32 67 4 1 5 U3 UA741 WR WRXF R2470 +12V X16MHz 7 4 1 5 XF -5V -12V D1LED-GREEN 2021/6/16 40 ( 3) 軟 件 程 序 設(shè) 計 :#include #include #define uint unsigned int#define uchar unsigned char#define DAC0832 XBYTE0 x7FFF/延 時 子 程 序void DelayMS(uint x) uchar t; while(x-) for(t=0;t0;i-) AC0832=i; DelayMS(1); for(i=0;i256;i+) AC0832=i; DelayMS(1); 2021/6/16 41 ( 4) 軟 硬 件 聯(lián) 合 調(diào) 試 在 Protus環(huán) 境 下 , 將 編 譯 好 的 軟 件 下 載 到 AT89C51中運 行 , 可 以 看 到 LED燈 如 任 務(wù) 要 求 的 一 樣 先 由 亮 逐 漸 變 暗 ,再 由 暗 逐 漸 變 亮 。 2021/6/16 42 1 任 務(wù) 要 求任 務(wù) 9.2 信 號 發(fā) 生 器 的 設(shè) 計 用 單 片 機 AT89C51和 D/A轉(zhuǎn) 換 芯 片 DAC0832組 成 的 信 號發(fā) 生 器 生 成 要 求 周 期 和 幅 度 ( 0V+5V) 的 鋸 齒 波 、 三 角 波 、方 波 或 正 弦 波 。 2 任 務(wù) 分 析 鋸 齒 波 : 向 DAC0832反 復(fù) 送 入 0 x000 xFF數(shù) 據(jù) , 就 會 生 成 幅 度 為 0V+5V的 鋸 齒 波三 角 波 : 向 DAC0832反 復(fù) 送 入 0 x000 xFF和 0 xFF 0 x00數(shù) 據(jù) , 就 會 生 成 幅 度 為 0V+5V的 三 角 波方 波 : 向 DAC0832送 入 一 定 時 長 的 0 x00和 一 定 時 長 的 0 xFF, 就 會 生 成 幅 度 為 0V+5V的 方 波 2021/6/16 43 波 形 的 周 期 與 單 片 機 的 機 器 周 期 和 程 序 中 的 延 時 長 短 相 關(guān) 。正 弦 波 : 等 時 間 間 隔 分 割 正 弦 信 號 , 計 算 出 分 割 時 刻 的 信 號 幅 值 , 將 幅 值 對 應(yīng) 的 數(shù) 字 量 存 儲 到 ROM中 , 然 后 用 查 表 的 方 法 取 出 這 些 取 樣 值 , 送 到 DAC0832轉(zhuǎn) 換 后 輸 出 , 那 么 輸 出 信 號 就 是 正 弦 波 形 。 如 : 波 形 頻 率 為 50Hz的 正 弦 波 信 號 , 正 弦 波 信 號 以 5 作 為 1個 階 梯 , 則 分 成 360 5 72份 , 時 間 間 隔 為 20 72 0.278ms。 當(dāng) 參 考 電 壓 為 5V時 , 72個 采 樣 值 、 輸 出 電 壓 值 、 正 弦 值 、 角 度 如 表 9.2所 示 。 2021/6/16 44 X sinX 輸 出 電 壓 輸 入 數(shù) 字 量0 90 90 180 180 270 270 3600 0.0000 2.500V 0 x7F 0 xFF 0 x7F 0 x005 0.0872 2.718V 0 x8A 0 xFE 0 x75 0 x0110 0.1736 2.934V 0 x95 0 xFD 0 x6A 0 x0215 0.2588 3.147V 0 xA0 0 xFA 0 x5F 0 x0420 0.3420 3.355V 0 xAB 0 xF7 0 x54 0 x0725 0.4226 3.557V 0 xB5 0 xF3 0 x4A 0 x0C30 0.5000 3.750V 0 xBF 0 xED 0 x40 0 x11 35 0.5736 3.934V 0 xC8 0 xE7 0 x36 0 x1740 0.6428 4.107V 0 xD1 0 xE1 0 x2D 0 x1E45 0.7071 4.268V 0 xD9 0 xD9 0 x25 0 x2550 0.7660 4.415V 0 xE1 0 xD1 0 x1E 0 x2D55 0.8192 4.548V 0 xE7 0 xC8 0 x17 0 x3660 0.8660 4.665V 0 xED 0 xBF 0 x11 0 x4065 0.9093 4.773V 0 xF3 0 xB5 0 x0C 0 x4A70 0.9397 4.849 V 0XF7 0 xAB 0 x07 0 x5475 0.9659 4.915V 0 xFA 0 xA0 0 x04 0 x5F 80 0.9848 4.962V 0 xFD 0 x95 0 x02 0 x6A85 0.9962 4.991V 0 xFE 0 x8A 0 x01 0 x7590 1.0000 5.000V 0 xFF 0 x7F 0 x00 0 x7F 表 9.2 正 弦 波 數(shù) 據(jù) 表 2021/6/16 45 3 任 務(wù) 設(shè) 計 ( 1) 器 件 選 擇器 件 名 稱 數(shù) 量 ( 只 )AT89C51 16MHz 晶 體 122pF瓷 片 電 容 210uF電 解 電 容 110k電 阻 110k可 變 電 阻 11k電 阻 1 uA471 1DAC0832 1數(shù) 字 電 壓 表 1示 波 器 1 2021/6/16 4681234567 123 4 876 5 XTAL218 XTAL119 ALE30 EA31 PSEN29 RST9 P0.0/AD0 39P0.1/AD1 38P0.2/AD2 37 P0.3/AD3 36P0.4/AD4 35P0.5/AD5 34 P0.6/AD6 33P0.7/AD7 32 P1.01 P1.12 P1.23 P1.34 P1.45 P1.56 P1.67 P1.78 P3.0/RXD 10P3.1/TXD 11P3.2/INT0 12 P3.3/INT1 13P3.4/T0 14 P3.7/RD 17P3.6/WR 16P3.5/T1 15 P2.7/A15 28 P2.0/A8 21P2.1/A9 22P2.2/A10 23 P2.3/A11 24P2.4/A12 25P2.5/A13 26 P2.6/A14 27 U1 AT89C51 C1 22pFC2 22pF C3 10uF R110k VREF8 GND3 VCC 20CS1 WR12 DI34 DI25 DI16 DI07 RFB9 GND10 IOUT1 11IOUT2 12DI7 13DI6 14 DI5 15DI4 16XFER 17 WR2 18ILE(BY1/BY2) 19 U2 DAC0832 32 67 4 1 5 U3 UA741 WR WR XF XF -5V R21K +12V -12V ABC D 10k +88.8AC Volts X16M 7 4 1 5 -12V ( 2) 硬 件 原 理 圖設(shè) 計 DAC0832工 作于 單 緩 沖 方 式 , 地址 為 0 x7FFF。 Vref接 5V電 壓 , 輸 出的 單 極 性 電 壓 在0 5V之 間 變 化 。 2021/6/16 47 ( 3) 軟 件 程 序 設(shè) 計 : 產(chǎn) 生 鋸 齒 波 的 源 程 序 如 下 :#include #include #define uint unsigned int#define uchar unsigned char#define DAC0832 XBYTE0 x7FFF/延 時 子 程 序void DelayMS(uint x) uchar t; while(x-) for(t=0;t120;t+); / 主 程 序 生 成 鋸 齒 波void main() uchar i; while(1) for(i=0;i256;i+) DAC0832=i; DelayMS(1); 2021/6/16 48 產(chǎn) 生 三 角 波 的 源 程 序 如 下 : #include #include #define uint unsigned int#define uchar unsigned char#define DAC0832 XBYTE0 x7FFF/延 時 子 程 序void DelayMS(uint x) uchar t; while(x-) for(t=0;t120;t+); / 主 程 序 生 成 三 角 波void main() uchar i; while(1) for(i=0;i0;i-) DAC0832=i; DelayMS(1); 2021/6/16 49 產(chǎn) 生 正 弦 波 的 源 程 序 如 下 :#include #include #define uint unsigned int#define uchar unsigned char#define DAC0832 XBYTE0 x7FFF 2021/6/16 50 /初 始 化 正 弦 波 波 形 數(shù) 據(jù) 數(shù) 組uchar code data =0 x7F, 0 x8A, 0 x95, 0 xA0, 0 xAB, 0XB5, 0 xBF, 0 xC8, 0 xD1, 0 xD9, 0 xE1, 0 xE7, 0 xED, 0 xF3, 0 xF7, 0 xFA, 0 xFD, 0 xFE, 0 xFF, 0 xFE, 0 xFD, 0 xFA, 0 xBF, 0 xF3, 0 xED, 0 xE7, 0 xE1, 0 xD9, 0 xD1, 0 xC8, 0 xBF, 0 xB5, 0 xAB, 0 xA0, 0 x95, 0 x8A, 0 x7F, 0 x75, 0 x6A, 0 x5F, 0 x54, 0 x4A, 0 x40, 0 x36, 0 x2D, 0 x25, 0 x1E, 0 x17, 0 x11, 0 x0C, 0 x07, 0 x04, 0 x02, 0 x01, 0 x00, 0 x01, 0 x02, 0 x04, 0 x07, 0 x0C, 0 x11, 0 x17, 0 x1E, 0 x25, 0 x2D, 0 x36, 0 x40, 0 x4A, 0 x54, 0 x5F, 0 x6A, 0 x75; 2021/6/16 51 /延 時 子 程 序void DelayMS(uint x) uchar t; while(x-) for(t=0;t120;t+);/主 程 序 生 成 正 弦 波void main() uchar i; while(1) for(i=0;i72;i+) DAC0832= datai; DelayMS(1); 2021/6/16 52 ( 4) 軟 硬 件 聯(lián) 合 調(diào) 試 將 上 面 相 應(yīng) 波 形 的 程 序 編 譯 為 *.hex文 件 后 , 在 Proteus繪 制 的 原 理 圖 中 , 將 *.hex文 件 加 載 到 單 片 機 AT89C51中 運 行 ,在 虛 擬 示 波 器 上 可 以 看 到 對 應(yīng) 的 波 形 圖 。 在 Proteus仿 真 運行 過 程 中 可 能 會 提 示 CPU過 載 , 這 時 虛 擬 示 波 器 可 能 會 無 法實 時 顯 示 波 形 , 可 將 虛 擬 示 波 器 通 道 A中 指 向 1的 黃 色 旋 鈕 從1開 始 先 正 向 旋 轉(zhuǎn) 一 圈 , 再 反 向 旋 轉(zhuǎn) 一 圈 , 這 樣 會 使 虛 擬 示波 器 盡 快 刷 新 顯 示 波 形 。 2021/6/16 53 1 PCF8591簡 介項 目 拓 展 串 行 D/A轉(zhuǎn) 換 芯 片 PCF8591在 實 驗 板 上 的 應(yīng) 用 PCF8591是 一 個 單 片 集 成 的 具 有 I2C總 線 接 口 的 8位 A/D及 D/A轉(zhuǎn) 換 器 , 有 4路 A/D輸 入 , 1路 D/A輸 出 。 PCF8591的 輸入 輸 出 地 址 、 控 制 和 數(shù) 據(jù) 信 號 都 是 通 過 I2C總 線 以 串 行 的 方式 進 行 傳 輸 。 2021/6/16 54 PCF8591的 主 要 特 性 : 單 獨 供 電 PCF8591的 操 作 電 壓 范 圍 +2.5V+6V 低 待 機 電 流 通 過 IC總 線 串 行 輸 入 /輸 出 PCF8591通 過 3個 硬 件 地 址 引 腳 尋 址 PCF8591的 采 樣 率 由 IC總 線 速 率 決 定 4個 模 擬 輸 入 可 編 程 為 單 端 型 或 差 分 輸 入 自 動 增 量 頻 道 選 擇 PCF8591的 模 擬 電 壓 范 圍 從 VSS到 VDD PCF8591內(nèi) 置 跟 蹤 保 持 電 路 8-bit逐 次 逼 近 A/D轉(zhuǎn) 換 器 通 過 1路 模 擬 輸 出 實 現(xiàn) DAC增 益 2021/6/16 55 2 PCF8591內(nèi) 部 結(jié) 構(gòu) 框 圖 2021/6/16 56 3 PCF8591引 腳 功 能 引 腳 序 號 引 腳 名 稱 引 腳 功 能1 AIN0 模 擬 量 輸 入 端 口2 AIN13 AIN24 AIN35 A0 模 擬 通 道 選 擇 地 址6 A17 A28 VSS 負 電 源 電 壓9 SDA IC總 線 數(shù) 據(jù) 信 號10 SCL IC總 線 時 鐘 信 號11 OSC 外 部 時 鐘 輸 入 端 , 內(nèi) 部 時 鐘 輸 出 端 12 EXT 內(nèi) 部 、 外 部 時 鐘 選 擇 線 , 使 用 內(nèi) 部 時 鐘 時 EXT 接 地13 AGND 模 擬 信 號 地14 Vref 基 準 電 源 電 壓15 AOUT D/A 轉(zhuǎn) 換 模 擬 量 輸 出 端16 VDD 正 電 源 電 壓 2021/6/16 57 4 PCF8591工 作 原 理 PCF8591采 用 典 型 的 I2C總 線 接 口 器 件 尋 址 方 法 , 即 總線 地 址 由 器 件 地 址 ( 1001) 、 引 腳 地 址 ( 由 A0A2接 地 或+5V來 確 定 , 接 地 代 表 0, 接 +5V代 表 1) 、 方 向 位 ( 即 R/W)組 成 。 在 I2C總 線 系 統(tǒng) 中 最 多 可 接 8個 這 樣 的 器 件 。D7 D6 D5 D4 D3 D2 D1 D01 0 0 1 A2 A1 A0 R/W表 9.5 PCF8591總 線 地 址 2021/6/16 58 R/W=1表 示 讀 操 作 , R/W=0表 示 寫 操 作 。 如 果 將 A0A2接地 , 則 讀 地 址 為 91H; 寫 地 址 為 90H。 地 址 字 節(jié) : 由 器 件 地 址 、 引 腳 地 址 、 方 向 位 組 成 , 它 是 通 信時 主 機 發(fā) 送 的 第 一 字 節(jié) 數(shù) 據(jù) 。 控 制 字 節(jié) : 用 于 控 制 PCF8951的 輸 入 方 式 、 輸 入 通 道 、D/A轉(zhuǎn) 換 等 , 是 通 信 時 主 機 發(fā) 送 的 第 二 字 節(jié) 數(shù) 據(jù) , 其 格 式 如 下表 。 D7 D6 D5 D4 D3 D2 D1 D0 未 用 ( 寫 0 ) D/A輸 出 允許 位 0 為 禁 止 1 為 允 許 A/D輸 入 方 式 選 擇 位0 0 : 4 路 單 端 輸 入 0 1 : 3 路 差 分 輸1 0 : 單 端 與 差 分 1 1 : 2 路 差 分 輸 入 未 用 ( 寫 0 ) 自 動 增 益選 擇 位 0 為 禁 用 1 為 啟 用 AD通 道 選 擇 位 0 0 : 選 擇 通 道 0 0 1 : 選 擇 通 道 1 1 0 : 選 擇 通 道 2 1 1 : 選 擇 通 道 3 2021/6/16 59 D/A轉(zhuǎn) 換 的 數(shù) 據(jù) 輸 入 和 A/D轉(zhuǎn) 換 的 數(shù) 據(jù) 輸 出 都 是 通 過 I2C總 線串 行 輸 入 和 輸 出 的 。 因 此 PCF8951中 I2C總 線 的 通 信 格 式 包 括 寫數(shù) 據(jù) 格 式 和 讀 數(shù) 據(jù) 格 式 。PCF8591的 I2C總 線 寫 數(shù) 據(jù) 格 式 :第 一 字 節(jié) 第 二 字 節(jié) 第 三 字 節(jié)寫 入 器 件 地 址 ( 9 0 H) 寫 入 控 制 字 節(jié) 要 寫 入 的 數(shù) 據(jù)向 PCF8 5 9 1 寫 入 格 式 ( 高 位 在 前 )PCF8591的 I2C總 線 讀 數(shù) 據(jù) 格 式 :第 一 字 節(jié) 第 二 字 節(jié) 第 三 字 節(jié) 第 四 字 節(jié) 寫 入 器 件 地 址 (9 0 H寫 ) 寫 入 控 制 字 節(jié) 寫 入 器 件 地 址 (9 1 H讀 ) 讀 出 一 字 節(jié) 數(shù)據(jù)從 PCF8 5 9 1 讀 數(shù) 據(jù) 格 式 ( 高 位 在 前 ) 2021/6/16 60 5 I2C總 線 ( 1) I2C總 線 數(shù) 據(jù) 位 的 傳 輸 I2C總 線 上 每 傳 輸 一 個 數(shù) 據(jù) 位 必 須 產(chǎn) 生 一 個 時 鐘 脈 沖 , I2C總線 上 數(shù) 據(jù) 傳 輸 的 有 效 性 要 求 SDA線 上 的 數(shù) 據(jù) 必 須 在 時 鐘 線 SCL的高 電 平 期 間 保 存 穩(wěn) 定 , 數(shù) 據(jù) 線 的 改 變 只 能 在 時 鐘 線 為 低 電 平 期間 。 I2C總 線 由 2根 線 : 串 行 數(shù) 據(jù) 線 ( SDA) 和 串 行 時 鐘 線 ( SCL) 。總 線 上 的 每 一 個 器 件 都 有 一 個 唯 一 的 地 址 。 2021/6/16 61 ( 2) I2C總 線 數(shù) 據(jù) 的 傳 輸數(shù) 據(jù) 傳 輸 中 的 應(yīng) 答 : 相 應(yīng) 的 應(yīng) 答 位 由 接 收 方 ( 從 機 ) 產(chǎn) 生 , 在應(yīng) 答 的 時 鐘 脈 沖 期 間 , 發(fā) 送 方 ( 主 機 ) 應(yīng) 釋 放 SDA線 ( 使 其 為高 電 平 ) 。 在 應(yīng) 答 過 程 中 , 接 收 方 ( 從 機 ) 必 須 將 數(shù) 據(jù) 線 SDA拉 低 , 使 它 在 這 個 時 鐘 脈 沖 的 高 電 平 期 間 保 持 穩(wěn) 定 的 低 電 平 。數(shù) 據(jù) 傳 輸 的 字 節(jié) 格 式 : 發(fā) 送 到 SDA線 上 的 每 一 個 字 節(jié) 必 須 為 8位 ,每 次 發(fā) 送 的 字 節(jié) 數(shù) 量 不 受 限 制 , 從 機 在 接 收 完 一 個 字 節(jié) 后 向 主機 發(fā) 送 一 個 應(yīng) 答 位 , 主 機 在 收 到 從 機 應(yīng) 答 后 才 會 發(fā) 送 第 二 字 節(jié)數(shù) 據(jù) , 發(fā) 送 數(shù) 據(jù) 時 先 發(fā) 數(shù) 據(jù) 的 最 高 位 。 2021/6/16 62 ( 3) I2C總 線 的 傳 輸 協(xié) 議主 機 寫 數(shù) 據(jù) 到 從 機 的 通 信 格 式 :1 2 3 4 5 6 7 N N-1主 機產(chǎn) 生起 始位 發(fā) 從機 地址90H 等 待從 機應(yīng) 答 發(fā) 送數(shù) 據(jù) 等 待從 機應(yīng) 答 發(fā) 送數(shù) 據(jù) 等 待從 機應(yīng) 答 。 。 。 停 止位 2021/6/16 63 主 機 從 從 機 中 讀 數(shù) 據(jù) 的 通 信 格 式 :1 2 3 4 5 6 7 N N-1主 機 產(chǎn)生 起 始位 發(fā) 從 機地 址 91H 等 待 從機 應(yīng) 答 接 收 從機 發(fā) 出的 數(shù) 據(jù) 向 從 機應(yīng) 答 接 收 從機 發(fā) 出的 數(shù) 據(jù) 向 從 機應(yīng) 答 。 。 。 主 機 產(chǎn)生 停 止位 2021/6/16 64 6. 實 驗 板 上 鋸 齒 波 信 號 的 輸 出( 1) STC89C52控 制 PCF8591生 成 鋸 齒 波 信 號 的 電 路 設(shè) 計將 U15的 J23的 19和 20腳 用 杜 邦 線 與 J8的 SDA和 SCL腳 連 接 。 2021/6/16 65 ( 2) 生 成 鋸 齒 波 的 軟 件 設(shè) 計 主 程 序 main.c:/ PCF8591 的 DA轉(zhuǎn) 換 程 序 #include #include i2c.h#define AddWr 0 x90 /寫 數(shù) 據(jù) 地 址 #define AddRd 0 x91 /讀 數(shù) 據(jù) 地 址/鋸 齒 波 數(shù) 據(jù) 表 , 表 格 數(shù) 值 越 多 , 波 形 越 平 滑unsigned char code tab = 0,10,20,30,40,50,60,70,80,90, 100, 110,120,130,140,150,160,170,180, 190,200, 210,220,230,240,250 ; /定 義 全 局 變 量extern bit ack; 2021/6/16 66 /寫 入 DA轉(zhuǎn) 換 數(shù) 值 , dat表 示 需 要 輸 入 轉(zhuǎn) 換 的 DA數(shù) 值 , 從 0-255bit WriteDAC(unsigned char dat,unsigned char num) unsigned char i; Start_I2c(); /啟 動 總 線 SendByte(AddWr); /發(fā) 送 器 件 地 址 if(ack=0) return(0); SendByte(0 x40); /發(fā) 送 器 件 子 地 址 if(ack=0) return(0); for(i=0;inum;i+) SendByte(dat); /發(fā) 送 數(shù) 據(jù) if(ack=0) return(0); Stop_I2c(); 2021/6/16 67 /主 程 序main() unsigned char i; while (1) for(i=0;i26;i+) WriteDAC(tab1i,1); 2021/6/16 68 I2C頭 文 件 i2c.h:#ifndef _I2C_H_#define _I2C_H_ #include /頭 文 件 的 包 含#include #define _Nop() _nop_() /定 義 空 指 令/啟 動 總 線void Start_I2c();/結(jié) 束 總 線void Stop_I2c();/字 節(jié) 數(shù) 據(jù) 傳 送 函 數(shù) void SendByte(unsigned char c);#endif 2021/6/16 69 I2C程 序 i2c.c:/函 數(shù) 是 采 用 軟 件 延 時 的 方 法 產(chǎn) 生 SCL脈 沖 , 晶 振 頻 率 是 12MHz,即 機 器 周 期 為 1us#include i2c.h#define _Nop() _nop_() /定 義 空 指 令bit ack; /應(yīng) 答 標(biāo) 志 位sbit SDA=P21;sbit SCL=P20;、/啟 動 總 線void Start_I2c() SDA=1; /發(fā) 送 起 始 條 件 的 數(shù) 據(jù) 信 號 _Nop(); SCL=1; _Nop(); /起 始 條 件 建 立 時 間 大 于 4.7us,延 時 _Nop(); _Nop(); _Nop(); _Nop(); 2021/6/16 70 SDA=0; /發(fā) 送 起 始 信 號 _Nop(); /起 始 條 件 鎖 定 時 間 大 于 4 _Nop(); _Nop(); _Nop(); _Nop(); SCL=0; /鉗 住 I2C總 線 , 準 備 發(fā) 送 或 接 收 數(shù) 據(jù) _Nop(); _Nop();/結(jié) 束 總 線void Stop_I2c() SDA=0; /發(fā) 送 結(jié) 束 條 件 的 數(shù) 據(jù) 信 號 _Nop(); /發(fā) 送 結(jié) 束 條 件 的 時 鐘 信 號 SCL=1; /結(jié) 束 條 件 建 立 時 間 大 于 4 _Nop(); _Nop(); _Nop(); _Nop(); _Nop(); SDA=1; /發(fā) 送 I2C總 線 結(jié) 束 信 號 _Nop(); _Nop(); _Nop(); _Nop(); 2021/6/16 71 /字 節(jié) 數(shù) 據(jù) 傳 送 函 數(shù) void SendByte(unsigned char c) unsigned char BitCnt; for(BitCnt=0;BitCnt8;BitCnt+) /要 傳 送 的 數(shù) 據(jù) 長 度 為 8位 if(cBitCnt) /判 斷 發(fā) 送 位 else SDA=0; _Nop()