
第十六次课(共2学时)一、授课题目:STC15F2K60S2的A/D转换二、教学目标和任务:1.掌握模拟量和数字量之间的相互转换关系;2.掌握STC15F2K60S2中有关模数转换的SFR的使用方法;3.编写程序实现模拟电压值的显示。三、教学重难点:重点:模拟量和数字量之间的相互转换关系:有关模数转换的SFR的使用方法;编写程序实现模拟电压值的显示。难点:编写程序实现模拟电压值的显示。四、授课过程:回顾:STC15F2K60S2单片机定时/计数器的中断编程方法和查询编程方法、方波的实现、电子钟和秒表的设计。0.引入AD转换(模数转换):将模拟量转化为数字量的过程。计算机可以处理的是数字量,而传感器测得的电压等量为模拟量。需要进行转换才可以显示处理。京模拟949℃数字电信号信号温度93.6%湿度08:30TIME图1模数转换应用示意图1
1 第十六次课(共 2 学时) 一、授课题目:STC15F2K60S2 的 A/D 转换 二、教学目标和任务: 1. 掌握模拟量和数字量之间的相互转换关系; 2. 掌握 STC15F2K60S2 中有关模数转换的 SFR 的使用方 法; 3. 编写程序实现模拟电压值的显示。 三、教学重难点: 重点:模拟量和数字量之间的相互转换关系;有关模数转 换的 SFR 的使用方法;编写程序实现模拟电压值的显示。 难点:编写程序实现模拟电压值的显示。 四、授课过程: 回顾:STC15F2K60S2 单片机定时/计数器的中断编程方法 和查询编程方法、方波的实现、电子钟和秒表的设计。 0.引入 AD 转换(模数转换):将模拟量转化为数字量的过程。计 算机可以处理的是数字量,而传感器测得的电压等量为模拟量。 需要进行转换才可以显示处理。 图 1 模数转换应用示意图

1.模数转换中的数值关系例如:假设某传感器输出电压在0~5V之间,如何将它的输出值其化为10位二进制数?10位代表转换精度,假设参考电压为5V。10位有1024个数码,可将5V细分成1024等分。10位二进制数每增大一个,电压增大5/1024V。精度为5/1024V。10位二进制数为B10时,电压大小为(B10*5V)/1024OV00000000001*5/1024V000000000100000000102*5/1024VB10B10*5/1024当输入电压为x时,B10=x*1024/5,当输出的二进制数为B10时,对应的输入电压为B10*1024/5。例题1:思考:(1)当模拟电压为3V时,转换出来的二进制数为?(2)当转换出来的二进制数为0101010101时,对应的输入电压为?答:(3/5)*1024=(1001100110)B(0101010101)B=341U=314/1024*5V=1.665eV2.STC15F2K60S2的模数转换传统的51单片机的AD转换需要通过外接芯片完成,而STC15F2K60S2具有8个10位高速输入型模数转换器。8个通道为P1.0~P1.7,转换信号为电压。模数转换一般分为:2
2 1. 模数转换中的数值关系 例如:假设某传感器输出电压在 0~5V 之间,如何将它的 输出值其化为 10 位二进制数? 10 位代表转换精度,假设参考电压为 5V。10 位有 1024 个 数码,可将 5V 细分成 1024 等分。10 位二进制数每增大一个, 电压增大 5/1024V。精度为 5/1024V。10 位二进制数为 B10 时, 电压大小为(B10*5V)/1024 0000 0000 00 0V 0000 0000 01 1*5/1024V 0000 0000 10 2*5/1024V B10 B10*5/1024 当输入电压为 x 时,B10= x*1024/5,当输出的二进制数 为 B10 时,对应的输入电压为 B10*1024/5。 例题 1:思考: (1)当模拟电压为 3V 时,转换出来的二进制数为? (2)当转换出来的二进制数为 0101010101 时,对应的输 入电压为? 答:(3/5)*1024=(10 0110 0110)B (0101010101) B=341 U=314/1024*5V=1.665eV 2. STC15F2K60S2 的模数转换 传统的 51 单片机的 AD 转换需要通过外接芯片完成,而 STC15F2K60S2 具有 8 个 10 位高速输入型模数转换器。8 个通 道为 P1.0~P1.7,转换信号为电压。 模数转换一般分为:

