立即注册 找回密码

微雪课堂

搜索
微雪课堂 C8051 C8051F单片机笑傲江湖 查看内容

使用PCF8591对C8051F进行AD转换

2015-7-13 10:06| 发布者: kaloha| 查看: 6582| 评论: 0

摘要: 系统功能   使用PCF8591对C8051F进行AD转换。硬件设计使用PCF8591对C8051F进行AD转换电路原理图软件设计下面部分从TXT拷出,拷到网页,代码部分缺省了很多空格,比较凌乱,请谅解!I2C(SMBus)详细程序请查看C8051F ...
系统功能

   使用PCF8591对C8051F进行AD转换。


硬件设计

使用PCF8591对C8051F进行AD转换电路原理图


软件设计

下面部分从TXT拷出,拷到网页,代码部分缺省了很多空格,比较凌乱,请谅解!
I2C(SMBus)详细程序请查看C8051F I2C(SMBus)程序
 

//目标系统: 基于C8051F单片机
//应用软件: Silicon IDE / Keil

/*01010101010101010101010101010101010101010101010101010101010101010101
----------------------------------------------------------------------
实验内容:
利用PCF8591进行AD数据转换,转换的值返回到P2口中,P2口与LED相连,观测LED灯是否正确显示
----------------------------------------------------------------------
硬件连接:
将P2口与8位LED指示灯相连。
在PCF8591的AIN0端口接入一个10K的电位器
DVK501(PCF8591PrlPort)    F320 EX
                           VCC    ---------   VCC
                           GND   ---------   GND
                           SDA    ---------   P1.0  
                           SCL    ---------   P1.1
----------------------------------------------------------------------
注意事项:
(1)若有加载库程序,请将光盘根目录下的“library”下的“C8051F”文件夹拷到D盘
(2)请详细阅读:光盘根目录下的“说明书首页.htm”里的相应产品说明
----------------------------------------------------------------------
10101010101010101010101010101010101010101010101010101010101010101010*/

#define _DVK501_F320_EX_

#include <c8051f320.h>
#include <../../../../library/C8051F/ws_clock.h>
#include <../../../../library/C8051F/ws_delay.h>
#include <../../../../library/C8051F/ws_iic_port.h>
#include <../../../../library/C8051F/ws_pcf8591.h>

void main(void)
{
uchar *pGetDat,tmp = 0;

PCA0MD &= ~0x40; // Clear watchdog timer enable
clock_external(); // Set oscillator in external,the clock is 12M
delay_ms(100);
Check_SDA();
XBR1 = 0x40; // Enable crossbar and weak pull-ups
SMBus_Init();
Enb_Interrupt();

while(1)
{
PCF8591_getAD(MODE0,CHNL0,pGetDat);
if(*pGetDat != tmp)
{
showLine(11,1,lcd_buffer,"0x%x2",*pGetDat);
refreshLCD(lcd_buffer);
tmp = *pGetDat;
P2 = tmp;
}
delay_ms(100);
}
}

#define MODE0 0x00 //Channel0 = AIN0;
//Channel1 = AIN1;
//Channel2 = AIN2;
//Channel3 = AIN3;
#define MODE1 0x10 //Channel0 = AIN3-AIN0;
//Channel1 = AIN3-AIN1
//Channel2 = AIN3-AIN2;
#define MODE2 0x20 //Channel0 = AIN0;
//Channel1 = AIN1;
//Channel2 = AIN3-AIN2;
#define MODE3 0x30 //Channel0 = AIN1-AIN0;
//Channel1 = AIN3-AIN2;
#define CHNL0 0 //Using Channel0
#define CHNL1 1 //Using Channel1
#define CHNL2 2 //Using Channel2
#define CHNL3 3 //Using Channel3

#define DAouputEn 0x40 //0x50 or 0x60 or 0x70 is also ok!

void PCF8591_getAD(uchar mode,uchar chan,uchar *ADC)
{
SMBus_Write(0x90,mode|chan,0,1);
SMBus_Read(0x91,ADC,1);
}

void PCF8591_setDA(uchar val)
{
SMBus_Write(0x90,DAouputEn,val,2);
}


系统调试

调电位器上的旋钮,观察每次调完后LED灯的现象。

以上资料由微雪电子整理并发布,未经许可不得转载,否则追究相应责任!


454

顶一下

刚表态过的朋友 (454 人)

最新评论

所有教程

微雪官网|产品资料|手机版|小黑屋|微雪课堂. ( 粤ICP备05067009号 )

GMT+8, 2024-12-27 18:55 , Processed in 0.017637 second(s), 20 queries .

返回顶部