在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ 數(shù)據(jù)庫/ 17.6 D/A 輸出
18. RS485 通信與 Modbus 協(xié)議
17.5 A/D 差分輸入信號
15.8 C 語言復(fù)合數(shù)據(jù)類型(結(jié)構(gòu)體,共用體,枚舉類型)
16.3 NEC 協(xié)議紅外遙控器
13.1 單片機(jī)通信時序解析
14.4 單片機(jī) EEPROM 單字節(jié)讀寫操作時序
13.3 多個 .c 文件的初步認(rèn)識
18.2 Modbus 通信協(xié)議介紹
15.1 BCD 碼介紹
18.3 單片機(jī) Modbus 多機(jī)通信程序設(shè)計
18.1 單片機(jī) RS485 通信接口、控制線、原理圖及程序?qū)嵗?/span>
15. 實(shí)時時鐘 DS1302
14.7 單片機(jī) I2C 和 EEPROM 的綜合編程
17. 模數(shù)轉(zhuǎn)換與數(shù)模轉(zhuǎn)換
16.2 紅外遙控通信原理
13.2 1602 液晶整屏移動程序
17.6 D/A 輸出
17.7 單片機(jī)信號發(fā)生器程序
16.4 溫度傳感器 DS18B20
14.6 單片機(jī)EEPROM的頁寫入
13.4 單片機(jī)計算器程序設(shè)計[詳細(xì)]
17.2 A/D(模數(shù)轉(zhuǎn)換)的主要指標(biāo)
17.4 PCF8591 應(yīng)用程序
17.1 A/D 和 D/A 的基本概念
17.3 PCF8591硬件接口(電路圖引腳圖)
14.3 單片機(jī) EEPROM 簡介
13.5 單片機(jī)串口通信原理和控制程序
15.5 DS1302 寄存器介紹
15.2 單片機(jī) SPI 通信接口
15.6 DS1302 通信時序介紹
14.5 單片機(jī) EEPROM 多字節(jié)讀寫操作時序
16. 紅外通信與 DS18B20 溫度傳感器
14.1 單片機(jī) I2C 時序介紹
15.3 實(shí)時時鐘芯片 DS1302 介紹
15.9 單片機(jī)電子時鐘程序設(shè)計
16.1 紅外光的基本原理
15.4 DS1302 的硬件信息
15.7 DS1302 的 BURST 模式
14.2 單片機(jī) I2C 尋址模式
14. 單片機(jī) I2C 總線與 EEPROM
13. 單片機(jī) 1602 液晶與串口的應(yīng)用實(shí)例

17.6 D/A 輸出

D/A 是和 A/D 剛好反方向的,一個8位的 D/A,從0~255,代表了0~2.55 V 的話,那么我們用單片機(jī)給第三個字節(jié)發(fā)送100,D/A 引腳就會輸出一個 1 V 的電壓,發(fā)送200 就輸出一個 2 V 的電壓,很簡單,我們用一個簡單的程序?qū)崿F(xiàn)出來,并且通過上、下按鍵可以增大或減小輸出幅度值,每次增加或減小 0.1 V。如果有萬用表的話,可以直接測試一下板子上 AOUT 點(diǎn)的輸出電壓,觀察它的變化。由于 PCF8591 的 DA 輸出偏置誤差最大是 50 mv(由數(shù)據(jù)手冊提供),所以我們用萬用表測到的電壓值和理論值之間的誤差就應(yīng)該在 50 mV 以內(nèi)。

/*I2C.c 文件程序源代碼***/ (此處省略,可參考之前章節(jié)的代碼) /*keyboard.c 文件程序源代碼****/ (此處省略,可參考之前章節(jié)的代碼) /***main.c 文件程序源代碼**/

#include <reg52.h>
unsigned char T0RH = 0; //T0 重載值的高字節(jié)
unsigned char T0RL = 0; //T0 重載值的低字節(jié)
void ConfigTimer0(unsigned int ms);
extern void KeyScan();
extern void KeyDriver();
extern void I2CStart();
extern void I2CStop();
extern bit I2CWrite(unsigned char dat);

void main(){
    EA = 1; //開總中斷
    ConfigTimer0(1); //配置 T0 定時 1ms

    while (1){
        KeyDriver(); //調(diào)用按鍵驅(qū)動
    }
}
/* 設(shè)置 DAC 輸出值,val-設(shè)定值 */
void SetDACOut(unsigned char val){
    I2CStart();
    if (!I2CWrite(0x48<<1)){ //尋址 PCF8591,如未應(yīng)答,則停止操作并返回
        I2CStop();
        return;
    }
    I2CWrite(0x40); //寫入控制字節(jié)
    I2CWrite(val); //寫入 DA 值
    I2CStop();
}
/* 按鍵動作函數(shù),根據(jù)鍵碼執(zhí)行相應(yīng)的操作,keycode-按鍵鍵碼 */
void KeyAction(unsigned char keycode){
    static unsigned char volt = 0; //輸出電壓值,隱含了一位十進(jìn)制小數(shù)位
    if (keycode == 0x26){ //向上鍵,增加 0.1V 電壓值
        if (volt < 25){
            volt++;
            SetDACOut(volt*255/25); //轉(zhuǎn)換為 AD 輸出值
        }
    }else if (keycode == 0x28){ //向下鍵,減小 0.1V 電壓值
        if (volt > 0){
            volt--;
            SetDACOut(volt*255/25); //轉(zhuǎn)換為 AD 輸出值
        }
    }
}
/* 配置并啟動 T0,ms-T0 定時時間 */
void ConfigTimer0(unsigned int ms){
    unsigned long tmp; //臨時變量
    tmp = 11059200 / 12; //定時器計數(shù)頻率
    tmp = (tmp * ms) / 1000; //計算所需的計數(shù)值
    tmp = 65536 - tmp; //計算定時器重載值
    tmp = tmp + 28; //補(bǔ)償中斷響應(yīng)延時造成的誤差
    T0RH = (unsigned char)(tmp>>8); //定時器重載值拆分為高低字節(jié)
    T0RL = (unsigned char)tmp;
    TMOD &= 0xF0; //清零 T0 的控制位
    TMOD |= 0x01; //配置 T0 為模式 1
    TH0 = T0RH; //加載 T0 重載值
    TL0 = T0RL;
    ET0 = 1; //使能 T0 中斷
    TR0 = 1; //啟動 T0
}
/* T0 中斷服務(wù)函數(shù),執(zhí)行按鍵掃描 */
void InterruptTimer0() interrupt 1{
    TH0 = T0RH; //重新加載重載值
    TL0 = T0RL;
    KeyScan(); //按鍵掃描
}