微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 紧急求助,基于51和PCF8591的AD转换,出现了错误,求指点

紧急求助,基于51和PCF8591的AD转换,出现了错误,求指点

时间:10-02 整理:3721RD 点击:
用串口调试的时候,出现Connect port read...          FAIL 是什么原因,还有大虾们看看程序有没有问题
模拟输入是脉搏波信号
/***************************************************
基于90C51和PCF8591的压力脉搏波AD转换
使用IIC和串口将数据发送到上位机
****************************************************/
#include<reg51.h>
#include <intrins.h>
#define uchar unsigned char  //宏定义
#define uint  unsigned int
      /*函数声明*/
uchar ADC_PCF8591(uchar channel);
      /*位定义*/
sbit SDA=P2^0;  
sbit SCL=P2^1;
uchar dat=0;
//uchar a[10]=0;
uchar i;
int j=0;
      /*初始化函数*/
void Init()
{
TMOD=0x21;          //定时器初始化(定时器1自动重装载,定时器0为16位计数器)
TH0=(65536-10000)/256;    //定时器0装初值(10000μs的定时)
TL0=(65536-10000)%256;
TH1=0xfd;       //定时器1设置波特率9600kps
TL1=0xfd;
EA=1;           //开中断
ET0=1;
ET1=0;
ES=1;

TR1=1;                     //定时器控制寄存器设置
TR0=1;
TI=0;
RI=0;
   
SM0=0;     //设置串口工作方式
SM1=1;
REN=1;
}
void delay()  //延时4.7μs
{  _nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
     /*I2C初始化*/
void  IIC_init(void)
{
SDA=1;            
delay();
SCL=1;
delay();
}
void IIC_start()
{  SDA=1;
   SCL=1;
   delay();
   SDA=0;
   delay();
   SCL=0;
}
void IIC_stop()
{  SCL=0;
   SDA=1;
   delay();
   SCL=1;
   delay();   
   while(SDA);
   SDA=0;
   SCL=0;
}
/*void IIC_ACK()
{  SDA=0;
   delay();
   SCL=1;
   delay();
   SCL=0;
}
void IIC_noACK()
{  SDA=1;  
   SCL=0;
   delay();
   SCL=1;
   delay();
} */
     /*串口字节发送*/
void  UART_write(uchar dat)
{   
      ES=0;
   //for(i=0;i++;i<10)
  // {
   SBUF=dat;
   //}
   while(TI==0);
   TI=0;
   ES=1;
}
   /*T0中断控制AD采样频率和串口数据发送*/
void  T0_ser()   interrupt 1
{   
      TH0=(65536-10000)/256;
   TL0=(65536-10000)%256;
   dat=ADC_PCF8591(0);//选择转换通道
   j++;
   //UART_write(dat);
   if(j==10)     //判断是否采集10个数
   {
    TR0=0;
   }
   else UART_write(dat);
}
     /*IIC写字单节数据*/
void IIC_write(uchar dat)
{   
    uchar i,temp;  
temp=dat;  
for(i=0;i<8;i++)  
{   
     temp=temp<<1;   
  SCL=0;   
  delay();   
  SDA=CY;   
  delay();   
  SCL=1;  
  delay();  
}   
     SCL=0;  
  delay();  
  SDA=1;  
  delay();
}
  
    /*IIC读字节数据*/
uchar IIC_read()
{   
    uchar i=0, temp=0;
SCL = 0;
delay();
SDA = 1;
delay();
for(i=0; i<8; i++)
{
  SCL = 1;
  delay();
  temp = (temp << 1) | SDA;
  delay();
  SCL = 0;
  delay();
}
//给从机非应答
SCL = 0;
delay();
SDA = 1;
delay();
//稳定数据等待从机读取
SCL = 1;
delay();
SCL = 0;
delay();
return temp;
}
     /*ADC采样*/
uchar ADC_PCF8591(uchar channel)
{
uchar  temp=0;

    IIC_start();  //启动总线
    IIC_write(0x90); //写器件地址
    IIC_write(0x00+channel); //选择模数频道
    //IIC_start ;//再次启动总线
    IIC_write(0x91);//对器件进行读操作
    temp=IIC_read();//接受器件转换后的结果
    IIC_stop(); //总线停止
    return temp; //返回读出的值
}
         /*主函数*/
void main()
{
    uchar i = 0;
IIC_init();
Init();
while(1)
{
  ADC_PCF8591(0x00);
}
}

这有三个功能 串行通信 I2C AD转换 你应该一个一个分析 看问题出在哪里 这样才能解决问题!

用的什么串口调试工具,找个现成的串口调试助手,把串口测通

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top