打印

求助:我这个 A/D 转换哪里错了,谢谢!

[复制链接]
1721|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
npsgsys|  楼主 | 2012-2-3 17:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
a/d, AD, dc, ADC, ui
#include <intrins.h>
#include <string.h>
#include <STC12C5620AD.h>
#include <absacc.h>
#include <stdlib.h>
#include <stdio.h>
sfr P1ASF       =   0x9D;           //P1 secondary function control register
sfr ADC_RES     =   0xBD;           //ADC high 8-bit result register
#define DATA_P P0
#define uChar8  unsigned char      //定义无符号 char 类型
#define uInt    unsigned int       //定义无符号 int  类型
//以下选择 ADC 转换速率,只能选择其中一种
                        //          SPEED1 SPEED0  A/D转换所需时间
//#define AD_SPEED   0x60 //0110,0000   1      1     270个时钟周期转换一次,
                        //                         CPU工作频率27MHz时,
                        //                         A/D转换速度约100KHz
//#define AD_SPEED   0x40 //0100,0000   1      0     540个时钟周期转换一次
//#define AD_SPEED   0x20 //0010,0000   0      1     810个时钟周期转换一次
//#define AD_SPEED   0x00 //0000,0000   0      0     1080个时钟周期转换一次
//看门狗刷新
sbit  WDCLEAR = P3^3; //
uInt  DogCount = 0;
//---------------------------------程序过程调用-------------------------------
//bit    CallTouCoinsFlag = 0;                    //调用投币函数标志
//---------------------------------程序过程调用-------------------------------
uChar8 channel = 0;        //转换通道
uChar8 P10ADTimes = 0;     //P10 A/D 转化次数
uChar8 P11ADTimes = 0;     //P10 A/D 转化次数
uInt P10ADValue[4] = 0;    //P10 A/D 转化 值
uInt P11ADValue[4] = 0;    //P11 A/D 转化 值
//uInt P10ADLastValue = 0;    //P10 A/D 最新 转化 值
//uInt P11ADLastValue = 0;    //P11 A/D 最新 转化 值
uInt P10ADAvgValue = 0;     //P10 A/D 平均 转化 值
uInt P11ADAvgValue = 0;     //P11 A/D 平均 转化 值
char P10ADAvgValues[5] = {0};     //P10 A/D 平均 转化 值
char P11ADAvgValues[5] = {0};     //P11 A/D 平均 转化 值
char P11SendADValues1[11] = {0};     //P11 A/D 发送 值1
//char P11SendADValues2[12] = {0};     //P11 A/D 发送 值1
//-----------------------------------函数声明------------------------------
/*
函数原型:void Delays(uInt i,uInt y)
入口参数:i,y  分别为循环 次数
作用描述:延时
*/
void Delays(uInt i,uInt y); //延时
//-----------------------------------函数定义------------------------------
/*
函数原型:void Delays(uInt i,uInt y)
入口参数:i,y  分别为循环 次数
作用描述:延时
*/
void Delays(uInt i,uInt y) //延时
{
   uInt j = 0;
   uInt k = 0;
   for(j = 0; j < i; j ++)
   {
      for(k = 0; k < y; k++)
      {
         WDT_CONTR = 0x3c;   //喂狗
      }
   }
}
void get_AD_result(void)
{
    uChar8 i = 0;
   
    ADC_DATA  = 0;
    ADC_LOW2  = 0;
   
    ADC_CONTR = 0xE0;               //1110,0000 清 ADC_FLAG, ADC_START 位和低 3 位   
   
    switch(channel)
    {
      case 0: //P1.0
            ADC_CONTR &= 0xf8; // CHS0 CHS1 CHS2 0/0/0
            //P10ADTimes ++;        //P10 A/D 转化次数
            break;
      case 1: //P1.1
            ADC_CONTR &= 0xfe; // CHS0 CHS1 CHS2 0/0/1
            //P11ADTimes ++;        //P11 A/D 转化次数
            break;
      default:
            break;
    }
    Delays(1,2);                       //使输入电压达到稳定
    ADC_CONTR |= 0x08;              //0000,1000 令 ADCS = 1, 启动A/D转换,
   
  
    while (1)                       //等待A/D转换结束
    {
        if (ADC_CONTR & 0x10)       //0001,0000 测试A/D转换结束否
        { break; }
    }
   
   
    ADC_CONTR &= 0xE7;              //1111,0111 清 ADC_FLAG 位, 关闭A/D转换,
   
    channel ++;
    if(channel > 1)
    {
      channel = 0;
    }
}
void main()
{
    Delays(10,10);    //延时
    //P0口初始化
  P0=0xff;
  //P1口初始化
  P1=0xff;
  //P2口初始化
  P2=0xff;
  //P3口初始化
  P3=0xff;
    WDT_CONTR = 0x3c;             //内部看们
   Delays(50,50);    //延时
   EA = 0;
   
   TMOD = 0x21;                  //定时器1模式1  定时器0模式1
   //---------------------------处理串口中断---------------------------------------
   SCON = 0x50;                  //串行口工作方式1, 10 位异步收发,波特率由定时器控制
   PCON |= 0x00;
   TL1 = 0xFA;
   TH1 = 0xFA;                   //22.1184M晶振 波特率9600
   //---------------------------处理串口中断---------------------------------------
   
    //------------------------------处理中断喂狗------------------------------------  
    TH0 =0xb8;     //预置计数初值,每 8 ms 中断一次 晶振 22.1184
    TL0 =0x00;
    //------------------------------处理中断喂狗------------------------------------
    EA = 1 ;                    //允许中断
    ES = 1 ;                    //允许串行中断
   // ET0 = 1;                    //T/C0 开中断(定时器0/计数器0)
    ET1 = 0;                    //T/C0 开中断(定时器0/计数器0)
   
    TR1 = 1;                    //启动定时器1/计数器1
    //TR0 = 1;                    //启动定时器0/计数器0
   
    P1ASF = 0xff;                   //Open 8 channels ADC function
     ADC_RES = 0;                    //Clear previous result
     
     P1M0 = 0xff;
    P1M1 = 0xff;
    //P1 口设定
    //P1M0[7:0]  P1M1[7:0]
    //1  0 仅为输入(高阻),如果该 I/O 口需要作为 A/D 使用,可选此模式
    //1  1 开漏(Open Drain),如果该 I/O 口需要作为 A/D 使用,可选此模式
   
     ADC_CONTR |= 0x80;              //1000,0000 打开 A/D 转换电源
                                    //CHS0 CHS1 CHS2
     ADC_CONTR |= 0x40;               //SPEED1 1
    ADC_CONTR &= 0xd0;               //SPEED0 0
    //540 个时钟周期
   
    while(1)
    {
       DogCount ++;
       if(DogCount >= 10)
       {
         DogCount = 0;
         WDCLEAR = ~WDCLEAR;      //喂狗
           WDT_CONTR = 0x3c;        //内部看们狗
       }        
       get_AD_result( );
    }
}

现在问题出在:
while (1) //等待A/D转换结束
    {
        if (ADC_CONTR & 0x10)       //0001,0000 测试A/D转换结束否
        { break; }
    }
程序运行不出来。
各位大哥,我哪里错了?
谢谢!

相关帖子

沙发
ghpzhu| | 2012-2-3 17:16 | 只看该作者
没用过这个MCU,不过你想想你的break能跳出while(1)吗?

使用特权

评论回复
板凳
npsgsys|  楼主 | 2012-2-4 08:23 | 只看该作者
是啊~

使用特权

评论回复
地板
cjseng| | 2012-2-4 17:31 | 只看该作者
起码这一段有问题吧。
while (1)                       //等待A/D转换结束
    {
        if (ADC_CONTR & 0x10)       //0001,0000 测试A/D转换结束否
        { break; }
    }

使用特权

评论回复
5
ghpzhu| | 2012-2-4 19:01 | 只看该作者
修改成while((ADC_CONTR & 0x10) != 1);试一下吧

使用特权

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

本版积分规则

11

主题

12

帖子

0

粉丝