1、1电子科技大学中山学院学生实验报告院别:电子信息学院 课程名称:微处理器实验班级 无线技术 14 姓名 学号实验名称 A/D 与 D/A 转换实验 实验时间 2016 年 11 月 25 日成绩 教师签名 批改时间报 告 内 容一、实验目的和任务1、熟悉 A/D 转换和 D/A 转换的基本原理。2、掌握单片机内部 A/D 转换器的特性及程序控制方法。 3、掌握利用 PWM 技术实现 D/A 转换的原理及程序控制方法。二、实验原理简介A/D 转换器(ADC)的作用是实现模拟量到数字量的线性转换,常用 A/D 转换器类型包括双积分型和逐次逼近型。双积分型 A/D 转换器的优点是转换精度高,抗干扰性
2、能好,缺点是转换速度慢。逐次逼近型 A/D 转换器速度较快,精度略低于双积分型。STC12C5A60S2 单片机内部自带 8 路 10 位逐次逼近型 A/D 转换器,可在程序控制下,将ADC0ADC7(与 P1 口引脚复用)中任何一路模拟输入转换为等比例的 10 位数字量。为便于程序控制,STC12C5A60S2 新增多个与 A/D 转换器相关的特殊功能寄存器(SFR) ,常用寄存器的功能及各位含义如下:P1ASF:模拟功能控制寄存器(字节地址为 9DH)P1ASF 的 Di 位设为 0 时,P1.i 位用作普通 I/O 口;P1ASF 的 Di 位设为 1 时,P1.i 位用作 ADCi 模
3、拟输入引脚。 ADC_CONTR:ADC 控制寄存器(字节地址为 BCH)ADC_POWER 用于 A/D 转换器电源控制,设为 0 时,关闭 A/D 转换器电源,设为 1 时,开启 A/D转换器电源。开启 A/D 转换器电源;SPEED1、SPEED0 用于 A/D 转换速度设置,设为 00/01/10/11 时,A/D 转换分别需要540/360/180/90 个时钟周期;ADC_FLAG 为转换结束标志位,A/D 转换完成后 ADC_FLAG 自动置 1(需通过程序清 0) ;ADC_START 用于 A/D 转换启动控制,设为 1 时,开始 A/D 转换(转换结束后 ADC_START
4、 自动清 0) ;CHS2、CHS1、CHS0 用于模拟输入通道选择,其 8 种组合分别对应选择 ADC0ADC7 通道。ADC_RES 和 ADC_RESL:A/D 转换结果寄存器(字节地址分别为 BDH 和 BEH)2注:STC12C5A60S2 新增 AUXR1 寄存器中 ADRJ 位由复位时默认的 0 改为 1,则 ADC_RES 和ADC_RESL 将改为分别存放转换结果的高 2 位和低 8 位。此外,STC12C5A60S2 的 A/D 转换器也支持中断控制。STC12C5A60S2 中 A/D 转换器的控制流程与传统 ADC0809 芯片类似:1)设置 P1ASF 寄存器,指定P
5、1 口某口线用作 ADC 输入引脚;2)设置 ADC_CONTR 寄存器,开启 A/D 转换器电源,选择转换速度及通道,并启动转换;3)查询 ADC_CONTR 寄存器的 ADC_FLAG 位,判断转换是否结束;4)ADC_FLAG 位变为 1 时,转换结束,读取 ADC_RES 和 ADC_RESL 寄存器,组成 10 位 A/D 转换结果。图 3.8.1 为 ZSC-1 实验箱的 STC12C5A60S2 的 A/D 转换实验电路。电位器 W101 产生 05V 模拟电压,通过 ADC1 引脚输入单片机进行 A/D 转换,转换结果可通过发光管 L101L108 以二进制或其它形式显示,也可
6、用于控制蜂鸣器 BZ1 的发声频率。图 3.8.1 A/D 转换实验电路D/A 转换器(DAC)的作用是实现数字量到模拟量的线性转换。为实现 D/A 转换,除了在单片机外部配置专用 D/A 转换器芯片外,还可使用成本较低的 PWM 加低通滤波的方法,其依据的主要原理是:PWM 信号的平均电压正比于信号的占空比。本实验即使用该方法实现 D/A 转换,电路如图 3.8.2 所示。单片机在程序控制下,以一定的时间间隔,通过 P1.4 口线动态输出不同占空比的 PWM 信号,经电阻、电容组成的低通滤波器滤波后,即可在排针 J101 的 2 脚得到各时间点幅值正比于对应占空比的连续模拟信号。对于普通 8
7、0C51 单片机,一般是通过程序控制通用定时/计数器并配合中断处理,来产生所需的PWM 信号。STC12C5A60S2 除具有普通 80C51 的两个通用定时/计数器外,还增加了具有多种工作模式的两路可编程计数器阵列(PCA)模块,能够非常方便地产生两路频率相同而占空比独立的 PWM 信号,其中,PWM0 通过 P1.3(也可切换到 P4.2)输出,PWM1 通过 P1.4(也可切换到 P4.3)输出。3图 3.8.2 D/A 转换实验电路STC12C5A60S2 新增多个与 PCA 相关的 SFR,其中,本实验涉及的 PWM1 输出相关的 SFR 包括:CCON:PCA 控制寄存器(字节地址
8、为 D8H)其中,CR 为 PCA 运行控制位,设为 0 时,关闭 PCA,设为 1 时,启动 PCA。CMOD:PCA 工作模式寄存器(字节地址为 D9H)其中,CPS2、CPS1、CPS0 、用于 PCA 时钟源选择,例如,100 组合时以系统时钟(其频率为晶振频率)为 PCA 时钟,000 组合时以系统时钟的 12 分频为 PCA 时钟。 CCAPM1:PCA 模块 1 的模式寄存器(字节地址为 DBH)其中,为使 PCA 模块 1 工作在 8 位 PWM 无中断模式,应将 ECOM1 和 PWM1 两位设为 1,,其它位设为 0。此外,CCAP1H(字节地址为 FBH)和 CCAP1L
9、(字节地址为 EBH)分别是 PCA 模块 1 捕捉/比较寄存器的高 8 位和低 8 位。在 8 位 PWM 模式下,当 PCA 计数器低 8 位(CL)的值小于 CCAP1L 时,PWM1 引脚输出为低,大于或等于 CCAP1L 时,PWM1 引脚输出为高;另外,当 CL 的值由 FFH 加到 00H(溢出)时,CCAP1H 的当前值自动加载到 CCAP1L 中,因此,程序只需对 CCAP1H 进行设定,即可在 PWM1 引脚稳定输出相应占空比的 PWM 信号。三、实验设备1、PC 机一台(已安装 Keil uVision、STC_ISP 等软件) ; 2、ZSC-1 单片机实验箱一台。四、
10、实验内容和步骤实验步骤: 在 Keil 中编写源程序。 在 Keil 中创建工程,加入源程序文件,设置选项,进行汇编/编译、连接、转换处理,生成HEX 格式的单片机程序文件。 用串行电缆连接实验箱和 PC 机各自的串行通信口,并运行 PC 机上的 STC_ISP 程序,进行单片机程序下载(注意 MCU1 要先断电再上电) 。 运行单片机程序,调节 W101 电位器,观察发光管显示的变化。实验内容:(一)A/D(Mcu1 内部 ADC)1、设计程序,以 0.2 秒为间隔,采集 ADC(P1.1)脚的输入电压,将数字量显示在 LED 上,并通过串口发送出去。程序代码如下:#include#incl
11、udetypedef unsigned char uint8;sfr P1ASF=0x9D;4sfr ADC_CONTR=0xBC;sfr ADC_RES=0xBD;uint8 ADC(uint8 ch);void UartInit();void UartSendByte(uint8 x);void Delay(int ms);void main()uint8 N;UartInit();while(1)N=ADC(1) ;P0=N;UartSendByte(N);Delay(200);uint8 ADC(uint8 ch) P1ASF=1#includetypedef unsigned cha
12、r uint8;sfr P1ASF=0x9D;sfr ADC_CONTR=0xBC;sfr ADC_RES=0xBD;uint8 ADC(uint8 ch);void UartInit();void UartSendByte(uint8 x);void Delay(int ms);void main() uint8 N;UartInit();while(1)N=ADC(1) ;/P0=N;P0=(1typedef unsigned char uint8;typedef unsigned int uint16;sfr CMOD=0xD9;sfr CCAPM1=0xDB;sbit CR=0xDE;
13、sfr CCAP1H=0xFB;sbit bo=P11;7void Delay(uint16 ms);void PwmInit() CMOD=0x08;CCAPM1=0x42;CR=1;void PwmOut(uint8 Duty) CCAP1H=255-Duty;void main()int i,j;PwmInit();/*while(1) PwmOut(30);Delay(800);PwmOut(120);Delay(800);*/while(1)for(i=1;itypedef unsigned char uint8;typedef unsigned int uint16;sfr CMO
14、D=0xD9;sfr CCAPM1=0xDB;sbit CR=0xDE;sfr CCAP1H=0xFB;sbit bo=P11;uint8 code SinTable=127,152,176,199,218,234,245,252,254,251,242,230,213,192,170,145,120, 95, 71, 49, 31, 16, 6, 1,0, 5, 15, 29, 45, 68, 92,116;void Delay(uint16 ms);void PwmInit() CMOD=0x08;CCAPM1=0x42;CR=1;void PwmOut(uint8 Duty) CCAP1
15、H=255-Duty;void main()int i,j;PwmInit();/*while(1) PwmOut(30);9Delay(800);PwmOut(120);Delay(800);*/while(1)for(i=0;i32;i+)/PwmOut(i);PwmOut(SinTablei);j=100;while(-j);void Delay(uint16 ms) int i,j;for(i=0;ims;i+)for(j=0;j100;j+);仿真波形如右图所示:五、实验结果与心得1. 本次实验在编写音乐代码是比较繁琐,但是最后如果编写成功还是很有成就感。2. 通过本实验,理解和掌握了信号频率产生的应用。3. 由于本实验程序是使用 C 语言编写的,所以在保存文件时后缀应为.C,不然文件会出错。4. 掌握了蜂鸣器件的驱动和应用,熟悉按键文件分程序设计。