紧急求助,基于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);
}
}
模拟输入是脉搏波信号
/***************************************************
基于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转换 你应该一个一个分析 看问题出在哪里 这样才能解决问题!
用的什么串口调试工具,找个现成的串口调试助手,把串口测通