OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4724|回复: 8

STC15W ADC 应用问题

[复制链接]

1

主题

4

帖子

0

精华

新手入门

积分
10
金钱
10
注册时间
2016-3-25
在线时间
0 小时
发表于 2016-3-25 11:00:19 | 显示全部楼层 |阅读模式
2金钱
求指导:昨天写了一个STC15W408AS 片内ADC的应用,但是检测出来的电压一直是0V,检测电压是来自于单片机的供电电源 前面加了L7805CV 模块,电源很稳定。请各位帮忙看看是不是程序出了问题!谢谢
#include<STC15F2K60S2.H>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
uint adc_datah,adc_datal;
uint adc_data;
uchar aa,bb,cc;
uchar code dsp_duan[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0x3e,0xe0,0xfe,0xf6};
uchar code dsp_dian[]={0xfd,0x61,0xde,0xf3,0x67,0xb7,0xbf,0xe1,0xff,0xfd};
sbit du=P1^1;
sbit we=P1^0;

void delay1ms()                //@11.0592MHz
{
        unsigned char i, j;

        _nop_();
        _nop_();
        _nop_();
        i = 11;
        j = 190;
        do
        {
                while (--j);
        } while (--i);
}


//_____________________________________
void display()
{
                 du=1;
                        P3=dsp_dian[aa];
                        du=0;
                        P3=0xff;

                       
                        we=1;
                        P3=0X7f; //For table[8];
                        we=0;
                        delay1ms();

                                du=1;
                                P3=dsp_duan[bb];
                                du=0;
                                P3=0xff;
                               
                                we=1;
                                P3=0XBF;
                                we=0;
                           delay1ms();



       
                            du=1;
                                P3=dsp_duan[cc];
                                du=0;
                                P3=0xff;
                               
                                we=1;
                                P3=0X1F;
                                we=0;
                           delay1ms();
                           delay1ms();



                       

}

void main()
{
        uint i;
//        uchar status;
        P1ASF=0X80;
        ADC_CONTR=0X80;
        for(i=0;i<10000;i++);
        CLK_DIV|=0X20;
        ADC_CONTR=0X88;
        EADC=1;
        EA=1;
        while(1)
        {
                aa=adc_data/1000;
                bb=adc_data/100%10;
                cc=adc_data%100/10;
            display();
       
        }
}
void adc_int() interrupt 5
{
  ADC_CONTR=0X80;
  adc_datah=ADC_RES&0X03;
  adc_datal=ADC_RESL;
  adc_data=adc_datah<<8+adc_datal;
  adc_data=adc_data*5/1023;
  ADC_CONTR=0x8f;


}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

261

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2075
金钱
2075
注册时间
2014-2-20
在线时间
284 小时
发表于 2016-3-25 12:01:22 | 显示全部楼层
       uint i;
//        uchar status;
        P1ASF=0X80;这里你使用P1.7作为ADC输入
        ADC_CONTR=0X80;
        for(i=0;i<10000;i++);
        CLK_DIV|=0X20;
        ADC_CONTR=0X88;这里你开启的通道是通道0,即P1.0
你使用P1.7作ADC输入,但是开启ADC的时候没有启用通道7
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
10
金钱
10
注册时间
2016-3-25
在线时间
0 小时
 楼主| 发表于 2016-3-25 12:17:43 | 显示全部楼层
Da Wen 发表于 2016-3-25 12:01
uint i;
//        uchar status;
        P1ASF=0X80;这里你使用P1.7作为ADC输入

谢谢你指导,但是还是不行,出来还是没有检测到电压
我修改成是ADC_CONTR=0X8F;这样通道就是P1.7了,
我想问下兄弟你,这个开始转换的时候 在配置ADC_CONTR寄存器的时候,是不是先要配置通道,然后再配置一次ADC_CONTR寄存器,开始转换呢?
如果一次写ADC_CONTR=0X8F相当于是 打开通道,然后又开始转换,这个应该没有关系吧
回复

使用道具 举报

3

主题

261

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2075
金钱
2075
注册时间
2014-2-20
在线时间
284 小时
发表于 2016-3-25 12:36:00 | 显示全部楼层
秋天的雨 发表于 2016-3-25 12:17
谢谢你指导,但是还是不行,出来还是没有检测到电压
我修改成是ADC_CONTR=0X8F;这样通道就是P1.7了,
...

没关系,你可以每次转换结束之后都把ADC电源关掉。你是数码管显示一直是0还是ADC寄存器的值是0。建议你把ADC寄存器的值读取出来通过串口输到电脑显示以判断究竟是ADC问题还是自己在数据处理的时候出现问题
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
10
金钱
10
注册时间
2016-3-25
在线时间
0 小时
 楼主| 发表于 2016-3-25 12:52:54 | 显示全部楼层
Da Wen 发表于 2016-3-25 12:36
没关系,你可以每次转换结束之后都把ADC电源关掉。你是数码管显示一直是0还是ADC寄存器的值是0。建议你把 ...

是数码管一直显示的是0,数码管程序是没有问题的,因为我一直用这个数码管做其他用,数码管的编码也是自己写的,没有问题,你看程序其他地方还有问题吗?
还想请教你一下adc_data=adc_data*5/1023; 假如这个Aadc_data 的值是1111111111 二级制那么十进制就是1023  假如1023*5/1023=5 这个时候是5,但是上面 aa=adc_data/1000;
                bb=adc_data/100%10;
                cc=adc_data%100/10;
这个地方有做了计算,aa=adc_data/1000  =5/1000=0.005  最终结果显示是0.005V吗
回复

使用道具 举报

3

主题

261

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2075
金钱
2075
注册时间
2014-2-20
在线时间
284 小时
发表于 2016-3-25 13:43:18 | 显示全部楼层
adc_data是整形,adc_data/1000表示adc_data对1000取整,结果是0.所以最好用float表示
回复

使用道具 举报

3

主题

261

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2075
金钱
2075
注册时间
2014-2-20
在线时间
284 小时
发表于 2016-3-25 13:46:11 | 显示全部楼层
秋天的雨 发表于 2016-3-25 12:52
是数码管一直显示的是0,数码管程序是没有问题的,因为我一直用这个数码管做其他用,数码管的编码也是自 ...

这样你应该把adc_data乘1000
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
10
金钱
10
注册时间
2016-3-25
在线时间
0 小时
 楼主| 发表于 2016-3-25 15:42:25 | 显示全部楼层
Da Wen 发表于 2016-3-25 13:46
这样你应该把adc_data乘1000

乘以1000也没有用吧。如果给定义data的变量是一个uint型的话,好像在换算的时候只会取整吧,这样就没有后面的数了,只能显示一位!
但是如果采用的是float 型变量的时候,程序编译会出错!
回复

使用道具 举报

3

主题

261

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2075
金钱
2075
注册时间
2014-2-20
在线时间
284 小时
发表于 2016-3-25 15:52:26 | 显示全部楼层
float 变量,用 “/”编译没问题,是求商。用“%”才会报错
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 13:11

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表