《第10章 ad转换10 stc15f2k60s2系列单片机的ad转换器 例题》由会员分享,可在线阅读,更多相关《第10章 ad转换10 stc15f2k60s2系列单片机的ad转换器 例题(5页珍藏版)》请在金锄头文库上搜索。
1、1 第 10 章STC15F2K60S2 单片机的 A/D 转换 例题 例 10 .l编程实现利用 STC15F2K60S2 单片机 ADC 通道 1 采集外部模拟电压信号,8 位精度,采用查询方式循环进行转换,并将转换结果保存于 30H 单元中,并送 P2 口 LED 灯显 示(低电平驱动) 。假设时钟频率为 18.432MHz。 解:取 8 位精度时可设置 ADRJ0直接使用转换结果寄存器 ADC_ RES 的值。选 择通道 1,则(CHS2CHS0)001B。按照 ADC 的编程要点进行初始化后,直接判断 ADC_FLAG 标志是否为 l?若为 l,则读出 ADC_ RES 寄存器的值;
2、若为 0,则继续查询。 汇编语语言参考程序如下: $INCLUDE(STC15F2K60S2. INC) ;包含 STC15F2K60S2 单片机寄存器定义文件,若无现成的 STC15F2K60S2. INC 文件, ;则可以用 “EQU”和“DATA”直接对 A/D 转换用到的新增特殊功能寄存器进行定义 ADC_DATAEQU30H;定义AD 转换结果保存单元 ORG0000H LJMPMAIN ORG0000H MAIN: MOVSP,#70H;设置堆栈 MOVP1ASF,02H;设置 Pl.1 为模拟量输入功能 MOVADC_CONTR,81H;打开 A /D 转换电源,设置输入通道 M
3、OVA, #20H LCALLDELAY;打开 A /D 转换电源后,延时 1 ms 即可 LOOP: MOVADC_ CONTR, #10001001B; 启动 A/D 转换 NOP;适当延时,确保设置有效 NOP NOP NOP WAIT_AD: MOVA,ADC_CONTR JNBACC.4,WAIT_AD;判断 A/D 转换是否完成 MOVADC_ CONTR, #81H;将 ADC_FLAG 清零 MOVA,ADC_RES;读取 AD 转换结果 2 MOVADC_DATA, A;保存 AD 转换结果 CPLA MOVP2,A;送 P2 口 LED 灯显示 LJMPLOOP;循环检测
4、DELA: PUSH02;将寄存器组 0 的 R2、R3、R4 入栈 PUSH03 PUSH04 MOVR4, A;取最外循环的循环次数 DELAY_LOOP0: MOVR3, #200 DELAY_LOOP1: MOVR2, #249 DELAY_LOOP: DJNZR2,DELAY_ LOOP DJNZR3,DELAY_LOOP1 DJNZR4,DELAY_LOOP0 POP04;恢复现场 POP03 POP02 RET END C51 语言参考程序如下: # include “ STC15F2K60S2. h“/包含 STC15F2K60S2 单片机寄存器定义文件 unsigned ch
5、ar data adc_data_at_ 0x30; /定义(保存 A/D 转换结果)绝对地址变量 void main(void) unsigned long i; unsigned char status; P1ASF = 0x02 ;/设置 Pl1 为模拟量输入功能 ADC _CONTR= 0x81;/打开A/D 转换电源,设置输入通道 for (i = 0;i 10000; i+ ); while(l) ADC_CONTR=0x89;/启动 A/D 转换 _NOP_(); _NOP_(); 3 _NOP_(); _NOP_(); status 0; while(status0)/等待 A
6、D 转换结束 statusADC _CONTR0x10; ADC _CONTR 0x81;/清 A/D 转换结束标志位 adc_data ADC_RES;/保存 AD 转换结果 P2 ADC_RES;/送 P2 口 LED 灯显示 例 10.2编程实现利用 STC15F2K60S2 单片机 ADC 通道 1 采集外部模拟电压信号, 10 位精度,采用中断方式进行转换,并将转换结果保存于 30H 和 31H 单元中,并送 P3 和 P2 口 LED 灯显示(低电平驱动) ,P3 口 LED 灯显示最高 2 位,P2 口 LED 灯显示低 8 位。 设时钟频率为 18.432MHz。 解:设置 A
7、DRJ1,转换结束后,ADC_ RES 的低 2 位为转换结果的最高 2 位,ADC_ RESL 为转换结果的低 8 位。 汇编语言参考程序如下: $INCLUDE(STC152K60S2. INC) ADC_DATAHEQU31H;定义 AD 转换结果高 2 位存储变量 ADC_DATALEQU30H;定义 AD 转换结果低 8 位存储变量 ORG0000H LJMPMAIN ORG002BH LJMPADC_ISR;ADC 中断矢量入口 ORG0050H MAIN: MOVSP,#70H;设置堆栈 MOVP1ASF,02H;设置 Pl.1 为模拟量输入功能 MOVADC_CONTR,81H
8、;打开 A /D 转换电源,设置输入通道 MOVA, #20H LCALLDELAY;开 AD 转换电源后要加适当延时,1ms 即可 ORLCLK_DIV,#20H;设置 A/D 转换结果存储格式(ADR 为 1) SETBEADC;开放 ADC 中断 SETBEA;开放 CPU 总中断 4 MOVADC_ CONTR,#10001001B; 启动 A/D 转换 SJMP;循环等待中断 ADC_ISR:;ADC 中断服务程序入口 MOVADC_CONTR,81H ;将 ADC_F LAG 清零 MOVA,ADC_RES;读取 AD 转换结果高 2 位 ANLA,#03H;屏蔽高 6 位 MOV
9、ADC_DATAH,A;保存 AD 转换结果高 2 位 CPLA MOVP3,A;高 2 位送 P3 口 LED 灯显示 MOVA, ADC_RESL;读取 AD 转换结果低 8 位 MOVADC_DATAL,A;保存 AD 转换结果的低 8 位 CPLA MOVP3,A;低 8 位送 P2 口 LED 灯显示 MOVADC_CONTR,89H;重新启动 A/D 转换 RETI DELA: PUSH02;将寄存器组 0 的 R2、R3、R4 入栈 PUSH03 PUSH04 MOVR4,A;取最外循环的循环次数 DELAY_LOOP0: MOVR3, #200 DELAY_LOOP1: MOV
10、R2, #249 DELAY_LOOP: DJNZR2, DELAY_ LOOP DJNZR3,DELAY_LOOP1 DJNZR4,DELAY_LOOP0 POP04;恢复现场 POP03 POP02 RET END C51 语言参考程序如下: # include “STC152K60S2. h“/包含 STC15F2K60S2 单片机寄存器定义文件 unsigned char data adc_datah_at_ 0x31; /定义(保存 A/D 转换结果)绝对地址变量 unsigned char data adc_datal_at_ 0x30; /定义(保存 A/D 转换结果)绝对地址变
11、量 void main(void) 5 unsignedlongi; unsignedcharstatus; P1ASF = 0x02 ;/设置 Pl1 为模拟量输入功能 ADC_CONTR = 0x81;/打开A/D 转换电源,设置输入通道 for (i = 0;i 10000; i+ );/适当延时 CLK_DIV| 0x20;/(ADRJ)1,设置 A/D 转换结果的存储格式 ADC_CONTR 0x89;/启动 A/D 转换 EADC 1; EA 1; while(1) ; /*-ADC 中断服务子函数-*/ void ADC_ISR (void) interrupt 5 ADC_CONTR 0x81;/ 将 ADC_FLAG 清零 adc_datah ADC_RES0x03;/保存 AD 转换结果高 2 位 P3 adc_datah;/转换结果高 2 位送 P3 口 LED 灯显示 adc_datal ADC_ RESL;/保存 AD 转换结果低 8 位 P2 adc_datal;/转换结果低 8 位送 P3 口 LED 灯显示 ADC_CONTR 0x89;/重新启动 AD 转换