本帖最后由 夜色星空 于 2017-2-9 19:17 编辑
(声明:本人写的帖子一般都会采用知识屏蔽,尽量将最基本的东西表达出来,而不去牵涉一些过于复杂的东西,所以会有一些缺漏,欢迎回帖更正)
因为数字电路与模拟电路的差异
以及一般电路都会牵涉到模电与数电
所以,如何将模数电进行转化,搭起沟通的桥梁,便成了不得不解决的问题
也就是现在的AD转换
它将模拟信号,变成了数字信号(AD)
或将数字信号变成模拟信号(DA)
我们单片机上的ADC其实是AD转换,也就是模拟信号转为数字信号
具体分为4步
然后将其变成2进制编码存储在相应寄存器中
如图
以我们板子测电压为例
当我们使用ADC在P1^0引脚时(引脚可调,但电路图中使用P1^0引脚接滑动变阻器)
调节滑动变阻器,引脚电压发生变化
通俗的看待这件事情
就是ADC将0~5V电压分成2^8份(取8位精度时,如果是10位则为2^10)
每份相当于5/2^8V电压
进行一次AD转换,单片机将自动测量现在的P1^0脚电压为几份
并将分数存储在特定寄存器中(也就是上图两个寄存器)
我们只需要读取寄存器的值就可以知道现在P1^0脚的电压有多大
如图
那么,首先,我们要做的是将ADC的状态调整好
先是将P1^0引脚设为ADC取值引脚
如图
还有一个通道选择(不知道二者有什么区别)
此时,ADC的引脚坐落完毕
下面该设置转换时的一些参数了
1.上电
2.转换速度控制
3.设置转换后的数据存储方式
(PS:我们这里为简化代码,所以只使用8位ADRJ=0存储方式)
4.转换完成后,提醒CPU读取数据,设置中断
中断标号如图(interrupt 5)
将上述寄存器设置好后
便可开始转换
但需要注意(如果要读取ADC_CONTR寄存器,加延时)
汇编翻译过来应该是(笔者也是正在看)
[mw_shl_code=c,true]#include <intrins.h>
void STAR()
{
ADC_CONTR=&DATA;//搜了一下说是立即数,感觉像是常量,就先这么写吧
_nop_();//延时一个机器周期
_nop_();
_nop_();
_nop_();
A=ADC_CONTR;
}[/mw_shl_code]
至此,就可以启动ADC转换了
也就是ADC_CONTR|=0X80;
但技术手册不建议用此方法(然而此寄存器貌似不能位寻址 )
然后,只需要读出特定寄存器的值就可以了
(程序不难,就不在此放了,丢一个HEX,可以去玩一玩)
(再附一个: 连接仅供参考思路,毕竟二者寄存器地址都不一样)
|