STC12C5620AD系列A/D转换C语言程序

发布者:书卷气息最新更新时间:2016-03-23 来源: eefocus关键字:STC12C5620AD系列  AD转换  C语言程序 手机看文章 扫描二维码
随时随地手机看文章
#include "STC12C5620AD.H"

//---------------------------------------------------------------------
typedef    unsigned char   INT8U;
typedef    unsigned int    INT16U;
//---------------------------------------------------------------------
//以下选择 ADC 转换速率,只能选择其中一种
                        //          SPEED1 SPEED0 A/D转换所需时间
#define AD_SPEED   0x60 //0110,0000          270个时钟周期转换一次,
                        //                         CPU工作频率27MHz时,
                        //                         A/D转换速度约100KHz
//#define AD_SPEED   0x40 //0100,0000          540个时钟周期转换一次
//#define AD_SPEED   0x20 //0010,0000          810个时钟周期转换一次
//#define AD_SPEED   0x00 //0000,0000          1080个时钟周期转换一次
//---------------------------------------------------------------------
void initiate_RS232 (void);         // 串口初始化
void Send_Byte(INT8U one_byte);     // 发送一个字节
INT16U get_AD_result(INT8U channel);
void delay(INT8U delay_time);       // 延时函数
//---------------------------------------------------------------------
void main()
{
    INT16U ADC_10bit;

    initiate_RS232();               //波特率 = 9600

    ADC_CONTR |= 0x80;              //1000,0000 打开 A/D 转换电源
    while(1)
    {
        Send_Byte(0xAA);
        Send_Byte(0xAA);

        ADC_10bit = get_AD_result(2);//P1.2 为 A/D 当前通道
        Send_Byte(ADC_10bit >> 8); //发送高 8 位测量结果
        delay(0x1);

        ADC_10bit = get_AD_result(3);//P1.3 为 A/D 当前通道, 测量并发送结果
        Send_Byte(ADC_10bit >> 8); //发送高 8 位测量结果
      
        delay(0x30);                //延时
    }
}
//---------------------------------------------------------------------
void delay(INT8U delay_time)        // 延时函数
{
    INT16U n;
    while(delay_time--)
    {
        n = 6000;
        while(--n);
    }
}
//---------------------------------------------------------------------
void initiate_RS232 (void)          // 串口初始化
{
    ES = 0;                         // 禁止串口中断
    TMOD = 0x20;                    // 设置 T1 为波特率发生器
    SCON = 0x50;                    // 0101,0000 8位数据位, 无奇偶校验
    TH1 = 0xFB;                     // 18.432MHz 晶振, 波特率 = 9600
    TL1 = 0xFB;
    RI = 0;
    TR1 = 1;
    ES = 1;                         // 允许串口中断
}
//---------------------------------------------------------------------
void Send_Byte(INT8U one_byte)      // 发送一个字节
{
    TI = 0;                         // 清零串口发送中断标志
    SBUF = one_byte;
    while (!TI);
    TI = 0;                         // 清零串口发送中断标志
}
//---------------------------------------------------------------------
INT16U get_AD_result(INT8U channel)
{
    ADC_DATA   = 0;

    channel &= 0x07;                //0000,0111 清0高5位
    ADC_CONTR = AD_SPEED;
    ADC_CONTR = 0xE0;               //1110,0000 清 ADC_FLAG, ADC_START 位和低 3 位
    ADC_CONTR |= channel;           //选择 A/D 当前通道
    delay(1);                       //使输入电压达到稳定
    ADC_CONTR |= 0x08;              //0000,1000 令 ADCS = 1, 启动A/D转换,
    while (1)                       //等待A/D转换结束
    {
        if (ADC_CONTR & 0x10)       //0001,0000 测试A/D转换结束否
        { break; }
    }
    ADC_CONTR &= 0xE7;              //1111,0111 清 ADC_FLAG 位, 关闭A/D转换,

    return (ADC_DATA<<8 | ADC_LOW2); //返回 A/D 10 位转换结果

关键字:STC12C5620AD系列  AD转换  C语言程序 引用地址:STC12C5620AD系列A/D转换C语言程序

上一篇:STC系列单片机ID号的读取
下一篇:PC机与单片机在串口通讯

推荐阅读最新更新时间:2024-03-16 14:48

关于中颖4位单片机AD转换中的一些经验
关于中颖4位机10位AD篇章中的数据处理,10位数据也即: 1111,1111,XX11 或 X111,1111,111X ; 1,起初以为10位数据取8位,把低两位直接省掉就可以了,准备开始写程序了,偶然看到论坛里的一个人也在这里; 于是重新进入中颖网站,原来 1111,1111,XX11 得合并为 1111,1111,11 然后再求和,取平均值; 处理方法,最低位和0011相于,把中位用ADDM左移两位空出低,并上低位, ,得低位;再把中位右位两位得 ,等 待高位,然后把高位左移两位 与中位相或,得中位,最后把高右移位两位,即数据变为 11,1111,1111 ; 想一下吧,是不是很简单?! 2,我根据上面的思路,自已
[单片机]
单片机中使用DS18B20温度传感器C语言程序(参考8)
#include reg51.h #include INTRINS.H #include LCD.h #define CLR_RI (RI=0) #define CLR_TI (TI=0) unsigned char code ID ={ 0x28,0x1D,0x25,0x1D,0x00,0x00,0x00,0x80, 0x28,0x0e,0x9e,0x1c,0x00,0x00,0x00,0x32}; unsigned char currSensorNo=0; sbit TMDAT = P1^7; sbit RUN_LED = P1^6; /*-------
[单片机]
8位逐次逼近AD转换器电路图
8位逐次逼近A,D转换器电路图
[模拟电子]
8位逐次逼近<font color='red'>AD转换</font>器电路图
PIC 单片机之AD转换
AD转换 我们先看看R1和R2,R2是个可调电阻 如果我们将R2变大 RA1这个管脚上的电压就越大。R2变小 RA1这个管脚上的电压就越小。那单片机是怎么知道电压变化的。这就需要AD转换。就是将模拟量转换成数字量。 PIC单片机如何表示电压 PIC用十位二进制位的数来表示电压,也就是数值0~1023来表示电压。那比如现在这个数值是400那这代表多少的电压?这就要根据参考电压来确定了。 比如我们设置正参考电压为3.3V ,当输入的电压为0时,数值就为0。当输入的电压为3.3V时,数值就是1023. 那如果输入的电压是1.2V代表多少电压。 首先,先算出一个数值代表多少的电压 3.3V除以1023 约等于 0
[单片机]
PIC 单片机之<font color='red'>AD转换</font>
AD转换的数码管显示
*本例程采用AD0804芯片,硬件电路:cs片选端接P2.3,WR写数据端写P3.6,RD读数据端接P3.7,锁存端接P2.6脚,数码管位选端分别接P3.2 ,P3.3,P3.4,段选端接P1口*/ #include reg52.h //头文件 #define uint unsigned int//宏文件 #define uchar unsigned char//宏文件 uchar num;//变量 void delay3(uint z);//延时定义 void dissy();//延时函数定义 sbit ge=P3^2;//个位定义 sbit shi=P3^3;//十位定义 sbit bai=P3^4;//百位定义 sbit ad
[单片机]
AD转换汇总(STM32、取平均、过采样)
一、电流检测AD采样值处理的高效方法 在电机控制软件的编写过程中,经常要处理由AD采样回来的电流值。由于电流有正有负,电流传感器输出地电压也是以0为中点,而一般AD的输入只能为正电压,所以电流传感器出来的电压量需要通过加减运算电路加上一个偏移值再送入AD,以保证进入AD的值恒为正。 这里AD以TI的2812的片内AD为例,其输入范围是0~3V,电流传感器以LEM的LA25NP为例,量程25A,通常采用的电路是将LEM传感器的输出经过一个100欧的电阻接到地,获得一个以0为中点的电压信号,然后在送入比例运算电路,在比例运算电路的另一个输入端加入1.5V的偏移量,这样在满量程范围内使输入AD的电压信号始终保持在0~3V之内。电
[单片机]
<font color='red'>AD转换</font>汇总(STM32、取平均、过采样)
PCF8591 AD转换程序
//-----------------------函数声明,变量定义------------------------ #include reg51.h #include intrins.h sbit SCL=P1^2; // 将p1.2口模拟时钟口 sbit SDA=P1^3; // 将p1.3口模拟数据口 bit askflag; #define uchar unsigned char #define uint unsigned int #define disdata P0 //显示数据码输出口 sbit LCD_RS = P2^0; sbit LCD_RW = P2
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved