精华内容
下载资源
问答
  • STC12C5A60s2是一款强大的单片机。本文件加载12C5A60s2头文件后可以进行AD转换,经过本人测试,保证成功。
  • STC12c5a60s2内部自带的AD转换器程序,外加对TLC5620程序编写的DA转换,另外通过外部中断采集脉冲信号(伺服电机脉冲信号)
  • STC12C5A60S2_AD转换12864显示示例程序
  • STC12C5A60S2_AD转换例程

    2013-08-21 17:31:05
    STC12C5A60S2_AD转换例#include<STC12C5A60S2.H>//包含单片机寄存器的头文件 #include<intrins.h> //包含_nop_()函数定义的头文件 unsigned char result; //A/D转换结果变量 void main(void)程
  • STC12C5A60S2_AD转换示例程序
  • stc12c5a60s2 DA AD转换

    2013-05-14 16:06:24
    单片机控制TLC5620芯片完场DA转换以及stc12c5a60s2本身自带的AD转换
  • 基于STC12C5A60S2自带AD转换和TL5615芯片完成AD/DA 转换程序
  • 单片机原理与应用-基于汇编、C51及混合编程第9章_STC12C5A60S2单片机的片内AD转换
  • STC12C5A60S2单片机datasheet上的ad转换程序应用后,只开p1.0路,采集正确,8路都开会出现乱码现象!求解答
  • STC12C5A60S2/AD/PWM 系列单片机是宏晶科技生产的单时钟/机器周期(1T)的单片机,是高速/低功耗/超强抗干扰的新一代8051单片机,指令代码完全兼容传统8051,但速度快8-12倍.内部集成MAX810专用复位电路,2路PWM,8路高速...
  • STC12C5A60sAD转换.zip

    2020-04-01 10:19:40
    本程序由C语言编写的AD转换程序,单片机型号为stc12c5a60s2,注释清晰,容易理解本用于血压计血压的测量,现已配置好AD
  • stc12c5a60s2 AD转换用LCD1602显示程序

    热门讨论 2012-03-23 11:45:29
    使用stc12c5a60s2单片机的内部AD转换,将AD转换的数据用LCD1602显示。用按键控制显示AD转换中的具体通道。测试已无问题,绝对有效。
  • STC12C5A60S2中的AD转换

    2020-08-10 21:49:56
    STC12C5A60S2中的AD转换。AD里面包含da,当输入电压Vin时,da的最高位是1,即为0.5Vref与输入信号比较,如果输入大于0.5Vref则比较器输出为1,同时da的最高位为1,反之DA最高位则为0,通过8次比较后得到8个01数据即...
  • 这是基于单片机STC12C5A60S2ad转换程序,以经过测试..
  • 由于选用了宏晶科技的STC12C5A60S2单片机,所以在编写A/D转换软件时首先就得参考STC12C5A60S2器件手册,但对于初学者来说,是无法看明白的,还好在学习单片机时购买的单片机学习板上有配套的例程,其A/D源码略(编注...

    单片机的A/D转换器是指单片机的模拟信号转换为数字信号,这是单片机在自动化控制中常用到的功能之一,而熟练和掌握A/D软件编写,也是学习单片机必不可少的课程。由于选用了宏晶科技的STC12C5A60S2单片机,所以在编写A/D转换软件时首先就得参考STC12C5A60S2器件手册,但对于初学者来说,是无法看明白的,还好在学习单片机时购买的单片机学习板上有配套的例程,其A/D源码略(编注:如有需求,请与本报联系)。经测试这段代码在OK51-EASY单片机开发板(笔者购买的单片机学习板)上能正常运行.在PLo引脚上用杜邦线连接电源的正极或地线,数码管能显示0—255,说明单片机的A/D模块已工作。

    而在实际应用时用以上函数编写就基本上能满足一般的模数转换要求,但由于以上函数编写的是8位精度AD转换函数,(STC12C5A60S2器件手册提供的是8位源码例子)如果要求精度比较高的就需要编写10精度的AD转换函数了,为此笔者在网上参考了大量的TC12C5A60S2/ADC源码,最终找到了测试正常的IO位ADC函数,以下是10位精度的AD转换函数:

    64c9e603e158f44433ce39b8db9ba8c0.png

    104883cbdfcba54a671635137eadc81f.png

    比较了一下8位精度的AD函数和10位精度的AD函数,发现有很大不同,有了以上ADC函数,就能轻松使用STC12C5A60S2内部的AD功能,不再为编写AD函数而烦恼,让读者更容易接触到模拟信号到数字信号的奇妙转换,感受触手可及的数字信号。

    展开全文
  • /***********************************************************程序功能:STC12C5A60S2自带ADC采集电压信号+DS18B20温度传感器+LCD1602液晶显示MCU型号: STC12C5A60S2晶振频率:11.0892MHz整理时间:2012年4月25号...

    /***********************************************************

    程序功能:STC12C5A60S2自带ADC采集电压信号+DS18B20温度传感器+LCD1602液晶显示

    MCU型号: STC12C5A60S2

    晶振频率:11.0892MHz

    整理时间:2012年4月25号

    ************************************************************/

    #include "reg51.h"

    #include "intrins.h"

    sfr P4        = 0XC0;

    sfr ADC_CONTR = 0XBC;

    sfr ADC_RES   = 0XBD;

    sfr ADC_LOW2  = 0XBE;

    sfr P1ASF     = 0X9D;

    typedef unsigned char BYTE;

    typedef unsigned int WORD;

    #include "1602.h"

    #include "DS18B20.h"

    #define ADC_POWER   0X80

    #define ADC_FLAG    0X10

    #define ADC_START   0X08

    #define ADC_SPEEDLL 0X00

    #define ADC_SPEEDL  0X20

    #define ADC_SPEEDH  0X40

    #define ADC_SPEEDHH 0X60

    void InitADC();

    void Delay(WORD n);

    WORD GetADCResult(BYTE ch);

    void DisplayADCResult(BYTE Channel);

    void DisplayTemperature();

    char qian=0,bai=0,shi=0,ge=0;

    BYTE ly_dis[4];//定义显示缓冲区

    void main()

    {

    WORD i=0;

    float tt;

    int ltemp;

    InitADC();

    LCDInit();

    DisplayListChar(0, 0, "Temp:");

    DisplayListChar(0, 1, "Volt:");

    while(1)

    {

    if(i==0)

    tmpchange();              //温度转换

    if(i==100)

    {

    tt=tmp()*0.0625;          //得到真实十进制温度值,因为DS18B20

    //可以精确到0.0625度,所以读回数据的最低位代表的是0.0625度。

    ltemp=tt*10+0.5;           //放大十倍,这样做的目的将小数点后第一位也转换为可显示数字,同时进行一个四舍五入操作。

    if(ltemp<0)

    {                //判断第一位显示整数还是负号

    ly_dis[0]=0xbf;

    ltemp=0-ltemp;

    }

    else

    ly_dis[0]=ltemp/1000;//显示百位值

    ltemp=ltemp%1000;

    ly_dis[1]=ltemp/100;        //显示温度十位值

    ltemp=ltemp%100;

    ly_dis[2]=ltemp/10;                //显示温度个位值

    ly_dis[3]=ltemp%10;                //显示小数点后一位

    }

    i++;

    if(i==3000)

    {

    DisplayADCResult(0);

    i=0;

    }

    DisplayTemperature();        //调用显示

    }

    }

    void DisplayADCResult(BYTE Channel)

    {

    qian=GetADCResult(Channel)/1000;

    bai=GetADCResult(Channel)%1000/100;

    shi=GetADCResult(Channel)%1000%100/10;

    ge=GetADCResult(Channel)%10;

    if(0==qian)

    DisplayOneChar(5,1,' ');

    else

    DisplayOneChar(5,1,table[qian]);

    if(0==bai&&0==qian)

    DisplayOneChar(6,1,' ');

    else

    DisplayOneChar(6,1,table[bai]);

    DisplayOneChar(7,1,table[shi]);

    DisplayOneChar(8,1,table[ge]);

    DisplayOneChar(9, 1, 'v');

    }

    void DisplayTemperature()

    {

    if(0==ly_dis[0])

    DisplayOneChar(5, 0, ' ');

    else

    DisplayOneChar(5, 0, table[ly_dis[0]]);

    DisplayOneChar(6, 0, table[ly_dis[1]]);

    DisplayOneChar(7, 0, table[ly_dis[2]]);

    DisplayOneChar(8, 0, '.');

    DisplayOneChar(9, 0, table[ly_dis[3]]);

    DisplayOneChar(10, 0, 0xdf);

    DisplayOneChar(11, 0, 'C');

    }

    WORD GetADCResult(BYTE ch)

    {

    ADC_CONTR=ADC_POWER|ADC_SPEEDLL|ch|ADC_START;

    _nop_();

    _nop_();

    _nop_();

    _nop_();

    while(!(ADC_CONTR&ADC_FLAG));

    ADC_CONTR&=~ADC_FLAG;

    return ADC_RES*4+ADC_LOW2;

    }

    void InitADC()

    {

    ……………………

    …………限于本文篇幅 余下代码请从51黑下载附件…………

    展开全文
  • /* 功能:使用12C5A60S2内部AD读取外部三路电压,显示在1602上 *//* 最多可同时输入8路电压,设置P1ASF */#include #includesbit RS = P2^6; //定义1602使用的端口sbit RW = P2^5;sbit EN = P2^7;#define uchar ...

    /* 功能:使用12C5A60S2内部AD读取外部三路电压,显示在1602上 */

    /*     最多可同时输入8路电压,设置P1ASF            */

    #include

    #include

    sbit RS = P2^6;   //定义1602使用的端口

    sbit RW = P2^5;

    sbit EN = P2^7;

    #define uchar unsigned char;

    #define uint unsigned int;

    #define RS_CLR RS=0

    #define RS_SET RS=1

    #define RW_CLR RW=0

    #define RW_SET RW=1

    #define EN_CLR EN=0

    #define EN_SET EN=1

    #define DataPort P0   //连接1602数据口 P0

    //uchar b,i,ge,shi,bai;

    uchar da1=0,da2=0,da3=0;

    double Data,c;

    char a[5]="";

    uchar ADC_Chanul_Turn=0;

    /*------------------------------------------------

    uS延时函数,含有输入参数 unsigned char t,无返回值

    unsigned char 是定义无符号字符变量,其值的范围是

    0~255 这里使用晶振12M,精确延时请使用汇编,大致延时

    长度如下 T=tx2+5 uS

    ------------------------------------------------*/

    void DelayUs2x(unsigned char t)

    {

    while(--t);

    }

    /*------------------------------------------------

    mS延时函数,含有输入参数 unsigned char t,无返回值

    unsigned char 是定义无符号字符变量,其值的范围是

    0~255 这里使用晶振12M,精确延时请使用汇编

    ------------------------------------------------*/

    void DelayMs(unsigned char t)

    {

    while(t--)

    {

    //大致延时1mS

    DelayUs2x(245);

    DelayUs2x(245);

    }

    }

    /*------------------------------------------------

    判忙函数

    ------------------------------------------------*/

    bit LCD_Check_Busy(void)

    {

    DataPort= 0xFF;

    RS_CLR;

    RW_SET;

    EN_CLR;

    _nop_();

    EN_SET;

    return (bit)(DataPort & 0x80);

    }

    /*------------------------------------------------

    写入命令函数

    ------------------------------------------------*/

    void LCD_Write_Com(unsigned char com)

    {

    while(LCD_Check_Busy()); //忙则等待

    RS_CLR;

    RW_CLR;

    EN_SET;

    DataPort= com;          //

    _nop_();

    EN_CLR;

    }

    /*------------------------------------------------

    写入数据函数

    ------------------------------------------------*/

    void LCD_Write_Data(unsigned char Data)

    {

    while(LCD_Check_Busy()); //忙则等待

    RS_SET;

    RW_CLR;

    EN_SET;

    DataPort= Data;

    _nop_();

    EN_CLR;

    }

    /*------------------------------------------------

    清屏函数

    ------------------------------------------------*/

    void LCD_Clear(void)

    {

    LCD_Write_Com(0x01);

    DelayMs(5);

    }

    /*------------------------------------------------

    写入字符串函数

    ------------------------------------------------*/

    void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s)//y为行数,x为横坐标,最后一个是字符

    {

    if (y == 0)

    {

    LCD_Write_Com(0x80 + x);     //表示第一行

    }

    else

    {

    LCD_Write_Com(0xC0 + x);      //表示第二行

    }

    while (*s)

    {

    LCD_Write_Data( *s);

    s ++;

    }

    }

    /*------------------------------------------------

    写入字符函数

    ------------------------------------------------*/

    void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data)

    {

    if (y == 0)

    {

    LCD_Write_Com(0x80 + x);

    }

    else

    {

    LCD_Write_Com(0xC0 + x);

    }

    LCD_Write_Data( Data);

    }

    /*------------------------------------------------

    初始化函数

    ------------------------------------------------*/

    void LCD_Init(void)

    {

    LCD_Write_Com(0x38);    /*显示模式设置*/

    DelayMs(5);

    LCD_Write_Com(0x38);

    DelayMs(5);

    LCD_Write_Com(0x38);

    DelayMs(5);

    LCD_Write_Com(0x38);

    LCD_Write_Com(0x08);    /*显示关闭*/

    LCD_Write_Com(0x01);    /*显示清屏*/

    LCD_Write_Com(0x06);    /*显示光标移动设置*/

    DelayMs(5);

    LCD_Write_Com(0x0C);    /*显示开及光标设置*/

    }

    /*------------------------------------------------

    ADC函数

    ------------------------------------------------*/

    void InitADC()//初始AD寄存器

    {

    P1ASF=0X07;     //0xff设置P1口全部为ADC通道,0x07=0000,0111  即使用P10,P11,P12作为输入

    ADC_RES=0X00;    //清除高8位缓冲数据

    if(ADC_Chanul_Turn%3==0)//外部基准电压

    {

    ADC_CONTR=0xF0; //AD转换控制寄存器,1111,0000  P10口

    _nop_();

    _nop_();

    _nop_();

    _nop_();

    ADC_CONTR=0xE8;    //1110,1000(清零Flag,置位Start)

    }

    if(ADC_Chanul_Turn%3==1)

    {

    ADC_CONTR=0xF1; // 1111,0001  P11口

    _nop_();

    _nop_();

    _nop_();

    _nop_();

    ADC_CONTR=0xE9;    //1110,1001

    }

    if(ADC_Chanul_Turn%3==2)

    {

    ADC_CONTR=0xF2; //1111,0010  P12口

    _nop_();

    _nop_();

    _nop_();

    _nop_();

    ADC_CONTR=0xEA;    //1110,1010

    }

    }

    void timer0() interrupt 1      //interrupt 1: 定时器0,interrupt3:定时器3

    {

    TH0=(65536-20000)/256;       //高八位,(需要表示Xms的定时,计数器由65536-X数到65536,由于16位,只能分高低位)

    TL0=(65536-20000)%256;     //低八位

    InitADC();

    }

    void adc_isr() interrupt 5      //FLAG标志位置位触发中断,没有设优先级,但是同优先级下定时器0更高

    {

    //V_5REF=V_1REF*256/da_ref;

    if(ADC_Chanul_Turn%3==0)                     //外部基准电压

    {

    da1=ADC_RES;                                   //获取转换结果

    Data=((double)da1/256)*5;     //取八位计算基准电压Data,

    c =Data;

    }

    if(ADC_Chanul_Turn%3==1)

    {

    da2=ADC_RES;                                  //获取转换结果

    Data=((double)da2/256)*5;     //取八位计算实际值Data,

    c =Data;

    }

    if(ADC_Chanul_Turn%3==2)

    {

    da3=ADC_RES;                                  //获取转换结果

    Data=((double)da3/256)*5;     //取八位计算实际值Data,

    c =Data;

    }

    a[0]=((int)c%10+0x30);//个位(电压<5,仅有个)     //0x30: ASCAI码里代表“0”,必须转换成字符存在字符型数组里才可以在1602液晶屏上显示

    a[1]=0x2e;                    //小数点

    a[2]=((int)(c*10)%10+0x30); // 十分位

    a[3]=((int)(c*100)%10+0x30);// 百分位

    a[4]='\0';                  //  加了串尾符才成了字符串哦

    if(ADC_Chanul_Turn%3==0)  LCD_Write_String(0,0,a);

    if(ADC_Chanul_Turn%3==1)  LCD_Write_String(5,0,a);

    if(ADC_Chanul_Turn%3==2) LCD_Write_String(0,1,a);

    ADC_CONTR&=0xEF;               //标志位清零

    ADC_Chanul_Turn++;

    if(ADC_Chanul_Turn==252)

    ADC_Chanul_Turn=0;

    }

    void main()

    {

    LCD_Init();

    LCD_Clear();                     //清屏

    //LCD_Write_String(0,2,"Hello Dog!");

    DelayMs(255);

    TH0=(65536-20000)/256;           //开定时器0

    TL0=(65536-20000)%256;

    EA=1;                             //开全局中断

    ET0=1;                             //允许定时器零中断

    EADC=1;                          //允许ADC中断

    TR0=1;

    while(1);

    }

    展开全文
  • STC12C5A60S2 单片机资料

    千次阅读 2014-04-16 18:23:12
    STC12C5A60S2/AD/PWM 系列单片机是宏晶科技生产的单时钟 / 机器周期(1T)的单片机,是高速 / 低功耗 / 超强抗干扰的新一代 8051 单片机,指令代码完全兼容传统 8051,但速度快 8-12 倍.内部集成 MAX810 专用 复位电路,2 ...
     

    STC12C5A60S2/AD/PWM 系列单片机是宏晶科技生产的单时钟 / 机器周期(1T)的单片机,是高速 / 低功耗 / 超强抗干扰的新一代 8051 单片机,指令代码完全兼容传统 8051,但速度快 8-12 倍.内部集成 MAX810 专用 复位电路,2 路 PWM,8 路高速 10 位 A/D 转换(250K/S),针对电机控制,强干扰场合.

    1. 增强型 8051 CPU,1T,单时钟 / 机器周期,指令代码完全兼容传统 8051

    2. 工作电压: STC12C5A60S2 系列工作电压: 5.5V - 3.3V (5 V 单片机) STC12LE5A60S2 系列工作电压:3.6V - 2.2V (3 V 单片机)

    3. 工作频率范围:0 - 35MHz,相当于普通 8051 的 0~420MHz

    4. 用户应用程序空间 8K /16K / 20K / 32K / 40K / 48K / 52K / 60K / 62K 字节......

    5. 片上集成 1280 字节 RAM

    6. 通用 I/O 口(36/40/44 个) ,复位后为: 准双向口 / 弱上拉(普通 8051 传统 I/O 口) 可设置成四种模式:准双向口 / 弱上拉,推挽 / 强上拉,仅为输入 / 高阻,开漏 每个 I/O 口驱动能力均可达到 20mA,但整个芯片最大不要超过 55mA

    7 . I S P (在系统可编程)/ I A P (在应用可编程) ,无需专用编程器,无需专用仿真器 可通过串口(P3.0/P3.1)直接下载用户程序,数秒即可完成一片

    8. 有 EEPROM 功能(STC12C5A62S2/AD/PWM 无内部 EEPROM)

    9. 看门狗

    10. 内部集成 MAX810 专用复位电路(外部晶体 12M 以下时,复位脚可直接 1K 电阻到地) 11. 外部掉电检测电路: 在 P4.6 口有一个低压门槛比较器 5V 单片机为 1.32V,误差为 +/-5%,3.3V 单片机为 1.30V,误差为 +/-3%

    12. 时钟源:外部高精度晶体 / 时钟,内部 R/C 振荡器(温漂为 +/-5% 到 +/-10% 以内) 用户在下载用户程序时,可选择是使用内部 R/C 振荡器还是外部晶体 / 时钟 常温下内部 R/C 振荡器频率为:5.0V 单片机为: 11MHz ~ 15.5MHz 3.3V 单片机为: 8MHz ~ 12MHz 精度要求不高时,可选择使用内部时钟,但因为有制造误差和温漂,以实际测试为准

    13. 共 4 个 16 位定时器 两个与传统 8051 兼容的定时器 / 计数器,16 位定时器 T0 和 T1,没有定时器 2,但有独立波特率发生器 做串行通讯的波特率发生器 再加上 2 路 PCA 模块可再实现 2 个 16 位定时器

    14. 2 个时钟输出口,可由 T0 的溢出在 P3.4/T0 输出时钟,可由 T1 的溢出在 P3.5/T1 输出时钟

    15. 外部中断 I/O 口 7 路,传统的下降沿中断或低电平触发中断,并新增支持上升沿中断的 PCA 模块, Power Down 模式可由外部中断唤醒, INT0/P3.2, INT1/P3.3, T0/P3.4, T1/P3.5, RxD/P3.0, CCP0/P1.3(也可通过寄存器设置到 P4.2 ), CCP1/P1.4 (也可通过寄存器设置到 P4.3)

    16. PWM(2 路)/PCA(可编程计数器阵列,2 路) --- 也可用来当 2 路 D/A 使用 --- 也可用来再实现 2 个定时器 --- 也可用来再实现 2 个外部中断(上升沿中断 / 下降沿中断均可分别或同时支持)

    17. A/D 转换, 10 位精度 ADC,共 8 路,转换速度可达 250K/S(每秒钟 25 万次)

    18. 通用全双工异步串行口(UART),由于 STC12 系列是高速的 8051,可再用定时器或 PCA 软件实现多串口

    19. STC12C5A60S2 系列有双串口,后缀有 S2 标志的才有双串口,RxD2/P1.2(可通过寄存器设置到 P4.2), TxD2/P1.3(可通过寄存器设置到 P4.3)

    20. 工作温度范围: -40 - +85℃(工业级) / 0 - 75℃(商业级)

    21. 封装:PDIP-40,LQFP-44,LQFP-48 I/O 口不够时,可用 2 到 3 根普通 I/O 口线外接 74HC164/165/595(均可级联)来扩展 I/O 口, 还可用 A/D 做按键扫描来节省 I/O 口,或用双 CPU,三线通信,还多了串口.

    展开全文
  • STC12C5A60S2A/D转换

    2021-07-08 18:45:36
    STC12C5A60S2有8路高速10位A/D转换 本demo实现ADC通道0采集,并通过串口打印出来 #include <STC12C5A60S2.H> #include <intrins.h> #define MAIN_Fosc 11059200L //宏定义主时钟HZ //#define MAIN_...
  • STC12C5A60S2模数转换AD采集程序,LCD1602显示ADC值,采用ADC模块,12位AD采样,仅供参考
  • STC12C5A60S2AD_LCD

    2013-06-18 10:39:44
    STC12C5A60S2单片机 自带ADC实时采样,将数值显示在1602LCD上,并通过max518实时将显示电压转换输出。 工程建好,代码亲测,可直接下载运行。
  • 介绍了一种小信号采集系统的实现方法,利用具有A/D转换功能的单片机STC25A60S2和具有精确放大功能的易用放大器AD620实现了最小系统,并论述了系统设计与实现,详细介绍了采集小信号的过程,并给出了实际应用的例子,...
  • STC12C5A60S2/AD/PWM系列单片机是宏晶科技生产的单时钟/机器周期(1T)的单片机,是高速/低功耗/超强抗干扰的新一代8051单片机,指令代码完全兼容传统8051,但速度快8-12倍。内部集成MAX810专用复位电路,2路PWM,8路高速...
  • STC12C5A60S2简单的AD转换程序

    热门讨论 2012-12-04 15:02:13
    很简单的A/D转换程序,转化结果精确到小数点后两位,包含1602驱动程序。
  • STC12C5A60S2 AD 转换详解

    万次阅读 多人点赞 2016-12-14 09:32:59
    STC系列单片机中的STC89LE516AD/X2提供了8路8位精度的高速A/D转换器,位于P1口上,从而省去了片外ADC的麻烦。这8路ADC为电压输入型,可做按键扫描,电池电压检测,频谱检测等。ADC转换过程需要17个机器周期。通过对...
  • STC12C5A60S2上有用的AD1602显示,自己调试出来的好用,自己用过了
  • 数字电压表(STC12C5A60S2单片机集成的AD转换
  • 程序为以STC12C5A08S2为核心单片机编写的AD转换程序

空空如也

空空如也

1 2 3 4 5 ... 8
收藏数 149
精华内容 59
关键字:

stc12c5a60s2单片机ad转换