打印
[国产单片机]

STC12C5202AD 转换程序

[复制链接]
1473|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
raphaelkino|  楼主 | 2014-7-15 15:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
程序是为了测试AD转换功能,只用到P1^0一路作为AD转换,大于设定数值对应LED亮,但目前程序完全不受外部电压控制,接上0V或者5V甚至不接悬空,其结果也是一样的,无任何变化,请高手帮忙分析分析问题出在哪里。外围电路是根据STC手册上接的(电压信号源通过一个1K的电阻之后并一个47PF的电容连接到P1^0口)。

#include<reg51.h>
#include "intrins.h"

#define uchar unsigned char
#define uint unsigned int

uchar Vo;                //A/D转换后换算的电压值

/*Declare SFR associated with the ADC */
sfr ADC_CONTR   =   0xBC;           //ADC control register
sfr ADC_RES     =   0xBD;           //ADC high 8-bit result register
sfr ADC_RESL    =   0xBE;                        
//sfr ADC_LOW2    =   0xBE;           //ADC low 2-bit result register
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         模数转换启动控制位

//转换速度控制位SPEED0和SPEED1,共四种状态,对应四种转换速度
#define ADC_SPEEDLL 0x00            //540 clocks
#define ADC_SPEEDL  0x20            //360 clocks
#define ADC_SPEEDH  0x40            //180 clocks
#define ADC_SPEEDHH 0x60            //90 clocks

sbit LED7 = P1^7;
sbit LED5 = P1^5;

void DelayMS(uint ms)
{
   uint i;
   while(ms--)
   {
           for(i=0;i<120;i++);
   }
}

/*----------------------------
Software delay function
----------------------------*/
void Delay(uint n)
{
     uint x;

     while (n--)
     {
         x = 5000;
         while (x--);
     }
}


/*----------------------------
Initial ADC sfr
----------------------------*/
void InitADC()
{
     P1ASF = 0x01;                   //选择P1.0作为A/D输入通道
    ADC_RES = 0;                    //清0
     ADC_CONTR = ADC_POWER | ADC_SPEEDLL;   //0x10|0x00=0x10:开电源和设置A/D转换速度
    Delay(2);                       //ADC power-on and delay
}


/*----------------------------
Get ADC result
----------------------------*/
uchar GetADCResult(uchar ch)
{
     ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START;//0x00|0x00|ch|0x08:选择A/D输入通道,开始A/D转换
    _nop_();         //Must wait before inquiry ,
    _nop_();        //设置ADC_CONTR寄存器后需加4个CPU时钟周期的延时,才能保证值被写入ADC_CONTR寄存器
    _nop_();
     _nop_();
     while (!(ADC_CONTR & ADC_FLAG));//Wait complete flag
     ADC_CONTR &= ~ADC_FLAG;         //Close ADC

     Vo=ADC_RES*5*10/256;                 //Return ADC result(为显示整数,这里将电压值扩大了十倍)
    return Vo;
}

void main()
{               
     InitADC();
                        
         while (1)
         {
                 GetADCResult(0);
                                 if (GetADCResult(0) >= 40)
                                {
                                        LED7 = 0; LED5 = 1;
                                }
                                else
                                {
                                        LED5 = 0; LED7 = 1;
                                }
                 DelayMS(1000);
         }
}


相关帖子

沙发
我爱你的吻123| | 2014-7-15 15:46 | 只看该作者
我感觉这里有几个问题。

使用特权

评论回复
板凳
我爱你的吻123| | 2014-7-15 15:50 | 只看该作者
一、头文件的问题,STC12C的MCU与51的内核是一样的。但是内部IO以及一些寄存器是不一样的,所以你要用STC12C官方的库。二、你的IO口可以尝试把电容先去掉,不做滤波先试试。。。。

使用特权

评论回复
地板
我爱你的吻123| | 2014-7-15 15:51 | 只看该作者
你的IO接力0--5V都没有变化,说明你的IO根本没有反应,你可以在你的主函数里面嵌入一个LED显示程序来判断你的IO是否有反映。

使用特权

评论回复
5
raphaelkino|  楼主 | 2014-7-15 16:09 | 只看该作者
我已经改用STC官方的头文件,程序里面目前状态一直是LED7亮,无论外围电压信号源怎么样,这个LED7始终是亮的。

使用特权

评论回复
6
gxl117| | 2014-7-16 08:47 | 只看该作者
你试一下,把if里的getadcresult(0)函数换成返回值试试,不要在if条件里调用函数

使用特权

评论回复
7
amw1688| | 2014-7-18 12:55 | 只看该作者
价格低,品质好,用着方便的单片机(中颖单片机),家电巨头美的,苏伯尔都在用,快来加Q2714266616,了解详情吧,他能给你带来惊喜。

使用特权

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

本版积分规则

2

主题

7

帖子

0

粉丝