微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 求大神帮忙看看这个AD程序,怎么改下可以用。

求大神帮忙看看这个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);


}


已退回1积分

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

网站地图

Top