一、實(shí)驗(yàn)?zāi)康?/div> 1、熟悉A/D轉(zhuǎn)換的原理。 2、進(jìn)一步熟悉I2C總線工作的原理,熟悉PCF8591芯片的工作特性。 3、掌握PCF8591芯片A/D轉(zhuǎn)換的編程應(yīng)用。 二、實(shí)驗(yàn)設(shè)備 計(jì)算機(jī)一臺(tái);單片機(jī)實(shí)驗(yàn)儀一臺(tái);Keil C51和Proteus軟件。 三、實(shí)驗(yàn)內(nèi)容 根據(jù)下面的電路圖、I2C總線工作的原理和PCF8591手冊,編程實(shí)現(xiàn):將PCF8591的AIN0引腳輸入的0~5V模擬電壓(由電位器產(chǎn)生)進(jìn)行A/D轉(zhuǎn)換,并將轉(zhuǎn)換結(jié)果輸出到P0口(P0口接8個(gè)LED),要求P0口的8個(gè)燈能實(shí)時(shí)反映出輸入的模擬電壓。 四、實(shí)驗(yàn)電路圖 五、實(shí)驗(yàn)源程序 #include <reg52.h> #include <intrins.h> sbit SCL=P2^1; sbit SDA=P2^0; void start() { SDA=1; SCL=1; _nop_(); _nop_(); SDA=0; _nop_(); _nop_(); SCL=0; } void stop() { SDA=0; SCL=0; _nop_(); _nop_(); SCL=1; _nop_(); _nop_(); SDA=1; } void rack() { SCL=1; _nop_(); _nop_(); SCL=0; } void nack() { SDA=1; SCL=1; _nop_(); _nop_(); SCL=0; SDA=1; } void wbyte(unsigned char tmp) { unsigned char i; for(i=0;i<8;i++) { tmp<<=1; SDA=CY; SCL=1; _nop_(); _nop_(); SCL=0; } rack(); }
unsigned char rbyte() { unsigned char i,d; for(i=0;i<8;i++) { SCL=1; d<<=1; d=d|SDA; SCL=0; } return d; } unsigned rdata() { unsigned char d; start(); wbyte(0x90); wbyte(0); start(); wbyte(0x91); d=rbyte(); nack(); stop(); return d; } void main() { unsigned char d; while(1) { d=rdata(); P0=~d; } }
|