打印

大家帮忙看看这个STC12C5A60S2的AD转换程序

[复制链接]
2718|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wdlxhy|  楼主 | 2012-5-24 20:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这是我自己写的一个程序,把采集的数据存在外扩的SRAM里,然后再一起发送出去。

#include<reg51.h>
#include<intrins.h>
typedef unsigned char uchar;
typedef unsigned int uint;
uint i =0;
uint j =0;
uint k =0;
sbit EADC = IE^5;
uchar xdata sram8k[8000];

/*Declare SFR associated with the ADC */
sfr AUXR = 0x8E;

sfr BUS_SPEED = 0xA1;
sfr ADC_CONTR = 0xBC; //ADC control register
sfr ADC_RES = 0xBD; //ADC hight 8-bit result register
sfr ADC_RESL = 0xBE;
sfr P1ASF = 0x9D; //P1 secondary function control register
/*Define ADC operation const for ADC_CONTR*/
#define ADC_POWER 0x80 //ADC power control bit
#define ADC_FLAG 0x10 //ADC complete flag
#define ADC_START 0x08 //ADC start control bit
#define ADC_SPEEDLL 0x00 //540 clocks
#define ADC_SPEEDL 0x20 //360 clocks
#define ADC_SPEEDH 0x40 //180 clocks
#define ADC_SPEEDHH 0x60 //90 clocks

void delay (void)
{
_nop_();
  _nop_();
   _nop_();
    _nop_();
}

/*-------唤醒及通讯部分-------*/
void serial_initial (void)
{
WAKE_CLK0=0x40;    //允许RXD下降沿唤醒
SCON=0x40;
    //串口模式1,禁止接收数据
TMOD = 0x20;       //设置定时器1为8位自动重装计数器
TH1 = 0xfd;   
//波特率9600
TL1 = 0xfd;  
TR1 = 1;           //开定时器1
ES=1;
}

void Uart_SendData(uchar dat)

{
  SBUF=dat;        
  while(TI==0){};    //等待发送
  TI=0;            //清发送标志位
}

/*-------AD采集部分-------*/
void adc_initial (void)
  
{
AUXR=0x02;          //访问外部扩展ram
AUXR1=0x04;         //10位A/D转换结果的高2位放在ADC_RES寄存器,低8位放在ADC_RESL寄存器
BUS_SPEED=0x23;
P1ASF=0x01;
     //P1.0作为AD使用
ADC_RES=0;

ADC_RESL=0;
  
ADC_CONTR=ADC_POWER|ADC_SPEEDLL;
delay();
EADC=1;
  //开ADC中断
EA=1;
  //开总中断
}

void get_ADC_result( )
{
if(i==39990)
  {
   P1ASF=0x02;
//P1.1作为AD通道
   ADC_CONTR|=0x01;                      //切换到通道1,采集压力数据
   delay();
  }
ADC_CONTR|=ADC_START;
                  //启动ADC
delay();
}

void ADC_isr (void) interrupt 5
{
sram8k[j]=(ADC_RES&0x03);
j++;
sram8k[j]=ADC_RESL;
j++;
ADC_CONTR&=!ADC_FLAG;
}

/*-------主函数-------*/
void main(void)
{
while(1)
{
  serial_initial();
  adc_initial();
  for(i=0;i<=39990;i++)
   {

if(i%10==0)
//采样频率调配至2KHz
     {

  get_ADC_result();

}
   }
  for(k=0;k<8000;k++)
    {
     Uart_SendData(sram8k[k]);
    }
  }
}

我设置ADRJ=1,那么10位A/D转换结果的高2位存放在ADC_RES的低2位中,低8位存放在ADC_RESL中,发送出去的数据应该是这样的格式:0X XX 0X XX 。现在的问题是(1)每两个数据都是一样的(比如前四个数据是81 81 53 53);(2)sram8k[j]=(ADC_RES&0x03)这条指令似乎没有被执行

相关帖子

沙发
NE5532| | 2012-5-24 21:44 | 只看该作者
先硬赋值给串口发送函数,看这个函数对不对,对了以后再把AD部分加进来,程序要模块化调试,不要一把抓。推荐本版精华帖《程序调试黑宝书》

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

1

帖子

0

粉丝