单片机开发之ADC0808/9信号采集
一、题目
ADC0808信号采集
二、要求
1、画出实验的流程图
2、编写源程序并进行注释
3、记录实验过程
4、记录程序运行结果截图
三、过程及结果分析
利用LCD1602和AD0808实现简单的交流信号过零检测与频率分析。要求信号幅度变化时(满量程的5%—95%),不影响检测到结果。频率检测的结果通过LCD1602的第一行显示出来,信号过零时,能够通过P2.6输出一个脉冲宽度为5μs的脉冲信号。
1. 根据上述实验内容,在Proteus 环境下建立图1所示原理图,并将其保存为ADC0808_self.DSN 文件。
图1:实验电路图
2. 编写源程序,将其保存为ADC0808_self.c,运行Keil开发环境,建立工程ADC0808_self.uV2,CPU 为AT89C51,包含启动文件STARTUP.A51。
3. 将C 语言源程序ADC0808_self.c 加入工程ADC0808_self.uV2,并设置工程ADC0808_self.uV2 属性,将其晶振频率设置为12MHz,选择输出可执行文件,仿真方式为选择硬仿真,并选择其中的“PROTEUS VSM MONITOR 51 DRIVER”仿真器。
4.构造(Build)工程ADC0808_self.uV2。如果输入有误进行修改,直至构造正确,生成可执行程序ADC0808_self.hex 为止。为AT89C51 设置可执行程序ADC0808_self.hex。
5. 运行程序,观察计算结果,并验证其是否正确。改变RV1 的抽头位置,从而改变输入信号的幅值,观察计算结果是否正确。更改信号发射器的频率,再次验证其功能是否正确。(注意:因为是软仿真,所以信号采集的速度受到限制,因此所输入的交流信号频率也不能太高,可以在200Hz以内尝试)。
实验结果如下:
1)将电位器至于满量程的90%,此时信号的幅值就是最大值的90%
图2:电位器调整到满量程的90%
2)将电位器至于满量程的50%,此时信号的幅值为最大值的一半
图3:电位器调整到满量程的50%
3)电位器调整到满量程的10%,此时信号的幅值为最大值的10%
图4:电位器调整到满量程的10%
四、流程图
图5:实验流程图
LCD1602的控制方法按3.7节所示方法进行ADC0808的控制方法按3.8.1所示方法进行。这里主要是过零点的检测方法如何实现。不能采用判断所采集到的数据是否为 0 的方法来实现,因为你的采集时刻不一定能够严格对准过零时刻。但是,我们注意到在 0 点的两边信号的极性是发生变化的,我们可以利用这一特点来实现过零检测。正弦波每个周期有两个过零点,因此,1s 内过零次数除以 2 就是信号的频率。
因此,在程序中可以这样实现。当每次采集到一个新的数据之后都要看一下这个数据是正数还是负数。当这个数大于 128 时是正数,当它小于 128 时是负数。判断当前数据的正负极性和上一个数据的正负极性是否一致,如果不一致,则说明经过了一次过零点,将其记录入次数计数器。
ADC0808 的 CLK 仍然用定时器 T1 来实现,可以将其设置为 50kHz(硬件实现时可以更高,软件仿真再高将难以实现)。利用定时器 T0 实现 50ms 定时,并配合软件实现 1s 钟定时。采用 12M 晶振时,T0 采用方式 1,则处置应为(TH0=0x3C,TL0=0xB0)。
但是,由于中断处理函数需要一定的响应时间,因此这个参数只是理论计算结果,要根据实测情况稍作调整。 同样 T1 理论计算值和实际输出值可能也会有一定的差距,也要进行调整。
五、源代码
- 点赞
- 收藏
- 关注作者
评论(0)