单片机型号为STC90C516AD,怎么用自带的AD转换读取数据?麻烦大家写一下相应的子程序,稍详

单片机型号为STC90C516AD,怎么用自带的AD转换读取数据?麻烦大家写一下相应的子程序,稍详细一点的,我基础不好。有相关资料的话最好不过了,谢谢~

 //以下代码均是复制引用STC官方案例,还望多多包涵,祝你学习愉快
 
/*------------------------------------------------------------------*/
/* --- STC MCU Limited ---------------------------------------------*/
/* --- STC89-90xx Series MCU A/D Conversion Demo -------------------*/
/* 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    18432000L
#define BAUD    9600
typedef unsigned char BYTE;
typedef unsigned int WORD;
/*Declare SFR associated with the ADC */
sfr ADC_CONTR   =   0xC5;           //ADC control register
sfr ADC_RES     =   0xC6;           //ADC high 8-bit result register
sfr ADC_LOW2    =   0xC7;           //ADC low 2-bit result register
sfr P1ASF       =   0x97;           //P1 secondary function control register
/*Define ADC operation const for ADC_CONTR*/
#define ADC_FLAG    0x10            //ADC complete flag
#define ADC_START   0x08            //ADC start control bit
#define ADC_SPEEDHH 0x00            //89 clocks
#define ADC_SPEEDH  0x20            //178 clocks
#define ADC_SPEEDL  0x40            //356 clocks
#define ADC_SPEEDLL 0x60            //534 clocks
void InitUart();
void InitADC();
void SendData(BYTE dat);
BYTE GetADCResult(BYTE ch);
void Delay(WORD n);
void ShowResult(BYTE ch);
void main()
{
    InitUart();                     //Init UART, use to show ADC result
    InitADC();                      //Init ADC sfr
    while (1)
    {
        ShowResult(0);              //Show Channel0
        ShowResult(1);              //Show Channel1
        ShowResult(2);              //Show Channel2
        ShowResult(3);              //Show Channel3
        ShowResult(4);              //Show Channel4
        ShowResult(5);              //Show Channel5
        ShowResult(6);              //Show Channel6
        ShowResult(7);              //Show Channel7
    }
}
/*----------------------------
Send ADC result to UART
----------------------------*/
void ShowResult(BYTE ch)
{
    SendData(ch);                   //Show Channel NO.
    SendData(GetADCResult(ch));     //Show ADC high 8-bit result
//if you want show 10-bit result, uncomment next line
//    SendData(ADC_LOW2);             //Show ADC low 2-bit result
}
/*----------------------------
Get ADC result
----------------------------*/
BYTE GetADCResult(BYTE ch)
{
    ADC_CONTR = ADC_SPEEDLL | ch | ADC_START;
    _nop_();                        //Must wait before inquiry
    _nop_();
    _nop_();
    _nop_();
    while (!(ADC_CONTR & ADC_FLAG));//Wait complete flag
    ADC_CONTR &= ~ADC_FLAG;         //Close ADC
    return ADC_RES;                 //Return ADC result
}
/*----------------------------
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
}
/*----------------------------
Initial ADC sfr
----------------------------*/
void InitADC()
{
    P1ASF = 0xff;                   //Open 8 channels ADC function
    ADC_RES = 0;                    //Clear previous result
    ADC_CONTR = ADC_SPEEDLL;
    Delay(2);                       //ADC power-on and delay
}
/*----------------------------
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--);
    }
}

追问

没有注释看不太懂。。能不能麻烦加上呢?

温馨提示:内容为网友见解,仅供参考
第1个回答  2015-02-05
需要给你写一份吗

普中的51单片机stc90C516RD+中的AD转换怎么用(买了一个风速传感器)
1. 连接传感器:将风速传感器与单片机进行连接。通常,风速传感器会有两个输出引脚,其中一个是信号引脚,用于连接到单片机的ADC输入引脚。2. 配置引脚:在编程之前,您需要将相应的引脚配置为ADC输入模式。通过查阅STC90C516RD+的技术文档或用户手册,找到ADC输入引脚和对应的寄存器配置,然后设置引脚的工作...

如何用stc单片机内部ad采集多路交流信号
一、用两个AD转换芯片,两路模拟量分别接一个。用单片机控制两个AD芯片同时启动转换,这样基本可以实现采集到同一时刻的两路模拟量值。二、用两个采样保持器(LF398),来暂时保存模拟量的瞬时值。两个保持器后面接模拟多路转换器,模拟多路转换器后面接一个AD转换器。过程是这样的:要采集之前先给两个...

stc90c516rd+用STC—ISP下载不了程序,怎么办
首先检查下单片机最小系统电路,晶振,电容,电源是否都正确连接,推荐你用数据手册里的连接方法,如果都没有问题的话看一下在软件里芯片型号选没选对,端口选没选对,至于晶振的话和下载一般是没有关系的,除非你把晶振那快的电路接错了

我的单片机是STC90C516 晶振12M 波特率9600 配置如下:
输入要求自动生成C或者汇编代码,用它多方便。帮你计算了下,STC90C516 晶振12M 波特率9600 ,倍数时误差率6.99%,不倍数时误差率8.51%,数据不出错才怪。这也就是串口通信时大家喜欢用11.0592MHz晶振的原因,在波特率倍速时,最高可达到57600,误差率0.00%。用12MHz,最高也就4800,而且有0.1...

用开发板向STC90C516RD+单片机里烧录程序
不是告诉你:请尝试用稍低的波特率下载 我用STC单片机一般波率9600 有的下载不成功 把最高和最低波特率都设为1200,居然成功了 可能与下载软版本有关

如何利用单片机和AD转换器测量电压值?
交流电转换成直流电比例大约是1.414(就是根号2)交流×1.414≈直流电压。然后用电阻按比例开始分压限流,(为了安全,使用光耦来耦合)(或者直接用差分探头都行,这就取决于你自己的喜好了)最后给A\/D芯片,然后给单片机或者其它的处理设备 至于A\/D转换得到的数据来计算被测电压值,这是个比例关系,...

双列直插是式STC90C516AD单片机引脚图
STC90C51xxxx系列的引脚图都是如下:

51单片机有外部数据存储器的时候怎么开始AD转换?
movx @dptr,A,开启AD转换会与外部数据存储器发生冲突,那是因为DPTR中的地址没有指向AD转换器的端口地址,或者AD端口地址与外部数据存储器的地址重复了。没有具体电路,真正原因不好确定。单片机可采用端口模式与AD转换器连接比较好,见下图。

STC有没有自带AD\/DA功能单片机?我要处理来自传感器的模拟信号(电压)
STC系列单片机 多数型号 都 带有 AD 转换功能,及 PWM ( 即加电容滤波后为 DA ) 功能,上 STC 官网看看。

哪位大侠帮忙写个读取AD变送器的重量值(AD值)到单片机的子程序?
uint ad_sampling_V() \/\/AD采样 转换一次需要845us { static uint ad_temp1,ad_temp2;\/\/ ACSR=0X80;ADMUX=0X00;\/\/ 片内2.56V基准 通道0选择 为电压采样 ADCSRA=0XC2;\/\/ 1100 0110使能ADEN 启动 ADSC 8分频 delay_us(20);\/\/4us延时等待 ADSR 清零 while((ADCSRA&0X40)!=0) ...

相似回答