pcf8591t中文资料可以控制选择段么

 > PCF8591
PCF85910人关注
PCF8591资讯
PCF8591技术
PCF8591资料下载
PCF8591帖子
PCF8591DIY创意
关注此标签的用户(0人)
Copyright &
.All Rights ReservedPCF8591T芯片AD转换的问题,为什么出不来结果?在哪里出问题了 - 51单片机 -
单片机爱好者-DOFLY(德飞莱)技术支持论坛(www.doflye.net) 单片机|开发板|实验板|编程器|机器人|ARM|智能控制|模块|mcu fans - Powered by Discuz!
帖子7&主题2&精华0&积分62&威望9 &金钱40 &贡献2 &注册时间&
PCF8591T芯片AD转换的问题,为什么出不来结果?在哪里出问题了
/************************************************************
&&Copyright (C),1
&&FileName: AD.c
&&Author:WuHan& && &&&Version :1.0& && && &Date:
&&Description: 用AD以1HZ的频率采集模拟信号,然后转换成数字量,再将其以1200bps发送到计算机,在计算机上显示。
& && && && && &ADC芯片为PCF8591
&&Function List:& && && && && && && && && && && & // 主要函数及其功能
& && & & && &1.void InitUART&&(void)& & & & & & & && && && && && &//串行异步通信,串口初始化
& & & && &2.void Uart_isq () interrupt 4& & & && && && &&&//串行异步通信,中断服务程序
& & & && &3.void InitTimer&&(void)& & & & & & & && && && && && &//定时器初始化
& & & && &4.void TimerIsr () interrupt 1& & & && && && &&&//定时器中断服务程序
& & & && &3.unsigned char ReadADC (unsigned char Chl) //获取数字值
& & & && &4.void&&SendByte (unsigned char byte)& & & & & & & & & & & & & & & & //字节数据传送函数& && && && && &
& & & && &5.void StartI2c ()& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & //启动I2C
& && & & && &6.unsigned char&&RcvByte ()& & & & & & & & & & & & & & & & & & & & & & & & //字节数据传送函数
& && &7.void StopI2c ()& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & && &&&//结束总线
& && &8.void NoAckI2c (void);& & & & & & & & & & & & & & & & & & & & & & & && &&&//无应答函数
& & & && &9.void SendDig ()& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & //单片机向电脑发送一个字节
& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & && & & & & & & & & & & & & && &
&&History:& && && &// 历史修改记录
& && &&author&&&&time&& &&version && &&desc&
& && &WuHan& & 14/04/04& &&&1.0& &&&build this moudle&&
***********************************************************/
#include&reg52.h&
#include&intrins.h&
#define&&_Nop()&&_nop_()&&//定义空指令
const unsigned char AddWr = 0x90;& &//写数据地址 ADC的控制字节
const unsigned char AddRd = 0x91;& &//读数据地址
unsigned char g_& & & & & & & && & //返回数字值
unsigned char g_flag = 0;& & & && & //标志位
sbit SDA = P2^1;
sbit SCL = P2^0;
sbit LED = P0^1;
//函数声明
void InitUART&&(void);& & & & & & & &&&//串行异步通信,串口初始化
unsigned char ReadADC (unsigned char chl); //获取数字值
void&&SendByte (unsigned char byte);& & & & & & & & & & & & & & & && &&&//字节数据传送函数& && && && && &
void StartI2c();& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & //启动I2C
unsigned char&&RcvByte();& & & & & & & & & & & & & & & & & & & & & & & && &&&//字节数据传送函数
void StopI2c ();& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & && &&&//结束总线
void NoAckI2c(void);& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & //无应答函数
void SendDig (unsigned char g_dig);& && && && && &&&//向电脑送数
//定时器中断初始化
void InitTimer ()
& & & & TMOD = 0x01;
& & & & TH0 = (65536 - 50000) / 256;
& & & & TL0 = (65536 - 50000) % 256;
& & & & TR0 = 1;
& & & & EA = 1;
& & & & ET0 = 1;
//串行异步通信,串口初始化
void InitUART&&(void)
& & SCON&&= 0x50;& & & & & & & && && && &// SCON: 模式 1, 8-bit UART, 使能接收&&
& & TMOD |= 0x20;& && && && && &// TMOD: timer 1, mode 2, 8-bit 重装
& & TH1& &= 0xe8;& && && && && &// TH1:&&重装值 1200 波特率 晶振 11.0592MHz&&
& & TR1& &= 1;& && && && && && &// TR1:&&timer 1 打开& && && && && && && && &
& & EA& & = 1;& && && && && && &//打开总中断
& & ES& & = 1;& && && && && && &//打开串口中断
//单片机向电脑发送一个字节
void SendDig (unsigned char g_dig)
& & & & SBUF = g_
//& & & & while (!TI);
//& & & & TI = 0;
void SendStr (unsigned char *s)
& & & & while(*s!='\0')// \0 表示字符串结束标志,通过检测是否字符串末尾
& & & & & & SendDig (*s);
& &&&& & & & s++;
//获取数字值
unsigned char ReadADC (unsigned char Chl)
& & & & StartI2c();& & & & & & & & & & & & & & & && & //启动总线
& & & & SendByte (AddWr);& & & & & & & && & //发送器件地址
& & if (ack == 0)& & & & & & & & & & & && & //如果应答失败,返回0
& & & & & & & & return 0;
& & SendByte (0x40 | Chl);& && & //发送器件子地址,Chl表示需要转换的通道,范围从0-3
& & if (ack == 0)
& & & & & & & & return 0;
& & StartI2c ();
& & SendByte (AddWr + 1);& & & & & & & & //不知道为什么要+1,读数据地址& & & & AddWr+1
& & & & if (ack == 0)
& & & & & & & & return 0;
& & g_dig = RcvByte ();
& & NoAckI2c();& && && && && &&&//发送非应位
& & StopI2c();& && && && && && &//结束总线
& & return g_
//字节数据传送函数& && && && && &
void&&SendByte (unsigned char byte)
& & & & unsigned char bitC
& & & & for (bitCnt=0; bitCnt&8; bitCnt++)&&//要传送的数据长度为8位
& & & & & & if ((byte && bitCnt) & 0x80)
& & & & & & & & {
& & & & & & & & & & & & SDA = 1;& &//判断发送位
& & & & & & & & }
& & & && &&&else&&
& & & & & & & & {
& & & & & & & & & & & & SDA=0;
& & & & & & & & }& && && && && &
& & & && &&&_Nop();
& & & && &&&SCL=1;& && && && && &//置时钟线为高,通知被控器开始接收数据位
& & & && &&&_Nop();
& & & && &&&_Nop();& && && && & //保证时钟高电平周期大于4μ
& & & && &&&_Nop();
& & & && &&&_Nop();
& & & && &&&_Nop();& && && &
& & & && &&&SCL=0;
& & & &&&}
& & & && &&&
& & & &&&_Nop();
& & & &&&_Nop();
& & & &&&SDA=1;& && && && && &//8位发送完后释放数据线,准备接收应答位
& & & &&&_Nop();
& & & &&&_Nop();& &
& & & &&&SCL=1;
& & & &&&_Nop();
& & & &&&_Nop();
& & & &&&_Nop();
& & & &&&if(SDA==1)
& & & &&&{
& & & && && &ack=0;
& & & &&&}& &&&
& & & &&&else & & & & & & & & & & & & & & & & & & & && &//判断是否接收到应答信号
& & & &&&{
& & & &&&& & & & ack = 1;
& & & &&&}& && &&&
& & & &&&SCL = 0;
& & & &&&_Nop ();
& & & &&&_Nop ();
void StartI2c()& &
& & & & SDA=1;& &//发送起始条件的数据信号
& & & & _Nop();
& & & & SCL=1;
& & & & _Nop();& & //起始条件建立时间大于4.7us,延时
& & & & _Nop();
& & & & _Nop();
& & & & _Nop();
& & & & _Nop();& &
& & & & SDA=0;& &&&//发送起始信号
& & & & _Nop();& & //起始条件锁定时间大于4μ
& & & & _Nop();
& & & & _Nop();
& & & & _Nop();
& & & & _Nop();& && &
& & & & SCL=0;& & //钳住I2C总线,准备发送或接收数据
& & & & _Nop();
& & & & _Nop();& & & && &&&
//字节数据传送函数& && && && && &
unsigned char&&RcvByte()
& & & & unsigned char rcByte = 0;& & & && & //单片机接收的数据
& & & & unsigned char bitC
& & & && &
& & & & SDA = 1;& && && && & //置数据线为输入方式
& & & & for (bitCnt=0; bitCnt&8; bitCnt++)
& & & && &&&_Nop();& && && &&&
& & & && &&&SCL = 0;& && & //置时钟线为低,准备接收数据位
& & & && &&&_Nop();
& & & && &&&_Nop();& && &//时钟低电平周期大于4.7us
& & & && &&&_Nop();
& && &&&_Nop();
& & & & & & & & _Nop();
& & & && &&&SCL = 1;& && & //置时钟线为高使数据线上数据有效
& & & && &&&_Nop();
& & & && &&&_Nop();
& & & && &&&rcByte = (rcByte && 1);
& & & && &&&if (SDA == 1)
& & & & & & & & {
& & & & & & & & & & & & rcByte = (rcByte + 1); //读数据位,接收的数据位放入rcByte中
& & & && &&&}
& & & & & & & & _Nop();
& & & && &&&_Nop();
& & & & SCL = 0;& &
& & & & _Nop();
& & & & _Nop();
& & & & return rcB
//非应答子函数&&
void NoAckI2c (void)
& & & & SDA = 1;
& & & & _Nop ();
& & & & _Nop ();
& & & & _Nop ();& && &
& & & & SCL = 1;
& & & & _Nop ();
& & & & _Nop ();& && && && &&&//时钟低电平周期大于4μ
& & & & _Nop ();
& & & & _Nop ();
& & & & _Nop ();&&
& & & & SCL = 0;& && && && && & //清时钟线,钳住I2C总线以便继续接收
& & & & _Nop ();
& & & & _Nop ();& &
//结束总线
void StopI2c ()
& & & & SDA=0;& & //发送结束条件的数据信号
& & & & _Nop();& &//发送结束条件的时钟信号
& & & & SCL=1;& & //结束条件建立时间大于4μ
& & & & _Nop();
& & & & _Nop();
& & & & _Nop();
& & & & _Nop();
& & & & _Nop();
& & & & SDA=1;& & //发送I2C总线结束信号
& & & & _Nop();
& & & & _Nop();
& & & & _Nop();
& & & & _Nop();
void main()
& & //IP = 0x12;
& & & & InitUART ();
& & & & InitTimer ();
& & & & SendStr(&AD转换测试&);
& & while (1)& && && && && && && &&&
& & {& & & &
& & & & if (g_flag == 1)
& & & & & & & & {
& & & & & & & & & & & & g_flag = 0;
& & & & & & & & & & & & g_dig = ReadADC (1);
& & & & & & & & & & & & SendDig (g_dig);
& & & & & & & & }
//定时器中断服务程序
void TimerIsr () interrupt 1
& & & & static unsigned char cnt = 0;
& & & & TF0 = 0;
& & & & TH0 = (65536 - 50000) / 256;
& & & & TL0 = (65536 - 50000) % 256;
& & & & cnt++;
& & & & if (cnt == 20)
& & & && &&&cnt = 0;
& & & & & & & & g_flag = 1;
& & & & & & & & LED = ~LED;
//串行异步通信,中断服务程序
void UartIsq() interrupt 4
& & & && && && & //定义临时变量
& & if (RI)& && && && && && && && &//判断是接收中断产生
& & & & & & & & RI = 0;& && && && && && && & //标志位清零
& & & && &&&temp = SBUF;& && && && && &&&//读入缓冲区的值
& & & && &&&P1 =& && && && && && & //把值输出到P1口,用于观察
& && &&&SBUF =& && && && && &&&//把接收到的值再发回电脑端
& & & &&&}
& & if (TI)& && && && && && && && &//如果是发送标志位,清零
& & TI = 0;
[通过 QQ、MSN 分享给朋友]PCF8591单片机AD和DA实验_图文_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
评价文档:
PCF8591单片机AD和DA实验
上传于||暂无简介
大小:273.00KB
登录百度文库,专享文档复制特权,财富值每天免费拿!
你可能喜欢义项指多义词的不同概念,如的义项:网球运动员、歌手等;的义项:冯小刚执导电影、江苏卫视交友节目等。
PCF8591是一个单片、单独、低功耗、8-bit CMOS数据获取器件。PCF8591具有4个输入、1个模拟输出和1个串行I2C总线接口。PCF8591的3个地址引脚A0, A1和A2可用于硬件地址编程,允许在同个I2C总线上接入8个PCF8591器件,而无需额外的硬件。在PCF8591器件上输入输出的地址、控制和信号都是通过双线双向I2C总线以串行的方式进行。
外文名称 pcf8591
AGND 模拟信号地
VREF 基准电源端
PCF8591是一个单片集成、单独供电、低功耗、8-bit CMOS器件。PCF8591具有4个模拟输入、1个模拟输出和1个串行I2C。PCF8591的3个地址引脚A0, A1和A2可用于硬件地址编程,允许在同个I2C总线上接入8个PCF8591器件,而无需额外的硬件。在PCF8591器件上输入输出的地址、控制和都是通过双线双向I2C总线以串行的方式进行传输。
PCF8591的功能包括多路模拟输入、内置跟踪保持、8-bit和8-bit。PCF8591的最大转化速率由I2C总线的最大速率。
【1】单独供电【2】PCF8591的操作电压范围2.5V-6V【3】低待机电流【4】通过I2C总线串行输入/输出【5】PCF8591通过3个硬件地址引脚寻址【6】PCF8591的采样率由I2C总线速率决定【7】4个模拟输入可编程为单端型或【8】自动增量频道选择【9】PCF8591的范围从VSS到VDD【10】PCF8591内置跟踪保持电路【11】8-bit逐次逼近A/D转换器【12】通过1路模拟输出实现DAC增益
AIN0~AIN3:输入端。A0~A2:引脚地址端。VDD、VSS:电源端。(2.5~6V)SDA、SCL:I2C 总线的数据线、时钟线。OSC:外部时钟输入端,内部时钟输出端。EXT:内部、外部时钟线,使用内部时钟时 EXT 接地。AGND:模拟信号地。AOUT:D/A 转换输出端。VREF:基准电源端。原理图
{{each(i, video) list}}
{{if list.length > 8}}
查看全部 ${list.length} 期节目
{{if _first}}
内容来源于
{{if list && list.length}}

我要回帖

更多关于 pcf8591中文资料 的文章

 

随机推荐