找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3239|回复: 11
收起左侧

高分求stc12C5A60S2单片机自带AD程序代码

[复制链接]
ID:229232 发表于 2019-1-7 23:29 | 显示全部楼层 |阅读模式
200黑币
要求用12C5A60S2单片机自带AD功能,最好也是单片机自带晶振,检测电压,然后用数码管显示出来的程序,

回复

使用道具 举报

ID:23606 发表于 2019-1-8 08:44 | 显示全部楼层
12C5A60S2的数据手册里就有例程
回复

使用道具 举报

ID:426861 发表于 2019-1-8 08:59 | 显示全部楼层
去官方网站,这个是官网有的
回复

使用道具 举报

ID:229232 发表于 2019-1-8 09:20 | 显示全部楼层
求具体链接或截图
回复

使用道具 举报

ID:229232 发表于 2019-1-8 09:21 | 显示全部楼层
YJGG 发表于 2019-1-8 08:44
12C5A60S2的数据手册里就有例程

我手册里没有
回复

使用道具 举报

ID:424598 发表于 2019-1-8 10:42 来自手机 | 显示全部楼层
回复

使用道具 举报

ID:97554 发表于 2019-1-8 10:42 | 显示全部楼层
回复

使用道具 举报

ID:424598 发表于 2019-1-8 10:43 来自手机 | 显示全部楼层
要学会自己搜索,论坛都有人发的
回复

使用道具 举报

ID:453974 发表于 2019-1-8 12:32 | 显示全部楼层
网上找找数据手册吧
回复

使用道具 举报

ID:213173 发表于 2019-1-8 14:11 | 显示全部楼层
给你写个简单示例程序程序,仿真图不代表实际电路,实际数码管电路要加限流电阻。 无标题.jpg

#include <STC12C5A60S2.H>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char

sbit V1 = P3^0;
sbit V2 = P3^1;
sbit V3 = P3^2;       
sbit V4 = P3^3;       

/*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
uchar code table[]={//数码管数组0~F.V
        0x3f,0x06,0x5b,0x4f,
        0x66,0x6d,0x7d,0x07,
        0x7f,0x6f,0x77,0x7c,
        0x39,0x5e,0x79,0x71,0x3e};
uchar Cnt250us;
uint V_CY;

void Delay(uint n);
void Timer0Init();
void ShowResult();
void InitADC();
uint GetADCResult(uchar ch);
void LB_ADC();
void display();

void main()
{
        P1M1 = 0x01;                                         //设置P1.0高阻:ADC输入高阻
        P1M0 = 0x00;                                         //设置P1.0高阻:ADC输入高阻
        P2M1 = 0x00;                                         //设置P2.0~2.7推挽
        P2M0 = 0xFF;                                         //设置P2.0~2.7推挽
        P3M1 = 0x00;                                         //设置P3.0~3.3推挽
        P3M0 = 0x0F;                                         //设置P3.0~3.3推挽
        Timer0Init();
        InitADC();                 //Init ADC sfr       
        while(1)
        {
                ShowResult();
        }
}
void Timer0Init()                //250微秒@11.0592MHz
{
        AUXR &= 0x7F;                //定时器时钟12T模式
        TMOD &= 0xF0;                //设置定时器模式
        TMOD |= 0x02;                //设置定时器模式
        TL0 = 0x1A;                        //设置定时初值
        TH0 = 0x1A;                        //设置定时重载值
        TF0 = 0;                                //清除TF0标志
        TR0 = 1;                                //定时器0开始计时
}
/*------------------
        演示结果 周期2ms
--------------------*/
void ShowResult()
{
        if(TF0==1)
        {
                TF0=0;
                if(++Cnt250us>=8)
                {
                        Cnt250us=0;
                        LB_ADC();
                        display();
                }
        }
}
/*--------------------------
  ADC采样平均法滤波程序
---------------------------*/
void LB_ADC()
{
        static long PJZ_ADC=0;                //累加10次采样的变量
        static uchar count=0;
        PJZ_ADC += GetADCResult(0);        //累加采样值
        count++;                                //计数器变量自+1
        if(count>=10)                        //如果计数到10次采样
        {
                count=0;                        //计数器清0
                V_CY=(PJZ_ADC*5*10+512)/1024;//获取100倍电压值四舍五入取整数
                PJZ_ADC=0;                        //采样变量清0        
        }
}
/*--------------------------
        Initial ADC sfr
---------------------------*/
void InitADC()
{
        P1ASF=0x01;                                                //设置P1的0通道端口作为模拟输入
        ADC_RES=0;                                                //清除ADC_RES存储器以前的结果
        ADC_RESL=0;
        ADC_CONTR=ADC_POWER|ADC_SPEEDL; //ADC 开启电源、转换速度 1010 0000
        Delay(2);                                               
}
//Get ADC Result
uint GetADCResult(uchar ch)                                //获取ADC结果
{
        ADC_CONTR=ADC_POWER|ADC_SPEEDL|ch|ADC_START;//启动转换1010 1000
    _nop_();                        //延时确保正确读到ADC_CONTR寄存器的值
    _nop_();
    _nop_();
    _nop_();
        while(!(ADC_CONTR & ADC_FLAG));        //等待ADC转换完成标志置位 1001 1000
        ADC_CONTR &=~ADC_FLAG;                                //关闭ADC
        return (ADC_RES<<2)|ADC_RESL;                //返回十位ADC结果
}
void display()//数码管显示程序
{
        static uchar i=0;
        P2=0x00;//消隐
        switch(i)
        {
                case 0: V1=0;V2=1;V3=1;V4=1;P2=table[V_CY/100%10]|0x80;i++;break;//加小数点
                case 1: V1=1;V2=0;V3=1;V4=1;P2=table[V_CY/10%10];i++;break;
                case 2: V1=1;V2=1;V3=0;V4=1;P2=table[V_CY%10];i++;break;
                case 3: V1=1;V2=1;V3=1;V4=0;P2=table[16];i=0;break;
        }
}
/*----------------------------
Software delay function
----------------------------*/
void Delay(uint n)
{
    uint x;
    while (n--)
    {
        x = 5000;
        while (x--);
    }
}


回复

使用道具 举报

ID:412814 发表于 2019-1-25 14:32 | 显示全部楼层
wulin 发表于 2019-1-8 14:11
给你写个简单示例程序程序,仿真图不代表实际电路,实际数码管电路要加限流电阻。

#include

这个程序真挺好,谢谢
回复

使用道具 举报

ID:432823 发表于 2019-1-25 19:16 | 显示全部楼层
/*************        本程序功能说明        **************

P1.0做ADC输入,从串口输出结果(ASCII),9600,8,N,1.

用户只需要更改 MAIN_Fosc 来适应自己的系统。

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


/*************        用户系统配置        **************/

#define MAIN_Fosc                22118400L        //定义主时钟, 模拟串口和和延时会自动适应。5~35MHZ

/*************        以下宏定义用户请勿修改        **************/
#include        "reg51.H"
#define        uchar        unsigned char
#define uint        unsigned int
/******************************************/

sfr P1ASF     = 0x9D;        //12C5A60AD/S2系列模拟输入(AD或LVD)选择
sfr ADC_CONTR = 0xBC;        //带AD系列
sfr ADC_RES   = 0xBD;        //带AD系列
sfr ADC_RESL  = 0xBE;        //带AD系列

//                                                                7       6      5       4         3      2    1    0   Reset Value
//sfr ADC_CONTR = 0xBC;                ADC_POWER SPEED1 SPEED0 ADC_FLAG ADC_START CHS2 CHS1 CHS0 0000,0000        //AD 转换控制寄存器
#define ADC_OFF()        ADC_CONTR = 0
#define ADC_ON                (1 << 7)
#define ADC_90T                (3 << 5)
#define ADC_180T        (2 << 5)
#define ADC_360T        (1 << 5)
#define ADC_540T        0
#define ADC_FLAG        (1 << 4)        //软件清0
#define ADC_START        (1 << 3)        //自动清0
#define ADC_CH0                0
#define ADC_CH1                1
#define ADC_CH2                2
#define ADC_CH3                3
#define ADC_CH4                4
#define ADC_CH5                5
#define ADC_CH6                6
#define ADC_CH7                7


/************* 本地变量声明 **************/
sbit        P_TXD1 = P3^1;


/************* 本地函数声明 **************/
void        Tx1Send(uchar dat);
void        PrintString(unsigned char code *puts);
void          delay_ms(unsigned char ms);
uint        adc10_start(uchar channel);        //channel = 0~7




/********************* 主函数 *************************/
void main(void)
{
        uint        j;

        PrintString("****** STC12C5A60S2系列ADC程序 2011-02-27 ******\r\n");        //上电后串口发送一条提示信息

        P1ASF = (1 << ADC_CH0);                        //12C5A60AD/S2系列模拟输入(AD)选择
        ADC_CONTR = ADC_360T | ADC_ON;

        while(1)
        {
                delay_ms(250);
                delay_ms(250);
                delay_ms(250);
                delay_ms(250);
               
                j = adc10_start(0);                // P1.0 ADC
                Tx1Send('A');
                Tx1Send('D');
                Tx1Send('0');
                Tx1Send('=');
                Tx1Send(j/1000 + '0');
                Tx1Send(j%1000/100 + '0');
                Tx1Send(j%100/10 + '0');
                Tx1Send(j%10 + '0');
                Tx1Send(0x0d);
                Tx1Send(0x0a);
               
        }
}

/********************* 做一次ADC转换 *******************/
uint        adc10_start(uchar channel)        //channel = 0~7
{
        uint        adc;
        uchar        i;

        ADC_RES = 0;
        ADC_RESL = 0;

        ADC_CONTR = (ADC_CONTR & 0xe0) | ADC_START | channel;

//        for(i=0; i<250; i++)                //13T/loop, 40*13=520T=23.5us @ 22.1184M
        i = 250;
        do{
                if(ADC_CONTR & ADC_FLAG)
                {
                        ADC_CONTR &= ~ADC_FLAG;
                //        adc = 0;
                //        adc = (ADC_RES << 8) | ADC_RESL;        //ADRJ_enable()
                        adc = (uint)ADC_RES;
                        adc = (adc << 2) | (ADC_RESL & 3);
                        return        adc;
                }
        }while(--i);
        return        1024;
}

//========================================================================
// 函数: void  delay_ms(unsigned char ms)
// 描述: 延时函数。
// 参数: ms,要延时的ms数.
// 返回: none.
// 版本: VER1.0
// 日期: 2010-12-15
// 备注:
//========================================================================
void  delay_ms(unsigned char ms)
{
     unsigned int i;
         do{
              i = MAIN_Fosc / 14000;
                  while(--i)        ;   //14T per loop
     }while(--ms);
}


/********************** 模拟串口相关函数************************/

void        BitTime(void)        //位时间函数
{
        uint i;
        i = ((MAIN_Fosc / 100) * 104) / 140000L - 1;                //根据主时钟来计算位时间
        while(--i);
}

//模拟串口发送
void        Tx1Send(uchar dat)                //9600,N,8,1                发送一个字节
{
        uchar        i;
        EA = 0;
        P_TXD1 = 0;
        BitTime();
        for(i=0; i<8; i++)
        {
                if(dat & 1)                P_TXD1 = 1;
                else                        P_TXD1 = 0;
                dat >>= 1;
                BitTime();
        }
        P_TXD1 = 1;
        EA = 1;
        BitTime();
        BitTime();
}

void PrintString(unsigned char code *puts)                //发送一串字符串
{
    for (; *puts != 0;        puts++)  Tx1Send(*puts);         //遇到停止符0结束
}
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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