找回密码
 立即注册

QQ登录

只需一步,快速开始

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

STC15W系列单片机自带的ADC使用方法以及时需要注意的问题

[复制链接]
跳转到指定楼层
楼主
ID:59956 发表于 2018-12-11 16:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
自带ADC的使用方法请参照以下代码。

需要注意的问题:

1、在启动AD转换前,给AD转换器上电,并且上电后需要延时一下;

2、对ADC控制寄存器(ADC_CONTR)的操作最好是直接赋值,不要用‘&’和‘|’;

3、在ADC转换过程中不要改变I/O口的状态,即使试图改变也会失败;

4、ADC实现一次转换结束后,AD转换将会自动关闭,如果要实现连续转换,则需要再次启动AD转换(将ADC_CONTR 寄存器的ADC_START位置1)。因为需要对ADC_CONTR寄存器直接赋值,所以 要对ADC_CONTR寄存器再次赋值(该值和ADC初始化中的值一致)。实践也证明了,如果直接利用或语句将ADC_START置位(ADC_CONTR |= ADC_START;),则AD转换失败,通过调试测试,初步判断是ADC_CONTR寄存器的ADC_POWER位不等于1,也就是说启动AD转换前,AD转换器没有上电,这样AD转换自然不会成功。

5、如果需要改变I/O口的状态,最好是在AD转换开始之前进行。

以上的内容纯属个人学习体会,如有不当之处,请指正!

  1. #include
  2. #include"init.h"
  3. #include"led.h"
  4. #include"buzzer.h"
  5. #include"delayms.h"
  6. #include"uart.h"

  7. //ADC_CONTR寄存器的位取值
  8. #define ADC_POWER0x80//打开ADC转化器电源
  9. #define ADC_FLAG0x10//ADC完成标志位
  10. #define ADC_START0x08//ADC开始控制位

  11. #define ADC_SPEEDLL0x00//540个时钟周期转换一次
  12. #define ADC_SPEEDL0x20//360个时钟周期转换一次
  13. #define ADC_SPEEDH0x40//180个时钟周期转换一次
  14. #define ADC_SPEEDHH0x60// 90个时钟周期转换一次

  15. #define ADC_CH10x01//选择通道1
  16. #define ADC_CH20x02//选择通道2
  17. #define ADC_CH30x03//选择通道3
  18. #define ADC_CH40x04//选择通道4

  19. //初始化ADC

  20. void init_ADC(void)
  21. {
  22. P1ASF= 0x1e; //P11-P14口作为模拟功能A/D使用
  23. ADC_RES= 0;//清除结果寄存器
  24. ADC_RESL= 0;
  25. PCON&= 0xdf;//ADCRES存放高8位ADC结果,ADCRESL[1:0]存放低2位结果
  26. ADC_CONTR = ADC_POWER|ADC_SPEEDLL|ADC_START|ADC_CH2;//启动转换,通道2
  27. delayms(1);//ADC上电延时

  28. EA= 1;//CPU开启总中断
  29. EADC = 1;//允许ADC中断
  30. }

  31. void main(void)
  32. {
  33. init_IO(); //初始化
  34. init_sym();

  35. init_uart();
  36. init_ADC();
  37. while(1)
  38. {
  39. while(!(ADC_CONTR & ADC_FLAG));//等待ADC完成
  40. ADC_CONTR &= !ADC_FLAG;//清除ADC中断
  41. sendData(ADC_RES);
  42. sendData(ADC_RESL);
  43. led_ye_on();
  44. ADC_RES= 0;//获取ADC结果后,清除结果寄存器
  45. ADC_RESL= 0;

  46. //AD转换结束后会自动停止转换,所以这里再次开启ADC
  47. //并且一定要重新开启ADC电源、设置ADC通道和ADC转换速率
  48. ADC_CONTR = ADC_POWER|ADC_SPEEDLL|ADC_START|ADC_CH2;//启动转换,通道2

  49. delayms(1000);
  50. }
  51. }
复制代码


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

使用道具 举报

沙发
ID:453015 发表于 2018-12-23 23:51 | 只看该作者
请问能分享完整的代码吗?谢谢
回复

使用道具 举报

板凳
ID:165291 发表于 2020-4-9 10:05 | 只看该作者
        P1ASF = 0x0B;这个是什么意思呢?
回复

使用道具 举报

地板
ID:990436 发表于 2021-12-10 11:57 | 只看该作者
timeabcd 发表于 2020-4-9 10:05
P1ASF = 0x0B;这个是什么意思呢?

定义P1.0 P1.1 P1.3口为ADC的输入通道
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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