打印
[51单片机]

能帮我看下STC12使用自己AD的程序吗?不知道哪里出错了,

[复制链接]
3448|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wojfsdj|  楼主 | 2014-4-20 15:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include<stc12.h>
#include<intrins.h>

#define uchar unsigned char
#define uint  unsigned int


sbit LCD1602_E=P2^7;
sbit LCD1602_RW=P2^5;
sbit LCD1602_RS=P2^6;

void Lcd1602_Delay1ms(uint c);    //误差 0us
void LcdWriteCom(uchar com);   //LCD1602写入8位命令子函数
void LcdWriteData(uchar dat);   //LCD1602写入8位数据子函数
void LcdInit();       //LCD1602初始化子程序
void adInit(void);
unsigned int getAd(unsigned char channel);


unsigned char Num[]="the AD result :";


void main()
{
uint ad,a1,a2,a3,a;
LcdInit();
adInit();
for(a=0;a<15;a++)
   LcdWriteData(Num[a]);
while(1)
{
   ad=getAd(0);
   ad=(ad*5)/1024;
   a1=ad/100;
   a2=ad%100/10;
   a3=ad%10;
   LcdWriteCom(0x80+0x40);
   LcdWriteData('0');
   LcdWriteData(0x30+a2);
   LcdWriteData(0x30+a3);
}

        
}
void adInit(void)
{
         P1ASF=0x07; //P1.0/P1.1/P1.2口全部作为模拟功能AD使用
  P1M0 = 0xff;
         P1M1 = 0xff;
         ADC_RES=0;   //清零转换结果寄存器高8位
        ADC_RESL=0; //清零转换结果寄存器低2位
        ADC_CONTR=0x80;//开启AD电源
        Lcd1602_Delay1ms(1);   //等待1ms,让AD电源稳定
}
unsigned int getAd(unsigned char channel)
{
          ADC_CONTR=0x88|channel;    //开启AD转换1000 1000 即POWER SPEED1 SPEED0 ADC_FLAG   ADC_START CHS2 CHS1 CHS0
          _nop_();
    _nop_();
    _nop_();
    _nop_();//要经过4个CPU时钟的延时,其值才能够保证被设置进ADC_CONTR 寄存器         

          while(!(ADC_CONTR&0x10));    //等待转换完成
        ADC_CONTR&=0xe7;      //关闭AD转换,ADC_FLAG位由软件清0
          return(ADC_RES*4+ADC_RESL);   //返回AD转换完成的10位数据(16进制)
}



其中我省略了1602显示的函数,那几个子函数没有问题的。 每次给单片机上电,P1口滞空,1602就会显示一个值,但是当采集电压的时候,显示的值又不会改变。

相关帖子

沙发
wojfsdj|  楼主 | 2014-4-20 15:11 | 只看该作者
我使用的是STC12C5A60S2

使用特权

评论回复
板凳
autopccopy| | 2014-4-20 15:35 | 只看该作者
请检查硬件电路,再使用官网的AD例程试试,一定可以。

使用特权

评论回复
地板
qq986433936| | 2014-4-20 17:04 | 只看该作者
本帖最后由 qq986433936 于 2014-4-20 17:17 编辑

这个是我用在STC15W404AS上的一个AD读取函数,输入是P11口,晶振6MHZ。在STC15F204EA上也使用过。
uint GetADCResult(void)
{
    uint AD_result;
    ADC_CONTR=0xC1;   //开AD电源,设置转换周期为180个时钟,设置P11为ADC通道                     
    ADC_RES=0x00;        //高8位清零     
    ADC_RESL=0x00;      //低2位清零
    _nop_();                     //需要加入几个空操作指令以做延迟
    _nop_();
    _nop_();
    _nop_();
    ADC_CONTR|=0x9;                                   //启动AD转换
    while ((0x10&ADC_CONTR)!=0x10);          //等待转换完成  
    AD_result=(ADC_RES<<2)|(ADC_RESL&0x03);   //合并高低位数据
    ADC_CONTR&=0xE7;                //清零ADC_FLAG标志位
    //AD_result=254;               //赋值一个固定的数用于检查数码管显示是否正常
    return   AD_result;             //返回10bit数据
}
    建议给返回值设一个随机的数,用于检查LCD是否能正常显示,再检查AD函数。

使用特权

评论回复
5
wojfsdj|  楼主 | 2014-4-20 18:04 | 只看该作者
qq986433936 发表于 2014-4-20 17:04
这个是我用在STC15W404AS上的一个AD读取函数,输入是P11口,晶振6MHZ。在STC15F204EA上也使用过。
uint Get ...

嗯,谢谢,我试试
我想问下 返回值的小数部分该怎么实现显示呢?

使用特权

评论回复
6
ningling_21| | 2014-4-20 19:00 | 只看该作者
wojfsdj 发表于 2014-4-20 18:04
嗯,谢谢,我试试
我想问下 返回值的小数部分该怎么实现显示呢?

用浮点数类型去计算就可以了。。。

使用特权

评论回复
7
wojfsdj|  楼主 | 2014-4-20 20:51 | 只看该作者
ningling_21 发表于 2014-4-20 19:00
用浮点数类型去计算就可以了。。。

是AD函数就用float吗? 然后就是返回浮点数,再去一个数字一个数字的取?

使用特权

评论回复
8
coody| | 2014-4-20 20:55 | 只看该作者
也可以用定点计算。

使用特权

评论回复
9
wojfsdj|  楼主 | 2014-4-20 21:02 | 只看该作者
coody 发表于 2014-4-20 20:55
也可以用定点计算。

怎么定点计算呢?  谢谢

使用特权

评论回复
10
wojfsdj|  楼主 | 2014-4-20 21:11 | 只看该作者
qq986433936 发表于 2014-4-20 17:04
这个是我用在STC15W404AS上的一个AD读取函数,输入是P11口,晶振6MHZ。在STC15F204EA上也使用过。
uint Get ...

我显示部分没有问题。
我将P1.1接地会显示000,接5V时,显示 :23  ,接3.3V 显示就是没规律变化的

使用特权

评论回复
11
ningling_21| | 2014-4-20 21:30 | 只看该作者
wojfsdj 发表于 2014-4-20 20:51
是AD函数就用float吗? 然后就是返回浮点数,再去一个数字一个数字的取?

只是用浮点数计算,返回整型就可以了,例如:返回256,就代表25.6

使用特权

评论回复
12
wojfsdj|  楼主 | 2014-4-20 21:41 | 只看该作者
ningling_21 发表于 2014-4-20 21:30
只是用浮点数计算,返回整型就可以了,例如:返回256,就代表25.6

哦哦,谢谢。
我先测5V的显示的是1023,但是测3.3V的时候就是一直变化的,我该怎么处理呢?

使用特权

评论回复
13
ningling_21| | 2014-4-20 21:42 | 只看该作者
wojfsdj 发表于 2014-4-20 21:41
哦哦,谢谢。
我先测5V的显示的是1023,但是测3.3V的时候就是一直变化的,我该怎么处理呢? ...

数字滤波处理后,再计算...

使用特权

评论回复
14
wojfsdj|  楼主 | 2014-4-20 21:52 | 只看该作者
ningling_21 发表于 2014-4-20 21:42
数字滤波处理后,再计算...

我用ADC0804直接测量就不会这么跳,但是用STC12自带的就变化范围比较大。
您说的数字滤波处理是怎么弄呢?

使用特权

评论回复
15
ningling_21| | 2014-4-20 22:08 | 只看该作者
wojfsdj 发表于 2014-4-20 21:52
我用ADC0804直接测量就不会这么跳,但是用STC12自带的就变化范围比较大。
您说的数字滤波处理是怎么弄呢 ...

看看匠人手记里面有篇**的...

使用特权

评论回复
16
飞言走笔| | 2014-4-21 12:22 | 只看该作者
wojfsdj 发表于 2014-4-20 21:52
我用ADC0804直接测量就不会这么跳,但是用STC12自带的就变化范围比较大。
您说的数字滤波处理是怎么弄呢 ...

看这里看这里:https://bbs.21ic.com/blog-24110-34172.html

使用特权

评论回复
17
WM~~~| | 2014-4-21 14:38 | 只看该作者
这个肯定可以的,我做过4通道的

使用特权

评论回复
18
湖北泽翔| | 2014-4-21 15:21 | 只看该作者
看了 但是不知道啊

使用特权

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

本版积分规则

5

主题

28

帖子

0

粉丝