双积分型:速度最慢,需要几百毫秒。逐次逼近型:速度较快,需要几十微秒。并行比较型:速度最快,几十纳秒。STC15F2K60S2用的是逐次比较法,电路如图2所示。转换过程为过程为:先将结果B10最高位置1,对比(B10*5V)/1024值和电压值的大小。若电压大说明,最高位为1,若电压小说明最高位为0,再将次高位值1,依次往后比出每一位。VNOVRERD/A转换器VINOD7比较D6锁存缓存器D5D4D3STARTOD2空牛D1逻辑EOCDON位奇存器OOE图2逐次逼近法原理图3.STC15F2K60S2有关模数转换的SFR的使用方法控制AD转换的寄存器P1ASF(9DH):B5B4B3B7B6B2B1BOP17ASFP16ASFP15ASFP14ASFP13ASFP12ASFPIIASFPIOASF控制P1对应位是否切换到了ADC通道,没有切换的位可作为普通1/0口使用。例题2:如何打开0.2.4.6引脚作为ADC转换。答:P1ASF=0x55:3
3 双积分型:速度最慢,需要几百毫秒。 逐次逼近型:速度较快,需要几十微秒。 并行比较型:速度最快,几十纳秒。 STC15F2K60S2 用的是逐次比较法,电路如图 2 所示。转 换过程为 过程为:先将结果 B10 最高位置 1 ,对比 (B10*5V)/1024 值和电压值的大小。若电压大说明,最高位为 1,若电压小说明最高位为 0,再将次高位值 1,依次往后比出 每一位。 图 2 逐次逼近法原理图 3. STC15F2K60S2 有关模数转换的 SFR 的使用方法 控制 AD 转换的寄存器 P1ASF(9DH): B7 B6 B5 B4 B3 B2 B1 B0 P17ASF P16ASF P15ASF P14ASF P13ASF P12ASF P11ASF P10ASF 控制 P1 对应位是否切换到了 ADC 通道,没有切换的位可 作为普通 I/O 口使用。 例题 2:如何打开 0.2.4.6 引脚作为 ADC 转换。 答:P1ASF=0x55;

控制AD转换的寄存器ADC_CONTR(BCH):B5B7B6B4B3B2BOADC_POWERSPEED1SPEEDOADC_FLAGADC_STRATCHS1CHS1CHSOADCPOWER:ADC电源控制位。ADC_POWER=O,关闭ADC电源,ADCPOWER=1,打开ADC电源。启动A/D转换前一定要确认ADC电源已经打开,初次打开ADC电源需要适当时延(1mS),等ADC电路稳定后在启动A/D转换。模拟通道选择,芯片一次只能做一个通道的转换。切换通道需要20~200微秒延时。CH2、CH1、CHO:指示目前正在进行模拟转换的是哪个通道。000 P10011 P13110P16001 P11100 P14111 P17010 P12101P15例题3:打开模拟转换电源并打开通道P11程序为?假设SPEEDOSPEED1和ADCFLAG均为OPLASF=0x02;ADC_CONTR=0x81;ADCSTART:A/D转换启动位,ADCSTART=1,开始转换,ADC START=O不转换。SPEEDI、SPEEDOADC转换速度控制位。ADCFLAG:ADC转换完成后将这一位置1,检测到这一位为1,自动调用中断函数。4.A/D转换结果可以是8位结果,也可以是十位的。默认十位结果。4
4 控制 AD 转换的寄存器 ADC_CONTR (BCH): B7 B6 B5 B4 B3 B2 B1 B0 ADC_POWER SPEED1 SPEED0 ADC_FLAG ADC_STRAT CHS1 CHS1 CHS0 ADC_POWER: ADC 电源控制位。ADC_POWER=0,关闭 ADC 电 源,ADC_POWER=1,打开 ADC 电源。 启动 A/D 转换前一定要确认 ADC 电源已经打开,初次打开 ADC 电源需要适当时延(1ms),等 ADC 电路稳定后在启动 A/D 转换。 模拟通道选择,芯片一次只能做一个通道的转换。切换通 道需要 20~200 微秒延时。CH2、CH1、CH0:指示目前正在进行 模拟转换的是哪个通道。 000 P10 011 P13 110 P16 001 P11 100 P14 111 P17 010 P12 101 P15 例题 3:打开模拟转换电源并打开通道 P11 程序为?假设 SPEED0 SPEED1 和 ADC_FLAG 均为 0. PLASF=0x02; ADC_CONTR=0x81; ADC_START: A/D 转换启动位,ADC_START=1,开始转换, ADC_START=0 不转换。 SPEED1、SPEED0 ADC 转换速度控制位。 ADC_FLAG:ADC 转换完成后将这一位置 1,检测到这一位 为 1,自动调用中断函数。 4. A/D 转换结果 可以是 8 位结果,也可以是十位的。默认十位结果

