您的位置:首页 > 其它

51单片机AD转换的程序

2017-12-26 13:39 169 查看
void Read_init (unsigned char CHA){  

    unsigned char AD_FIN=0; //存储A/D转换标志  

    CHA &= 0x07;            //选择ADC的8个接口中的一个(0000 0111 清0高5位)  

    ADC_CONTR = 0x40;       //ADC转换的速度(0XX0 0000 其中XX控制速度,请根据数据手册设置)  

    _nop_();  

    ADC_CONTR |= CHA;       //选择A/D当前通道  

    _nop_();  

    ADC_CONTR |= 0x80;      //启动A/D电源  

    DELAY_MS(1);            //使输入电压达到稳定(1ms即可)  

}  

  

  

unsigned char Read (void){  

    unsigned char AD_FIN=0; //存储A/D转换标志  

    ADC_CONTR |= 0x08;      //启动A/D转换(0000 1000 令ADCS = 1)  

    _nop_();  

    _nop_();  

    _nop_();  

    _nop_();  

    while (AD_FIN ==0){     //等待A/D转换结束  

        AD_FIN = (ADC_CONTR & 0x10); //0001 0000测试A/D转换结束否  

    }  

    ADC_CONTR &= 0xE7;      //1111 0111 清ADC_FLAG位, 关闭A/D转换,   

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

}  

  

以上- 8位ADC程序模块(适用于STC12C2052AD系列) 

C代码  



  

  

#include <STC12C2052AD.H> //单片机头文件  

#include <intrins.h>  //51基本运算(包括_nop_空函数)  

  

  

void DELAY_MS (unsigned int a){  

    unsigned int i;  

    while( a-- != 0){  

        for(i = 0; i < 600; i++);  

    }  

}  

  

  

  

void UART_init (void){  

    //EA = 1; //允许总中断(如不使用中断,可用//屏蔽)  

    //ES = 1; //允许UART串口的中断  

  

    TMOD = 0x20;    //定时器T/C1工作方式2  

    SCON = 0x50;    //串口工作方式1,允许串口接收(SCON = 0x40 时禁止串口接收)  

    TH1 = 0xF3; //定时器初值高8位设置  

    TL1 = 0xF3; //定时器初值低8位设置  

    PCON = 0x80;    //波特率倍频(屏蔽本句波特率为2400)  

    TR1 = 1;    //定时器启动      

}  

  

  

  

void UART_T (unsigned char UART_data){ //定义串口发送数据变量  

    SBUF = UART_data;   //将接收的数据发送回去  

    while(TI == 0);     //检查发送中断标志位  

    TI = 0;         //令发送中断标志位为0(软件清零)  

}  

  

  

void Read_init (unsigned char CHA){  

    unsigned char AD_FIN=0; //存储A/D转换标志  

    CHA &= 0x07;            //选择ADC的8个接口中的一个(0000 0111 清0高5位)  

    ADC_CONTR = 0x40;       //ADC转换的速度(0XX0 0000 其中XX控制速度,请根据数据手册设置)  

    _nop_();  

    ADC_CONTR |= CHA;       //选择A/D当前通道  

    _nop_();  

    ADC_CONTR |= 0x80;      //启动A/D电源  

    DELAY_MS(1);            //使输入电压达到稳定(1ms即可)  

}  

  

  

unsigned char Read (void){  

    unsigned char AD_FIN=0; //存储A/D转换标志  

    ADC_CONTR |= 0x08;      //启动A/D转换(0000 1000 令ADCS = 1)  

    _nop_();  

    _nop_();  

    _nop_();  

    _nop_();  

    while (AD_FIN ==0){     //等待A/D转换结束  

        AD_FIN = (ADC_CONTR & 0x10); //0001 0000测试A/D转换结束否  

    }  

    ADC_CONTR &= 0xE7;      //1111 0111 清ADC_FLAG位, 关闭A/D转换,   

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

}  

  

  

void main (void){  

    unsigned char R;  

    UART_init();//串口初始程序  

    Read_init(0);//ADC初始化  

    P1M0 = 0x01; //P1.7~.0:0000 0001(高阻)//注意:更改ADC通道时须同时将对应的IO接口修改为高阻输入。  

    P1M1 = 0x00; //P1.7~.0:0000 0000(强推)  

    while(1){  

        R = Read ();  

        UART_T (R); //串口小秘书,将ADC读出值送入串口显示  

    }  

}  

以上- 8位ADC应用实例(适用于STC12C2052AD系列) 

C代码  



  

