找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3018|回复: 3
打印 上一主题 下一主题
收起左侧

STC系列单片机内部AD的应用程序

[复制链接]
跳转到指定楼层
楼主
ID:80436 发表于 2015-5-21 17:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. *****************************************************************************************

  2. STC系列单片机内部AD的应用,和AVR作比较,好理解点

  3. *****************************************************************************************

  4.               #include <reg52.H>
  5. <span style="line-height: 1.5;">#include <intrins.H></span>

  6. // 定义与 ADC 有关的特殊功能寄存器

  7. sfr P1_ADC_EN = 0x97; //A/D转换功能允许寄存器

  8. sfr ADC_CONTR = 0xC5; //A/D转换控制寄存器

  9. sfr ADC_DATA = 0xC6;  //A/D转换结果寄存器

  10. typedef unsigned char INT8U;

  11. typedef unsigned int INT16U;

  12. void delay(INT8U delay_time) // 延时函数

  13. {

  14.          INT8U n;

  15.          INT16U m;

  16.          for (n=0;n<delay_time;n++)

  17.                   {

  18.                             for(m=0;m<10000;m++);

  19.                   }

  20. }

  21. void initiate_RS232(void)  //串口初始化

  22. {

  23.          ES = 0;        // 禁止串口中断

  24.          SCON = 0x50;   // 0101,0000 8 位数据位, 无奇偶校验

  25.          T2CON = 0x34;  // 0011,0100, 由T2 作为波特率发生器

  26.          RCAP2H = 0xFF; // 时钟11.0592MHz, 9600 波特率

  27.          RCAP2L = 0xDB;

  28.          ES = 1;        // 允许串口中断

  29. }

  30. void Send_Byte(INT8U one_byte) // 发送一个字节

  31. {

  32.          TI = 0;        // 清零串口发送中断标志

  33.          SBUF = one_byte;

  34.          while (TI == 0);

  35.          TI = 0;        // 清零串口发送中断标志

  36. }

  37. INT8U get_AD_result(INT8U channel)

  38. {

  39.          INT8U AD_finished = 0; // 存储 A/D 转换标志

  40.          ADC_DATA = 0;

  41.          ADC_CONTR = channel; // 选择 A/D 当前通道

  42.          delay(1);                      //使输入电压达到稳定

  43.          ADC_CONTR |= 0x08; //0000,1000 令 ADC_START = 1, 启动A/D 转换

  44.          AD_finished = 0;

  45.          while ( AD_finished == 0 ) // 等待A/D 转换结束

  46.          {

  47.                   AD_finished = (ADC_CONTR & 0x10); //0001,0000, ADC_FLAG ==1测试A/D转                  换结束否

  48.          }

  49.          ADC_CONTR &= 0xF7; //1111,0111 令 ADC_START = 0, 关闭A/D 转换,

  50.          return (ADC_DATA); // 返回 A/D 转换结果

  51. }

  52. void main()

  53. {

  54.          initiate_RS232();

  55.          P1 = P1 | 0x63; // 0110,0011,要设置为 A/D 转换的P1.x 口,先设为高

  56.          P1_ADC_EN = 0x63; //0110,0011, P1 的P1.0,P1.1,P1.5,P1.6 设置为 A/D 转换输入脚

  57.          // 断开P1.0,P1.1,P1.5,P1.6 内部上拉电阻

  58.          while(1)

  59.          {

  60.                   Send_Byte(get_AD_result(0)); //P1.0 为 A/D 当前通道, 测量并发送结果

  61.                   delay(0x200);

  62.                   Send_Byte(get_AD_result(1)); //P1.1 为 A/D 当前通道, 测量并发送结果

  63.                   delay(0x200);

  64.                   Send_Byte(get_AD_result(5)); //P1.5 为 A/D 当前通道, 测量并发送结果

  65.                   delay(0x200);

  66.                   Send_Byte(get_AD_result(6)); //P1.6 为 A/D 当前通道, 测量并发送结果

  67.                   delay(0x200);

  68.                   Send_Byte(0); // 连续发送 4 个 00H, 便于观察输出显示

  69.                   Send_Byte(0);

  70.                   Send_Byte(0);

  71.                   Send_Byte(0);

  72.                   delay(0x200); // 延时

  73.                   delay(0x200);

  74.                   delay(0x200);

  75.                   delay(0x200);

  76.                   delay(0x200);

  77.                   delay(0x200);

  78.          }

  79. }
复制代码


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:369082 发表于 2018-8-23 17:24 | 只看该作者
我用的STC15单片机测试脉冲信号的幅值,在采集数据过程中只能采样一次,想取多次采样取最大值的平均值来显示,但是程序显示时总是错误,您能帮我看看一下吗?
回复

使用道具 举报

板凳
ID:369082 发表于 2018-8-23 17:26 | 只看该作者
这是我的程序,把采样程序区掉就可以成功显示一次
/******************
???AD?????
*******************/
void AD_int(void)          //???AD?????                                  
{
CLK_DIV&=0xDF;   //MCKO_S1,MCKO_S0,ADRJ,TX_RX,CLKS2,CLKS1,CLKS0
                                 //ADRJ=0,ADC_RES[7:0]???8λADC?????ADC_RESl[1:0]???2λADC???
ADC_CONTR=0x80;//??AD??????
delay_ms(1);//???????????????1ms???????
P1ASF=0x01;//????P1.0,P1.1???0?????1???????????????
ADC_CONTR=0xE0;   // ADC_POWRE SPEED1 SPEED0 ADC_FLAG  ADC_START CHS2 CHS1 CHS0=1 11 0 0 000
                                   //???90??????????????Σ?????????AD????????0???
delay_ms(1); //????????20us~200us????
}                                  
                          
/******************
AD???????
*******************/                                  
uint adval()//ad???????
{
        uint val;//???ad??????
        uchar low;//???ad??????????λ
//        float fval;//??????
       
//        P1ASF=0X08;//p1.3?ad???kou
       
        P1M1 |= (1<<3);                // ??ADC???????????????
        P1M0 &= ~(1<<3);
        P1ASF = (1<<3);                //P1.3??ADC
        ADC_CONTR=0xeb;//??ad?????????????????p1.3
//        delay_ms(1);
        while(ADC_CONTR&0X10==0);
        val=ADC_RES;//??????????λ????
        val<<=2;//??????λ
        low=ADC_RESL;
        low&=0x03;
        val+=low;
//        fval=val;
//        fval*=5;
//        fval/=1024;
//        fval*=10;
//        num=fval;//*100;
        ADC_CONTR=0xeb;                          //1110 1011  ??ad?????????????????p1.3
        return val;//num;   
}
/******************
  ???????
*******************/
uint quyang()
{uint i,t,j,l,m;
for(i=0;i<3;i++)
{
   t=adval();          //a[i]=i
   a[i]=t;
        _nop_();_nop_(); _nop_();
         _nop_();_nop_(); _nop_();

}
for(j=0;j<3;j++)

{for(i=0;i<3-j;i++)
     if(a[i]>a[i+1])
        {  l=a[i];
         a[i]=a[i+1];
         a[i+1]=l;
        }
}                                       
m=a[2];
return m;
}
回复

使用道具 举报

地板
ID:399179 发表于 2020-5-31 19:38 来自手机 | 只看该作者
加油!我也正在学习内部AD
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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