十位的结果需要两个特殊功能寄存器来保存:ADCRES存放高位,ADCRESL存放低位。用CLKDIV.5(ADRJ)可以选择存储格式:CLKDIV.5=O时,ADC_RES和ADC_RESL低两位。Vin=(ADCRES[7:0],ADC_RESL[1:0])2×Vcc/1024CLKDIV.5=1时,ADCRES低两位和ADCRESL。Vin=(ADCRES[1:0],ADCRESL[7:0])2XVcc/1024对照图3将整个模数转换电路工作过程再给学生复习一遍,使学生务必掌握。接着通过例题4为学生讲解模数转换的应用。ADC_CONTRADC_POWERSPEEDISPEEDOADCFLAGADCSTARTCHS2CHSICHSO模拟输入信号通道选择A/D转换结果寄存器:开关CHS2/CHS1/CHSOADCRESandADCRESLADC7/P1.7.ADC6/P1.6ADC5/P1.5ADC4/P1.4速次比较ADC3/P1.3寄存器ADC2/P1.2比较器ADC1/P1.1ADCO/P1.0功能切换寄存器P1ASF10-bit DAC图3STC15F2K60S2的内置模数转换功能例题4:模数转换电路如图4所示,请编写程序实现将J10处电压实时显示。以小数点后五位小数为例。分析:电压通过电位器在0~5V之间变化,我们将该电压接在P1.1通道,通过模数转换电路将电位器输出的模拟电压转换成数字电压,再换算成数字量进行显示即可。5
5 十位的结果需要两个特殊功能寄存器来保存: ADC_RES 存放高位,ADC_RESL 存放低位。 用 CLK_DIV.5(ADRJ)可以选择存储格式: CLK_DIV.5=0 时,ADC_RES 和 ADC_RESL 低两位。 Vin=(ADC_RES[7:0],ADC_RESL[1:0])2×Vcc/1024 CLK_DIV.5=1 时,ADC_RES 低两位和 ADC_RESL。 Vin=(ADC_RES[1:0],ADC_RESL[7:0])2×Vcc/1024 对照图 3 将整个模数转换电路工作过程再给学生复习一 遍,使学生务必掌握。接着通过例题 4 为学生讲解模数转换的 应用。 图 3 STC15F2K60S2 的内置模数转换功能 例题 4:模数转换电路如图 4 所示,请编写程序实现将 J10 处电压实时显示。以小数点后五位小数为例。 分析:电压通过电位器在 0~5V 之间变化,我们将该电压 接在 P1.1 通道,通过模数转换电路将电位器输出的模拟电压 转换成数字电压,再换算成数字量进行显示即可

RP1UIJ11IK*8STC1SF2K60SPIPLOVCCPL.IPO.0(AD0)P1.2PO.I(ADI)PL3PO.2(AD2)P14PO.3(AD3)PISP0.4(AD4)PL6PO.S(ADS)P1.7P0.6(AD6)RSTPO.AD7)P3PORXDMWEP3.I(TXD)P32PSENNP:P2.7A15P2.6(A14)P3.4(TO)P3.S(TIP2.5(A13)P3.GWRP2.4(A12)4P3.7RO)P2.3A11XTAL2P2.2(A10)P2.1(A9)XTALI2GNDP2.0(A8)图4模数转换电路图#include"stc15f2k60s2.h"#include#define uchar unsigned char#define uint unsigned intuchar datah,datal; float dataf;uint dataint/存数值uchar num[5];sbit duanx-P2°6:sbit weix=P2'7:uchar codeseg[={0x3f,0x06,Ox5b,Ox4f,0x66,Ox6d,Ox7d,Ox07,0x7f,0x6f) :uchar codewei[)=(Oxf7,Oxfb,Oxfd,Oxfe,Ox7f,Oxbf,Oxdf,Oxef,0, 0) ;void numpro()://数值处理//延时函数void Delay2ms()://显示函数void displayO:void mainO6
6 图 4 模数转换电路图 #include”stc15f2k60s2.h” #include #define uchar unsigned char #define uint unsigned int uchar datah,datal; float dataf;uint dataint uchar num[5]; //存数值 sbit duanx=P2^6; sbit weix=P2^7; uchar code seg[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,0x7f,0x6f}; uchar code wei[]={0xf7,0xfb,0xfd,0xfe,0x7f,0xbf, 0xdf,0xef,0,0}; void numpro(); //数值处理 void Delay2ms(); //延时函数 void display(); //显示函数 void main()

