打印

[51单片机] 我快被stc12c5a60s的ad转换虐疯了就是不能正常使用

[复制链接]
4124|29
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
轰轰轰|  楼主 | 2014-1-24 10:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我是一个自学stc单片机的一开始使用的at公司的89s51后来发现资源可以用的太少了。就开始接触stc的找了一个名气最大的STC12C5A60S串口什么的都一个个被我攻克了。现在遇到一个最大的问题。就是芯片原带的ad转换功能,我几乎是把官网的源代码一个字一个字的抄下了的,结果通过串口输出,但是就是数据不正常。我在要测试的接口上接上电位器,可是结果要么就是最大也就是ff,要么就是最小00我来回检查还几遍也不知道哪里出了问题求高手解决这到底是怎么回事,(注意我主要使用P17口。其他都是悬空的)这是代码

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

#define FOSC 18432000L   //
#define BAUD 9600                 //

typedef unsigned char BYTE;//
typedef unsigned int WORD;        //


sfr ADC_CONTR=0xBC;//定义ad转换电源,周期,标致,开启,转换口,数据存储位置
sfr ADC_RES=0xBD;  // 定义转换完毕数据高高八位数据位置
sfr ADC_LOW2=0xBE;  //定义转换完毕的低八位数据存放位置
sfr PIASF=0x9D;  //定义ad转换的总开关位置


#define ADC_POWER    0X80  //
#define ADC_FLAG     0X10  //
#define ADC_START    0X08  //
#define ADC_SPEEDLL  0X00  //主要用来设置转换周期540周期
#define ADC_SEEDL    0X20  // 360周期
#define ADC_SEEDH    0X40  // 180周期
#define ADC_SPEEDHH  0X60  // 90个周期


void InitUart();                  //这个函数主要是用来设置串口的
void Delay(WORD n);  //这个函数用来延时使用
void SendData(BYTE dat); //这个函数主要用来把就收到的数据通过串口发送出去
void InitADC();                        // 这个函数为了设置ad转换 电源,周期,标致,开启喂,io等设置
BYTE ch=0;             //ch主要是为了用于控制那个ad选为下一个转换口
void Delay900ms();

void main()   // 主函数开始
{
  InitUart();  // 设置串口函数
  InitADC();   //        开始转换函数 .ad转换使用的是中断方式。所以还有一个中断处理函数
  IE=0XA0;
           //
  while(1)
  ;
  }

  void adc_isr() interrupt 5 using 1  //stc12ad转换中断例程
  {
   ADC_CONTR&=!ADC_FLAG;//将ad转换完成标志致0. 此位与11101111相与得到的结果会是除了第4位是0其他为让保持原来的数据
    P2=~P2;
    P0=~P0;

    SendData(ch);       //将正在转换的ad输入口的名字牌号通过串口输出
        SendData(ADC_RES);  // 将数据高八位输出通过串口
        SendData(ADC_LOW2); //将数据的低8位通过串口输出
     ch++;
        if(ch>8)
        ch=0;   //将开启下一个ad转换口
    Delay900ms();             //降低转换速度延迟函数
        ADC_CONTR=ADC_POWER|ADC_SPEEDLL|ADC_START|ch;  //将最高位的ad转换电源打开。设置波特率,开启转换,设置转换口
        
        
     }


   //=================================================



   void InitADC()
   {
    PIASF=0XFF;                                     //把p1口全部设为ad转换
        ADC_RES=0;                                                                           //把以前的转换结果清零
        ADC_CONTR=ADC_POWER|ADC_SPEEDLL|ADC_START|ch; //将最高位的ad转换电源打开。设置波特率,开启转换,设置转换口
        Delay(2);                                                                         //适当的延时
    }

        //========================================================
        void InitUart()         //初始化函数串口
        {
                 SCON=0X5A;
                         TMOD=0X20;
                         TH1=TL1=0XFD;
                         TR1=1;
         }
         //===========================================
         void SendData(BYTE dat)//通过串口把测量的数据发送出去
         {
          while(!TI);
          TI=0;
          SBUF=dat;
          }
  //====================================================




          void Delay(WORD n)//延时函数
          {
           WORD x;
           while(n--)
           {
            x=5000;
                while(x--);   
            }   
           }
//==========================================
void Delay900ms()                //@11.0592MHz          //这个函数我自己用来降低转换速度的因为ad转换太快了为了观察方便我这个降低速度。大概一秒转换一个ad口。
{
        unsigned char i, j, k;

        _nop_();
        _nop_();
        i = 22;
        j = 3;
        k = 227;
        do
        {
                do
                {
                        while (--k);
                } while (--j);
        } while (--i);
}

相关帖子

沙发
ningling_21| | 2014-1-24 10:40 | 只看该作者
电路有没有问题呢?
应该先硬件后软件的步骤去解决问题...

使用特权

评论回复
板凳
VegeBird_Star| | 2014-1-24 10:44 | 只看该作者
晶振也是18M?

使用特权

评论回复
地板
wangch_sh| | 2014-1-24 11:00 | 只看该作者
程序要先看懂了。

使用特权

评论回复
5
限量_个性。| | 2014-1-24 11:26 | 只看该作者
这个有查询和中断两种方法的吧。把串口发送的去掉,直接在液晶上显示,频率要根据自己的开发板的,两种我都试过,没问题的。

使用特权

评论回复
6
coody| | 2014-1-24 11:30 | 只看该作者
不是吧?STC的ADC那么简单,都搞不掂?搞不掂,可以用它官网上的例程啊,有完整工程和源码,不需要你抄。
http://www.****ducst/STC12C5Axx-code.rar

