OpenEdv-开源电子网

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

STC12C2502AD ADC请教

[复制链接]

33

主题

118

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
290
金钱
290
注册时间
2015-2-23
在线时间
25 小时
发表于 2015-12-8 14:07:16 | 显示全部楼层 |阅读模式
5金钱
/*------------------------------------------------------------------*/
/* --- STC MCU Limited ---------------------------------------------*/
/* --- STC12C56xx Series MCU A/D Conversion Demo -------------------*/
/* --- Mobile: (86)13922805190 -------------------------------------*/
/* --- Fax: 86-0513-55012956,55012947,55012969 ---------------------*/
/* --- Tel: 86-0513-55012928,55012929,55012966----------------------*/
/* --- Web: www.STCMCU.com -----------------------------------------*/
/* --- Web: www.GXWMCU.com -----------------------------------------*/
/* If you want to use the program or the program referenced in the  */
/* article, please specify in which data and procedures from STC    */
/*------------------------------------------------------------------*/

#include "reg51.h"
#include "intrins.h"

#define FOSC    11059200L
#define BAUD    9600

typedef unsigned char BYTE;
typedef unsigned int WORD;

/*Declare SFR associated with the ADC */
sfr AUXR        =   0x8e;
sfr ADC_CONTR   =   0xC5;           //ADC control register
sfr ADC_DATA    =   0xC6;           //ADC high 8-bit result register
sfr ADC_LOW2    =   0xBE;           //ADC low 2-bit result register
sfr P1M0        =   0x91;           //P1 mode control register0
sfr P1M1        =   0x92;           //P1 mode control register1

/*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
#define ADC_SPEEDLL 0x00            //420 clocks
#define ADC_SPEEDL  0x20            //280 clocks
#define ADC_SPEEDH  0x40            //140 clocks
#define ADC_SPEEDHH 0x60            //70 clocks

void InitUart();
void SendData(BYTE dat);
void Delay(WORD n);
void InitADC();

BYTE ch = 0;                        //ADC channel NO.



/*----------------------------
Initial ADC sfr
----------------------------*/
void InitADC()
{
    P1 = P1M0 = P1M1 = 0xff;        //Set all P1 as Open-Drain mode
    ADC_DATA = 0;                   //Clear previous result
    ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | ch;
    Delay(2);                       //ADC power-on delay and Start A/D conversion
}

/*----------------------------
Initial UART
----------------------------*/
void InitUart()
{
    SCON = 0x5a;                    //8 bit data ,no parity bit
    TMOD = 0x20;                    //T1 as 8-bit auto reload
    TH1 = TL1 = -(FOSC/12/32/BAUD); //Set Uart baudrate
    TR1 = 1;                        //T1 start running
}

/*----------------------------
Send one byte data to PC
Input: dat (UART data)
Output:-
----------------------------*/
void SendData(BYTE dat)
{
    while (!TI);                    //Wait for the previous data is sent
    TI = 0;                         //Clear TI flag
    SBUF = dat;                     //Send current data
}

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

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

void main()
{
    InitUart();                     //Init UART, use to show ADC result
    InitADC();                      //Init ADC sfr
    AUXR |= 0x10;                   //set EADCI
    IE = 0xa0;                      //Enable ADC interrupt and Open master interrupt switch
                                    //Start A/D conversion
    while (1);
}



/*----------------------------
ADC interrupt service routine
----------------------------*/
void adc_isr() interrupt 5 using 1
{
    ADC_CONTR &= !ADC_FLAG;         //Clear ADC interrupt flag

    SendData(ch);                   //Show Channel NO.
    SendData(ADC_DATA);             //Get ADC high 8-bit result and Send to UART

//if you want show 10-bit result, uncomment next line
//    SendData(ADC_LOW2);             //Show ADC low 2-bit result
    
    if (++ch > 7) ch = 0;           //switch to next channel
    ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | ch;
}

上面代码是在官网上看到的,一堆英文看不懂请有懂的帮帮忙
把AD转换结果写入uchar n;里面,在此先谢谢了

最佳答案

查看完整内容[请看2#楼]

重复定义了,注释掉就可以了,头文件用的是STC12C5A60S2.h吧,这个头文件已经定义了这些寄存器,所以不需要再定义了
新手学STM
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

33

主题

481

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
5075
金钱
5075
注册时间
2013-10-4
在线时间
654 小时
发表于 2015-12-8 14:07:17 | 显示全部楼层
重复定义了,注释掉就可以了,头文件用的是STC12C5A60S2.h吧,这个头文件已经定义了这些寄存器,所以不需要再定义了
回复

使用道具 举报

1

主题

374

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1309
金钱
1309
注册时间
2014-7-23
在线时间
418 小时
发表于 2015-12-8 14:24:41 | 显示全部楼层
ADC_DATA:?A/D转换结果特殊功能寄存器,?模拟/数字转换结果计算公式为?结果=256×Vin/Vcc(百度的,注意这里是八位的,参考电压5v),
所以只需要Vin=VCC*结果/2^n,即可。。。。。。。。如果只需要转换结果ADC_DATA,ADC_LOW2就是了;
回复

使用道具 举报

33

主题

118

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
290
金钱
290
注册时间
2015-2-23
在线时间
25 小时
 楼主| 发表于 2015-12-8 14:47:51 | 显示全部楼层
回复【2楼】guset_03:
---------------------------------
我只要结果放入uchar n;里面
新手学STM
回复

使用道具 举报

33

主题

481

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
5075
金钱
5075
注册时间
2013-10-4
在线时间
654 小时
发表于 2015-12-8 14:58:01 | 显示全部楼层
回复【3楼】psufhvka:
---------------------------------
那你直接看adc的中断处理函数就可以了,这个程序是将0~7 8个通道的ADC值依次通过串口打印出来。
SendData(ADC_DATA);             //Get ADC high 8-bit result and Send to UART
如果只是要结果这一句就是,其中ADC_DATA就是ADC采集值。

其实这些英文并不难懂,我想应该是你不没有下功夫去看,只是看到英文就觉得自己看不懂
回复

使用道具 举报

13

主题

611

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1929
金钱
1929
注册时间
2014-10-6
在线时间
625 小时
发表于 2015-12-8 15:29:32 | 显示全部楼层
n=ADC_DATA;这个就是你要的把结果放在uchar n;里面了!
回复

使用道具 举报

1

主题

374

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1309
金钱
1309
注册时间
2014-7-23
在线时间
418 小时
发表于 2015-12-8 15:47:03 | 显示全部楼层
回复【3楼】psufhvka:
-----------------------------
不是吧,这么说都不够清楚。。。。好吧
回复

使用道具 举报

33

主题

118

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
290
金钱
290
注册时间
2015-2-23
在线时间
25 小时
 楼主| 发表于 2015-12-8 17:31:46 | 显示全部楼层
那个到时是知道
但是出现了这个问题不知怎么回事

新手学STM
回复

使用道具 举报

33

主题

118

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
290
金钱
290
注册时间
2015-2-23
在线时间
25 小时
 楼主| 发表于 2015-12-8 17:33:40 | 显示全部楼层
回复【7楼】psufhvka:
---------------------------------
直接//后就不会出现警告了,不知道会不会出现什么问题呢
新手学STM
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-23 12:39

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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