1uint i;P1ASF=0x02://打开通道P1.0的模数转换功能ADCCONTR=Ox81://打开模数转换电压for(i=0:i<10000:i++)://等待启动CLKDIV|=0x20://设置数据存储格式ADCCONTR=Ox89://开启模数转换EA=1:EADC=1://打开模数转换中断while(1)(numproO:displayO:)1voidint_ADC(void)interrupt5//中断函数1ADCCONTR=Ox81://暂停模数转换datah=ADC RES&Ox03:datal=ADC RESL:dataf=(datah*256+datal)*5.0/1024.0://计算电压值ADCCONTR=Ox89://再次开启模数转换,实现实时显示voidnumpro(//小数处理函数1dataint=dataf*10000;num[0]=dataint%10;num[1]=dataint/10%10;7
7 { uint i; P1ASF=0x02; //打开通道 P1.0 的模数转换功能 ADC_CONTR=0x81; //打开模数转换电压 for(i=0;i<10000;i++); //等待启动 CLK_DIV|=0x20; //设置数据存储格式 ADC_CONTR=0x89; //开启模数转换 EA=1;EADC=1; //打开模数转换中断 while(1) {numpro();display();} } void int_ADC(void) interrupt 5//中断函数 { ADC_CONTR=0x81; //暂停模数转换 datah=ADC_RES&0x03; datal=ADC_RESL; dataf=(datah*256+datal)*5.0/1024.0; //计算电压值 ADC_CONTR=0x89; //再次开启模数转换,实现实时显示 } void numpro()//小数处理函数 { dataint=dataf*10000; num[0]=dataint%10; num[1]=dataint/10%10;

num[2]=dataint/100%10:num[3]=dataint/1000%10;num[4]=dataint/10000;1voiddisplay(//小数显示函数1uchar i;for(i=0;i<5;i++)( if (i==4){P0-wei[i];weix=l;weix=0:P0=seg[num[i]]|0x80;duanx=1;duanx=0;Delay2ms (:)else(PO=wei[i];weix=l;weix=0;PO=seg[num[i]];duanx=l;duanx=0;Delay2ms (;1)1思考:1)换成通道4,如何编程?2)换成其他通道呢?3)如果要保留小数点后3位怎么编程?4)如果要保留小数点后5位又该怎么办?五、作业219页1.1~1.72.1~2.6六、参考文献8
8 num[2]=dataint/100%10; num[3]=dataint/1000%10; num[4]=dataint/10000; } void display()//小数显示函数 { uchar i; for(i=0;i<5;i++) { if(i==4) {P0=wei[i];weix=1;weix=0; P0=seg[num[i]]|0x80;duanx=1;duanx=0; Delay2ms();} else {P0=wei[i];weix=1;weix=0; P0=seg[num[i]];duanx=1;duanx=0; Delay2ms();}} } 思考: 1) 换成通道 4,如何编程? 2) 换成其他通道呢? 3) 如果要保留小数点后 3 位怎么编程? 4) 如果要保留小数点后 5 位又该怎么办? 五、作业 219 页 1.1~1.7 2.1~2.6 六、参考文献

1.丁向荣编,单片机微机原理与接口技术(第2版),北京:电子工业出版社,20182.张毅刚编,单片机原理及应用:C51编程+Proteus仿真(第2版),北京:高等教育出版社,20163.丁元杰编,单片微机原理及应用(第三版),北京:机械工业出版社,20114.郭文川编,MCS-51单片机原理接口及应用,北京:电子工业出版社,20135.周航慈编,单片机应用程序设计技术(修订版),北京:北京航天航空大学出版社,20026.严洁编,单片机原理及其接口技术,北京,机械工业出版社,2010.七、课后记1.本节课介绍模数转换硬件电路和编程方式,15系列芯片的模数转换为内置设计,是在89系列芯片上的重要改进,为学生们强调这一点,增强学生们对国产芯片的信心。2.模数实现电路需要详细介绍,以便同学们理解模数编程方法。3.将编程语句总结为固定套路,方便同学们使用。4.通过分组讨论作答,加深理解,巩固知识。9
9 1. 丁向荣编,单片机微机原理与接口技术(第 2 版),北京:电子 工业出版社,2018. 2. 张毅刚编, 单片机原理及应用:C51编程+Proteus仿真(第2版), 北京:高等教育出版社,2016. 3. 丁元杰编,单片微机原理及应用(第三版),北京:机械工业出 版社,2011. 4. 郭文川编,MCS-51 单片机原理接口及应用,北京:电子工业出 版社,2013. 5. 周航慈编, 单片机应用程序设计技术(修订版),北京:北京航 天航空大学出版社,2002. 6. 严洁编, 单片机原理及其接口技术,北京,机械工业出版社, 2010. 七、课后记 1.本节课介绍模数转换硬件电路和编程方式,15 系列芯 片的模数转换为内置设计,是在 89 系列芯片上的重要改进, 为学生们强调这一点,增强学生们对国产芯片的信心。 2.模数实现电路需要详细介绍,以便同学们理解模数编程 方法。 3.将编程语句总结为固定套路,方便同学们使用。 4.通过分组讨论作答,加深理解,巩固知识