求大神帮忙看看这个AD程序,怎么改下可以用。
时间:10-02
整理:3721RD
点击:
单片机把下面这个AD程序烧进去后和串口助手通讯后。串口调试助手接到相同重复的数据,求问怎么之接受到一个后停止接受那。串口用RS232USB转串口实现笔记本与单片机的连接。
新人没有财富值,求好心的大神帮帮忙。
/*
* AD test
*
* 晶振:11.0592M
*/
#include <reg52.h>
#include <intrins.h>
#define nops(); do{_nop_();_nop_();_nop_();_nop_();_nop_();} while(0) //定义空指令
#define PCF8591 0x90 //PCF8591 地址
sbit ADDA_SCL = P3^7; //I2C 时钟
sbit ADDA_SDA = P3^6; //I2C 数据
bit ack; /*应答标志位*/
/**
* 发送I2C起始条件
*/
void Start_I2c()
{
ADDA_SDA=1;
nops();
ADDA_SCL=1;
nops();
ADDA_SDA=0;
nops();
ADDA_SCL=0;
nops();
}
/**
* 发送I2C结束条件.
*/
void Stop_I2c()
{
ADDA_SCL=0;
nops();
ADDA_SDA=0;
nops();
ADDA_SCL=1;
nops();
ADDA_SDA=1;
nops();
}
/**
* I2C数据发送函数
*/
void SendByte(unsigned char c)
{
unsigned char i;
for (i=0; i<8; i++)
{
if ((c<<i) & 0x80)
ADDA_SDA=1;
else
ADDA_SDA=0;
nops();
ADDA_SCL=1;
nops();
ADDA_SCL=0;
}
ADDA_SDA=1;
nops();
ADDA_SCL=1;
nops();
if (ADDA_SDA==1)
ack=0;
else
ack=1; /*判断是否接收到应答信号*/
ADDA_SCL=0;
}
/**
* I2C数据接收函数
**/
unsigned char RcvByte(void)
{
unsigned char retc=0, i;
for (i=0; i<8; i++)
{
ADDA_SCL=0;
nops();
ADDA_SCL=1;
nops();
retc <<= 1;
if (ADDA_SDA==1)
retc = retc + 1;
}
ADDA_SCL=0;
nops();
return(retc);
}
/**
* 握手函数
* a为1时发送应答信号ACK,a为0时不发送ACK
*/
void Ack_I2c(bit a)
{
if(a==0)
ADDA_SDA=0;
else
ADDA_SDA=1;
nops();
ADDA_SCL=1;
nops();
ADDA_SCL=0;
nops();
}
/**
* ADC发送字节(命令)数据函数
*
* sla--I2C从机地址
* c--控制字节或数据
*/
bit ADC_Sendbyte(unsigned char sla,unsigned char c)
{
Start_I2c(); //启动总线
SendByte(sla); //发送器件地址
if (ack==0)
return(0);
SendByte(c); //发送数据
if (ack==0)
return(0);
Stop_I2c(); //结束总线
return(1);
}
/**
* ADC读字节数据函数
*/
unsigned char ADC_Recbyte(unsigned char sla)
{
unsigned char c;
Start_I2c(); //启动总线
SendByte(sla+1); //发送器件地址
if(ack==0)
return(0);
c = RcvByte(); //读取数据0
Ack_I2c(1); //发送非就答位
Stop_I2c(); //结束总线
return(c);
}
/**
* UART初始化
* 波特率:9600
*/
void uart_init(void)
{
unsigned char u;
ET1=0;
TMOD = 0x21; // 定时器1工作在方式2(自动重装)
SCON = 0x50; // 10位uart,允许串行接受
TH1 = 0xFD;
TL1 = 0xFD;
u = SBUF;
TR1 = 1;
}
/**
* UART 发送一字节
*/
void UART_Send_Byte(unsigned char dat)
{
SBUF = dat;
while (TI == 0);
TI = 0;
}
main(void)
{
char ans;
uart_init();
ADC_Sendbyte(PCF8591,0x40);
ans = ADC_Recbyte(PCF8591); //ADC0 模数转换通道0
UART_Send_Byte(ans);
}
新人没有财富值,求好心的大神帮帮忙。
/*
* AD test
*
* 晶振:11.0592M
*/
#include <reg52.h>
#include <intrins.h>
#define nops(); do{_nop_();_nop_();_nop_();_nop_();_nop_();} while(0) //定义空指令
#define PCF8591 0x90 //PCF8591 地址
sbit ADDA_SCL = P3^7; //I2C 时钟
sbit ADDA_SDA = P3^6; //I2C 数据
bit ack; /*应答标志位*/
/**
* 发送I2C起始条件
*/
void Start_I2c()
{
ADDA_SDA=1;
nops();
ADDA_SCL=1;
nops();
ADDA_SDA=0;
nops();
ADDA_SCL=0;
nops();
}
/**
* 发送I2C结束条件.
*/
void Stop_I2c()
{
ADDA_SCL=0;
nops();
ADDA_SDA=0;
nops();
ADDA_SCL=1;
nops();
ADDA_SDA=1;
nops();
}
/**
* I2C数据发送函数
*/
void SendByte(unsigned char c)
{
unsigned char i;
for (i=0; i<8; i++)
{
if ((c<<i) & 0x80)
ADDA_SDA=1;
else
ADDA_SDA=0;
nops();
ADDA_SCL=1;
nops();
ADDA_SCL=0;
}
ADDA_SDA=1;
nops();
ADDA_SCL=1;
nops();
if (ADDA_SDA==1)
ack=0;
else
ack=1; /*判断是否接收到应答信号*/
ADDA_SCL=0;
}
/**
* I2C数据接收函数
**/
unsigned char RcvByte(void)
{
unsigned char retc=0, i;
for (i=0; i<8; i++)
{
ADDA_SCL=0;
nops();
ADDA_SCL=1;
nops();
retc <<= 1;
if (ADDA_SDA==1)
retc = retc + 1;
}
ADDA_SCL=0;
nops();
return(retc);
}
/**
* 握手函数
* a为1时发送应答信号ACK,a为0时不发送ACK
*/
void Ack_I2c(bit a)
{
if(a==0)
ADDA_SDA=0;
else
ADDA_SDA=1;
nops();
ADDA_SCL=1;
nops();
ADDA_SCL=0;
nops();
}
/**
* ADC发送字节(命令)数据函数
*
* sla--I2C从机地址
* c--控制字节或数据
*/
bit ADC_Sendbyte(unsigned char sla,unsigned char c)
{
Start_I2c(); //启动总线
SendByte(sla); //发送器件地址
if (ack==0)
return(0);
SendByte(c); //发送数据
if (ack==0)
return(0);
Stop_I2c(); //结束总线
return(1);
}
/**
* ADC读字节数据函数
*/
unsigned char ADC_Recbyte(unsigned char sla)
{
unsigned char c;
Start_I2c(); //启动总线
SendByte(sla+1); //发送器件地址
if(ack==0)
return(0);
c = RcvByte(); //读取数据0
Ack_I2c(1); //发送非就答位
Stop_I2c(); //结束总线
return(c);
}
/**
* UART初始化
* 波特率:9600
*/
void uart_init(void)
{
unsigned char u;
ET1=0;
TMOD = 0x21; // 定时器1工作在方式2(自动重装)
SCON = 0x50; // 10位uart,允许串行接受
TH1 = 0xFD;
TL1 = 0xFD;
u = SBUF;
TR1 = 1;
}
/**
* UART 发送一字节
*/
void UART_Send_Byte(unsigned char dat)
{
SBUF = dat;
while (TI == 0);
TI = 0;
}
main(void)
{
char ans;
uart_init();
ADC_Sendbyte(PCF8591,0x40);
ans = ADC_Recbyte(PCF8591); //ADC0 模数转换通道0
UART_Send_Byte(ans);
}
已退回1积分