使用特权

评论回复
7
yewuyi| | 2014-1-24 11:55 | 只看该作者
新手就别乱抱怨了,多数还是自己没弄对

使用特权

评论回复
8
rcengtian| | 2014-1-24 13:13 | 只看该作者
:lol同意。

使用特权

评论回复
9
logokfu| | 2014-1-24 17:59 | 只看该作者
同学不要急躁嘛,这个还是挺简单的,你再仔细搞搞

使用特权

评论回复
10
m564522634| | 2014-1-24 19:54 | 只看该作者
你先看看你的硬件吧,没有那么多的问题了

使用特权

评论回复
11
motodefy| | 2014-1-24 22:00 | 只看该作者
0-255?
那多数是数据定义问题或者转换问题···

使用特权

评论回复
12
cnlxin| | 2014-1-25 07:47 | 只看该作者
ningling_21 发表于 2014-1-24 10:40
电路有没有问题呢?
应该先硬件后软件的步骤去解决问题...

同意,要首先确认硬件正确,再去测试软件

使用特权

评论回复
13
feeling5250| | 2014-1-25 09:21 | 只看该作者
要延时下  在读取

使用特权

评论回复
14
通宵敲代码| | 2014-1-25 09:41 | 只看该作者
慢慢来吗,不要急,高手也都是这么过来的。

使用特权

评论回复
15
菜鸟同学| | 2014-1-25 11:19 | 只看该作者
我遇到过,STC自带的例子都有错的,由于本人一直对这个牌子比较有偏见,用过几个果断换STM系列了,大公司至少看到数据手册都工整一点。

使用特权

评论回复
16
Simplue| | 2014-1-26 00:35 | 只看该作者
本帖最后由 Simplue 于 2014-1-26 00:36 编辑

STC的ADC质量虽然是不好,但是小心使用还是能凑合的
其中最突出的一点是ADC的输出飘得厉害,要经过N次滤波才有可能稳定 具体滤波方式可以查资料
另外如果想获得准确的ADC值 需要外接接基准电压源(TL431 就行) 来反推出参考电压,即电源电压

LS的那位说的就过了 STC绝大部分的例程还是可以的

使用特权

评论回复
17
大道至简| | 2014-1-26 09:55 | 只看该作者
正常啊,做研发哪有不被机器**的?  搞定后你就有快感了

使用特权

评论回复
18
coody| | 2014-1-26 10:59 | 只看该作者
Simplue 发表于 2014-1-26 00:35
STC的ADC质量虽然是不好,但是小心使用还是能凑合的
其中最突出的一点是ADC的输出飘得厉害,要经过N次滤波 ...

我用的ADC很少漂的啊,可能跟你的电压或营建设计有关,特别是在有LED数码管扫描时要注意。

使用特权

评论回复
19
coody| | 2014-1-26 11:07 | 只看该作者
菜鸟同学 发表于 2014-1-25 11:19
我遇到过,STC自带的例子都有错的,由于本人一直对这个牌子比较有偏见,用过几个果断换STM系列了,大公司至 ...

对STC有偏见正常,因为没用好。
我设计的工控板要求比较高,一般前期开发,会做各种测试。
因为我没有静电枪,业余测试就用打火机的压电芯测试,离MCU的IO大约3mm左右放电,电弧直达IO引脚,发现STC的很少会有复位,更不会坏,但是STM32的容易怀(IO损坏或电源引脚和地引脚短路),STM8更差,STM8我至今没用在工控上。
但是,这并不能说STM32就没法用,我通过电源处理和IO保护,一样可以获得我要求的性能。
而STM8则不用在工控上,可以用在一些消费类的产品。

现在设计产品,简单的都是优先STC的,需要复杂计算的,允许高成本的,IO更多的,讲究计算速度的,就用STM32。

使用特权

评论回复
20
coody| | 2014-1-26 11:23 | 只看该作者
再说几句,我前期简单业余测试通过后,就会到专业的测试公司测试产品,一般到深圳科技园的专业测试公司去测试,比如ESD、EFT、辐射、3C认证等等,一般都容易过,如果前期开发不先自己把握好,测试费用就会多,这些专业公司的测试费用不便宜,比如ESD和EFT,都是500元一个小时。

每个人用同一个MCU,因为经验和能力、电路方案、产品性能要求等等,会有不同的效果,就出现不同的人用同一款MCU都有比较大的差别。MCU都不是完美的,其缺点我会想办法去弥补,但是绝对不会说这MCU很差很烂。连4位的MCU我都用,那是用在手表类上面,设计一个简单的电子表,或者一个玩具语音产品,总不能都用STM32吧?几毛钱、块把钱一片的MCU都很多,但是一般不会用在要求高的地方。

我一直相信,可以在市场大批量长期出货的MCU,必有它生存的空间,并不因为某几个人用起来不爽而改变。
STM32刚出来时,我并不急于用在产品上,即使比当时的ARM7便宜好多。我观察了两年,知道了别人使用时遇到的问题,也知道了MCU本身的BUG,所以我就知道怎么避免和弥补,就可以用在产品上了。

看到很多人比较BS 51,更别说消费类的4位机、8位机,其实,大可不必,MCU生存是由市场定的。
产品有继承性(软件或硬件),好多公司花时间开发的产品,几年生产验证了其稳定可靠性,并不会因为有新的MCU出来而马上换掉。比如我用51设计的,几年来一直稳定,就不会轻易换,只有新的设计,51不能胜任,才考虑换。

使用特权

评论回复
评论
autopccopy 2014-1-26 12:52 回复TA
酷哥V5! :) 
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

1

帖子

0

粉丝