一、实验目的 1、熟悉A/D转换的原理。 2、进一步熟悉I2C总线工作的原理,熟悉PCF8591芯片的工作特性。 3、掌握PCF8591芯片A/D转换的编程应用。 二、实验设备 计算机一台;单片机实验仪一台;Keil C51和Proteus软件。 三、实验内容 根据下面的电路图、I2C总线工作的原理和PCF8591手册,编程实现:将PCF8591的AIN0引脚输入的0~5V模拟电压(由电位器产生)进行A/D转换,并将转换结果输出到P0口(P0口接8个LED),要求P0口的8个灯能实时反映出输入的模拟电压。 四、实验电路图 五、实验源程序 #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; } }
|