51单片机AD转换的程序

  1. void Read_init (unsigned char CHA){  
  2.     unsigned char AD_FIN=0; //存储A/D转换标志  
  3.     CHA &= 0x07;            //选择ADC的8个接口中的一个(0000 0111 清0高5位)  
  4.     ADC_CONTR 0x40;       //ADC转换的速度(0XX0 0000 其中XX控制速度,请根据数据手册设置)  
  5.     _nop_();  
  6.     ADC_CONTR |= CHA;       //选择A/D当前通道  
  7.     _nop_();  
  8.     ADC_CONTR |= 0x80;      //启动A/D电源  
  9.     DELAY_MS(1);            //使输入电压达到稳定(1ms即可)  
  10.  
  11.   
  12.   
  13. unsigned char Read (void){  
  14.     unsigned char AD_FIN=0; //存储A/D转换标志  
  15.     ADC_CONTR |= 0x08;      //启动A/D转换(0000 1000 令ADCS 1)  
  16.     _nop_();  
  17.     _nop_();  
  18.     _nop_();  
  19.     _nop_();  
  20.     while (AD_FIN ==0){     //等待A/D转换结束  
  21.         AD_FIN (ADC_CONTR & 0x10); //0001 0000测试A/D转换结束否  
  22.      
  23.     ADC_CONTR &= 0xE7;      //1111 0111 清ADC_FLAG位, 关闭A/D转换,   
  24. return (ADC_DATA);          //返回A/D转换结果(8位)  
  25.  
  26.   

以上- 8位ADC程序模块(适用于STC12C2052AD系列) 
C代码    收藏代码
  1.   
  2.   
  3. #include <STC12C2052AD.H> //单片机头文件  
  4. #include <intrins.h>  //51基本运算(包括_nop_空函数)  
  5.   
  6.   
  7. void DELAY_MS (unsigned int a){  
  8.     unsigned int i;  
  9.     whilea-- != 0){  
  10.         for(i 0; 600; i++);  
  11.      
  12.  
  13.   
  14.   
  15.   
  16. void UART_init (void){  
  17.     //EA 1; //允许总中断(如不使用中断,可用//屏蔽)  
  18.     //ES 1; //允许UART串口的中断  
  19.   
  20.     TMOD 0x20;    //定时器T/C1工作方式2  
  21.     SCON 0x50;    //串口工作方式1,允许串口接收(SCON 0x40 时禁止串口接收)  
  22.     TH1 0xF3; //定时器初值高8位设置  
  23.     TL1 0xF3; //定时器初值低8位设置  
  24.     PCON 0x80;    //波特率倍频(屏蔽本句波特率为2400)  
  25.     TR1 1;    //定时器启动      
  26.  
  27.   
  28.   
  29.   
  30. void UART_T (unsigned char UART_data){ //定义串口发送数据变量  
  31.     SBUF UART_data;   //将接收的数据发送回去  
  32.     while(TI == 0);     //检查发送中断标志位  
  33.     TI 0;         //令发送中断标志位为0(软件清零)  
  34.  
  35.   
  36.   
  37. void Read_init (unsigned char CHA){  
  38.     unsigned char AD_FIN=0; //存储A/D转换标志  
  39.     CHA &amp;= 0x07;            //选择ADC的8个接口中的一个(0000 0111 清0高5位)  
  40.     ADC_CONTR 0x40;       //ADC转换的速度(0XX0 0000 其中XX控制速度,请根据数据手册设置)  
  41.     _nop_();  
  42.     ADC_CONTR |= CHA;       //选择A/D当前通道  
  43.     _nop_();  
  44.     ADC_CONTR |= 0x80;      //启动A/D电源  
  45.     DELAY_MS(1);            //使输入电压达到稳定(1ms即可)  
  46.  
  47.   
  48.   
  49. unsigned char Read (void){  
  50.     unsigned char AD_FIN=0; //存储A/D转换标志  
  51.     ADC_CONTR |= 0x08;      //启动A/D转换(0000 1000 令ADCS 1)  
  52.     _nop_();  
  53.     _nop_();  
  54.     _nop_();  
  55.     _nop_();  
  56.     while (AD_FIN ==0){     //等待A/D转换结束  
  57.         AD_FIN (ADC_CONTR &amp; 0x10); //0001 0000测试A/D转换结束否  
  58.      
  59.     ADC_CONTR &amp;= 0xE7;      //1111 0111 清ADC_FLAG位, 关闭A/D转换,   
  60. return (ADC_DATA);          //返回A/D转换结果(8位)  
  61.  
  62.   
  63.   
  64. void main (void){  
  65.     unsigned char R;  
  66.     UART_init();//串口初始程序  
  67.     Read_init(0);//ADC初始化  
  68.     P1M0 0x01; //P1.7~.0:0000 0001(高阻)//注意:更改ADC通道时须同时将对应的IO接口修改为高阻输入。  
  69.     P1M1 0x00; //P1.7~.0:0000 0000(强推)  
  70.     while(1){  
  71.         Read ();  
  72.         UART_T (R); //串口小秘书,将ADC读出值送入串口显示  
  73.      
  74.  

以上- 8位ADC应用实例(适用于STC12C2052AD系列) 
C代码    收藏代码
  1.   
  2. void Read_init (unsigned char CHA){  
  3.     unsigned char AD_FIN=0; //存储A/D转换标志  
  4.     CHA &amp;= 0x07;            //选择ADC的8个接口中的一个(0000 0111 清0高5位)  
  5.     ADC_CONTR 0x40;       //ADC转换的速度(0XX0 0000 其中XX控制速度,请根据数据手册设置)  
  6.     _nop_();  
  7.     ADC_CONTR |= CHA;       //选择A/D当前通道  
  8.     _nop_();  
  9.     ADC_CONTR |= 0x80;      //启动A/D电源  
  10.     DELAY_MS(1);            //使输入电压达到稳定(1ms即可)  
  11.  
  12.   
  13.   
  14. unsigned int ADC_Read (void){  
  15.     unsigned char AD_FIN=0; //存储A/D转换标志  
  16.     ADC_CONTR |= 0x08;      //启动A/D转换(0000 1000 令ADCS 1)  
  17.     _nop_();  
  18.     _nop_();  
  19.     _nop_();  
  20.     _nop_();  
  21.     while (AD_FIN ==0){     //等待A/D转换结束  
  22.         AD_FIN (ADC_CONTR &amp; 0x10); //0001 0000测试A/D转换结束否  
  23.      
  24.     ADC_CONTR &amp;= 0xE7;      //1111 0111 清ADC_FLAG位, 关闭A/D转换,   
  25. return (ADC_RES*4+ADC_RESL);//返回A/D转换结果(10位ADC数据高8位在ADC_RES中,低2位在ADC_RESL中)  
  26.  

以上- 10位ADC程序模块(适用于STC12C5A60S2系列) 
C代码    收藏代码
  1.   
  2.   
  3. #include <STC12C5A60S2.H> //单片机头文件  
  4. #include <intrins.h>  //51基本运算(包括_nop_空函数)  
  5.   
  6.   
  7. void DELAY_MS (unsigned int a){  
  8.     unsigned int i;  
  9.     whilea-- != 0){  
  10.         for(i 0; 600; i++);  
  11.      
  12.  
  13.   
  14.   
  15.   
  16. void UART_init (void){  
  17.     //EA 1; //允许总中断(如不使用中断,可用//屏蔽)  
  18.     //ES 1; //允许UART串口的中断  
  19.   
  20.     TMOD 0x20;    //定时器T/C1工作方式2  
  21.     SCON 0x50;    //串口工作方式1,允许串口接收(SCON 0x40 时禁止串口接收)  
  22.     TH1 0xF3; //定时器初值高8位设置  
  23.     TL1 0xF3; //定时器初值低8位设置  
  24.     PCON 0x80;    //波特率倍频(屏蔽本句波特率为2400)  
  25.     TR1 1;    //定时器启动      
  26.  
  27.   
  28.   
  29.   
  30. void UART_T (unsigned char UART_data){ //定义串口发送数据变量  
  31.     SBUF UART_data;   //将接收的数据发送回去  
  32.     while(TI == 0);     //检查发送中断标志位  
  33.     TI 0;         //令发送中断标志位为0(软件清零)  
  34.  
  35.   
  36.   
  37. void Read_init (unsigned char CHA){  
  38.     unsigned char AD_FIN=0; //存储A/D转换标志  
  39.     CHA &amp;= 0x07;            //选择ADC的8个接口中的一个(0000 0111 清0高5位)  
  40.     ADC_CONTR 0x40;       //ADC转换的速度(0XX0 0000 其中XX控制速度,请根据数据手册设置)  
  41.     _nop_();  
  42.     ADC_CONTR |= CHA;       //选择A/D当前通道  
  43.     _nop_();  
  44.     ADC_CONTR |= 0x80;      //启动A/D电源  
  45.     DELAY_MS(1);            //使输入电压达到稳定(1ms即可)  
  46.  
  47.   
  48.   
  49. void ADC_Read (void){  
  50.     unsigned char AD_FIN=0; //存储A/D转换标志  
  51.     ADC_CONTR |= 0x08;      //启动A/D转换(0000 1000 令ADCS 1)  
  52.     _nop_();  
  53.     _nop_();  
  54.     _nop_();  
  55.     _nop_();  
  56.     while (AD_FIN ==0){     //等待A/D转换结束  
  57.         AD_FIN (ADC_CONTR &amp; 0x10); //0001 0000测试A/D转换结束否  
  58.      
  59.     ADC_CONTR &amp;= 0xE7;      //1111 0111 清ADC_FLAG位, 关闭A/D转换,   
  60.  
  61.   
  62.   
  63. void main (void){  
  64.     UART_init();//串口初始程序  
  65.     Read_init(0);//ADC初始化  
  66.     P1M1 0x01; //P1.7~P1.0:0000 0001(高阻)//注意:更改ADC通道时须同时将对应的IO接口修改为高阻输入。  
  67.     P1M0 0x00; //P1.7~P1.0:0000 0000(强推)  
  68.     while(1){  
  69.         ADC_Read ();//调用ADC转换程序  
  70.         UART_T (ADC_RES); //串口小秘书,将ADC读出值高8位送入串口  0000 0000  
  71.         UART_T (ADC_RESL); //串口小秘书,将ADC读出值低2位送入串口  XXXX XX00  
  72.      
  73. }  
  • 15
    点赞
  • 101
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是基于C语言的51单片机AD转换程序的示例代码: ```c #include <reg51.h> // 包含51单片机的头文件 sbit ADC_CS = P1^0; // 设置ADC_CS为P1.0引脚 sbit ADC_CLK = P1^1; // 设置ADC_CLK为P1.1引脚 sbit ADC_DIO = P1^2; // 设置ADC_DIO为P1.2引脚 unsigned char ADC_Read(unsigned char channel) // 定义AD转换函数 { unsigned char i, dat1, dat2 = 0; ADC_CS = 0; // 启动ADC芯片 ADC_CLK = 0; ADC_DIO = 1; ADC_CLK = 1; ADC_DIO = 1; ADC_CLK = 0; ADC_DIO = 0; ADC_CLK = 1; ADC_DIO = 0; ADC_CLK = 0; ADC_DIO = 1; ADC_CLK = 1; ADC_DIO = 1; ADC_CLK = 0; ADC_DIO = 1; ADC_CLK = 1; ADC_DIO = 0; ADC_CLK = 0; ADC_DIO = channel & 0x80; // 发送通道号 ADC_CLK = 1; ADC_DIO = channel & 0x40; ADC_CLK = 0; ADC_DIO = channel & 0x20; ADC_CLK = 1; ADC_DIO = channel & 0x10; ADC_CLK = 0; ADC_DIO = channel & 0x08; ADC_CLK = 1; ADC_DIO = channel & 0x04; ADC_CLK = 0; ADC_DIO = channel & 0x02; ADC_CLK = 1; ADC_DIO = channel & 0x01; ADC_CLK = 0; ADC_DIO = 1; ADC_CLK = 1; ADC_DIO = 1; ADC_CLK = 0; ADC_DIO = 1; ADC_CLK = 1; ADC_DIO = 1; ADC_CLK = 0; ADC_DIO = 1; ADC_CLK = 1; ADC_DIO = 1; ADC_CLK = 0; ADC_DIO = 1; ADC_CLK = 1; dat1 = 0; for(i = 0; i < 8; i++) // 接收高8位数据 { ADC_CLK = 0; ADC_CLK = 1; dat1 = (dat1 << 1) | ADC_DIO; } dat2 = 0; for(i = 0; i < 8; i++) // 接收低8位数据 { ADC_CLK = 0; ADC_CLK = 1; dat2 = (dat2 << 1) | ADC_DIO; } ADC_CS = 1; // 关闭ADC芯片 return dat1; // 返回高8位数据 } ``` 在上述代码中,我们使用了51单片机的P1口来控制AD转换器,并定义了ADC_CS、ADC_CLK、ADC_DIO三个引脚。其中,ADC_CS为芯片选择信号,ADC_CLK为时钟信号,ADC_DIO为数据信号。函数中,使用了两个for循环分别接收高8位和低8位数据,并在最后返回高8位数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值