void Read_init (unsigned char CHA){  

    unsigned char AD_FIN=0; //存储A/D转换标志  

    CHA &= 0x07;            //选择ADC的8个接口中的一个(0000 0111 清0高5位)  

    ADC_CONTR = 0x40;       //ADC转换的速度(0XX0 0000 其中XX控制速度,请根据数据手册设置)  

    _nop_();  

    ADC_CONTR |= CHA;       //选择A/D当前通道  

    _nop_();  

    ADC_CONTR |= 0x80;      //启动A/D电源  

    DELAY_MS(1);            //使输入电压达到稳定(1ms即可)  

}  

  

  

unsigned int ADC_Read (void){  

    unsigned char AD_FIN=0; //存储A/D转换标志  

    ADC_CONTR |= 0x08;      //启动A/D转换(0000 1000 令ADCS = 1)  

    _nop_();  

    _nop_();  

    _nop_();  

    _nop_();  

    while (AD_FIN ==0){     //等待A/D转换结束  

        AD_FIN = (ADC_CONTR & 0x10); //0001 0000测试A/D转换结束否  

    }  

    ADC_CONTR &= 0xE7;      //1111 0111 清ADC_FLAG位, 关闭A/D转换,   

return (ADC_RES*4+ADC_RESL);//返回A/D转换结果(10位ADC数据高8位在ADC_RES中,低2位在ADC_RESL中)  

}  

以上- 10位ADC程序模块(适用于STC12C5A60S2系列) 

C代码  



  

  

#include <STC12C5A60S2.H> //单片机头文件  

#include <intrins.h>  //51基本运算(包括_nop_空函数)  

  

  

void DELAY_MS (unsigned int a){  

    unsigned int i;  

    while( a-- != 0){  

        for(i = 0; i < 600; i++);  

    }  

}  

  

  

  

void UART_init (void){  

    //EA = 1; //允许总中断(如不使用中断,可用//屏蔽)  

    //ES = 1; //允许UART串口的中断  

  

    TMOD = 0x20;    //定时器T/C1工作方式2  

    SCON = 0x50;    //串口工作方式1,允许串口接收(SCON = 0x40 时禁止串口接收)  

    TH1 = 0xF3; //定时器初值高8位设置  

    TL1 = 0xF3; //定时器初值低8位设置  

    PCON = 0x80;    //波特率倍频(屏蔽本句波特率为2400)  

    TR1 = 1;    //定时器启动      

}  

  

  

  

void UART_T (unsigned char UART_data){ //定义串口发送数据变量  

    SBUF = UART_data;   //将接收的数据发送回去  

    while(TI == 0);     //检查发送中断标志位  

    TI = 0;         //令发送中断标志位为0(软件清零)  

}  

  

  

void Read_init (unsigned char CHA){  

    unsigned char AD_FIN=0; //存储A/D转换标志  

    CHA &= 0x07;            //选择ADC的8个接口中的一个(0000 0111 清0高5位)  

    ADC_CONTR = 0x40;       //ADC转换的速度(0XX0 0000 其中XX控制速度,请根据数据手册设置)  

    _nop_();  

    ADC_CONTR |= CHA;       //选择A/D当前通道  

    _nop_();  

    ADC_CONTR |= 0x80;      //启动A/D电源  

    DELAY_MS(1);            //使输入电压达到稳定(1ms即可)  

}  

  

  

void ADC_Read (void){  

    unsigned char AD_FIN=0; //存储A/D转换标志  

    ADC_CONTR |= 0x08;      //启动A/D转换(0000 1000 令ADCS = 1)  

    _nop_();  

    _nop_();  

    _nop_();  

    _nop_();  

    while (AD_FIN ==0){     //等待A/D转换结束  

        AD_FIN = (ADC_CONTR & 0x10); //0001 0000测试A/D转换结束否  

    }  

    ADC_CONTR &= 0xE7;      //1111 0111 清ADC_FLAG位, 关闭A/D转换,   

}  

  

  

void main (void){  

    UART_init();//串口初始程序  

    Read_init(0);//ADC初始化  

    P1M1 = 0x01; //P1.7~P1.0:0000 0001(高阻)//注意:更改ADC通道时须同时将对应的IO接口修改为高阻输入。  

    P1M0 = 0x00; //P1.7~P1.0:0000 0000(强推)  

    while(1){  

        ADC_Read ();//调用ADC转换程序  

        UART_T (ADC_RES); //串口小秘书,将ADC读出值高8位送入串口  0000 0000  

        UART_T (ADC_RESL); //串口小秘书,将ADC读出值低2位送入串口  XXXX XX00  

    }  

}  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: