好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

实验5 STC单片机ADC转换实验-V20170317.doc

6页
  • 卖家[上传人]:秋****
  • 文档编号:229374815
  • 上传时间:2021-12-25
  • 文档格式:DOC
  • 文档大小:32.50KB
  • / 6 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 1.实验目的学习STC12C5A单片机ADC知识;2.实验设备硬件:12号节点,串口线;软件:Keil u Vision4编译软件,STC下载软件STC_ISP;芯片手册:配套光盘\附件\芯片手册\STC单片机手册源码路径:hex路径:3.实验原理3.1 A/D相关寄存器介绍与A/D转换有关的寄存器如表3.1所示:表3.1 A/D相关寄存器P1ASF:P1口的模拟功能控制器STC12C5A16S2系列单片机的A/D转换口,在P1口(P1.7-P1.0),上电复位后P1口默认为弱上拉型I/O口,用户可以通过软件设置将8路中的任何一路设置为A/D转换,不需作为A/D使用的P1口可继续作为I/O口使用(建议只作为输入)需作为A/D使用的口需先将P1ASF特殊功能寄存器中的相应位置为‘1’,将相应的口设置为模拟功能P1ASF寄存器的定义如表3.2所示:表3.2 P1ASF寄存器定义ADC_CONTR:ADC控制寄存器该寄存器的描述如表3.3所示:表3.3 ADC_CONTR寄存器定义对ADC_CONTR寄存器的操作建议使用直接赋值语句,不要使用“与”和“或”语句ADC_POWER:?ADC电源控制位。

      0:关闭A/D转换器电源1:打开A/D转换器电源建议进入空闲模式时,将ADC电源关闭,即ADC_POWER?=0启动A/D转换前一定要确认A/D电源已打开,A/D转换结束后关闭A/D电源可降低功耗,也可不关闭初次打开内部A/D转换模拟电源,需适当延时,等内部模拟电源稳定后,再启动A/D转换建议启动A/D转换后,在A/D转换结束之前,不改变任何I/O口的状态,有利于高精度A/D?转换,若能将定时器/串行口/中断系统关闭更好SPEED1,SPEED0:模数转换器转换速度控制位,其描述如表3.4所示:表3.4 SPEED1、SPEED0描述ADC_FLAG:模数转换器转换结束标志位,当A/D转换完成后,ADC_FLAG=1,要由软件清0不管是A/D转换完成后由该位申请产生中断,还是由软件查询该标志位A/D转换是否结束,当A/D转换完成后,ADC_FLAG = 1,一定要软件清0ADC_START:模数转换器(ADC)转换启动控制位,设置为“1”时,开始转换,转换结束后为0CHS2/CHS?/CHS0:模拟输入通道选择,CHS2/CHS1/CH0描述如表3.5所示:图3.5 CHS2/CHS1/CH0定义ADC_RES、ADC_RESL:ADC结果寄存器。

      该寄存器用于存A/D转换结果,其定义如表3.6所示:表3.6 ADC_RES、ADC_RESL寄存器定义AUXR1寄存器的ADRJ位是A/D转换结果寄存器(ADC_RES,ADC_RESL)的数据格式调整控制位当ADRJ=0时,10位A/D转换结果的高8位存放在ADC_RES中,低2位存放在ADC_RESL的低2位中,如表3.7所示:表3.7 ADRJ=0时AD结果此时,如果用户需需取完整10位结果,按下面公式计算:如果用户只需要8位结果,按下面公式计算:式中,Vin为模拟输入通道输入电压,Vcc为单片机实际工作电压,用单片机工作电压作为模拟参考电压当ADRJ=1时,10位A/D转换结果的高2位存放在ADC_RES的低2位中,低8位存放在ADC_RESL中此时,如果用户需要完整10位结果,按下面公式计算:式中,Vin为模拟输入通道输入电压,Vcc为单片机实际工作电压,用单片机工作电压作为模拟参考电压IE:中断允许控制寄存器该寄存器的描述如表3.8所示:表3.8 IE寄存器定义EA:CPU的中断开放标志,EA=1,CPU开放中断,EA=0,CPU屏蔽所有的中断申请EA的作用是使中断允许形成多级控制。

      即各中断源首先受EA控制;其次还受各中断源自己的中断允许控制位控制EADC:A/D转换中断允许位EADC=1,允许A/D转换中断EADC=0,禁止A/D转换中断如果要允许A/D转换中断则需要将相应的控制位置1:1、将EADC置1,允许ADC中断,这是ADC中断的中断控制位2、将EA置1,打开单片机总中断控制位,此位不打开,也是无法产生ADC中断的A/D中断服务程序中要用软件清A/D中断请求标志位ADC_FLAG(也是A/D转换结束标志位)IPH、IP:中断优先级控制寄存器,该寄存器的定义如表3.9所示:表3.9 IPH、IP寄存器定义PADCH,PADC,A/D转换中断优先级控制位当PADCH=0且PADC=0时,A/D转换中断为最低优先级中断(优先级0)当PADCH=0且PADC=1时,A/D转换中断为较低优先级中断(优先级1)当PADCH=1且PADC=0时,A/D转换中断为较高优先级中断(优先级2)当PADCH=1且PADC=1时,A/D转换中断为最高优先级中断(优先级3)4.实验步骤4.1 编写实验源代码文件4.1.1 打开Keil集成开发环境,打开下的工程文件,编译源码,生成ADC.hex可执行文件,该可执行文件自动保存在目录下。

      注意:请根据该目录下ADC.hex文件的生成时间,判断该文件是否是自己刚刚编译完成的)4.1.2 将12号节点的开关S1拨打到左边,让STC单片机与DB9相连4.1.3 根据配套光盘\第三方应用软件\STC_ISP\STC-ISP软件使用说明书4.2 实验源代码解析ADC.c源代码 /*************************************************************** 晶振频率 :选取用RC 11.0592MHz* 文件名 :ADC.c* 功能说明 :STC12C5A16S2单片机的A/D转换演示实验* 变更记录 :2013.05.5* 变更内容 :新建造**************************************************************//************* 用户系统配置 **************//************* 以下宏定义用户请勿修改 **************/#include "reg51.H"#define uchar unsigned char#define uint unsigned int/****************特殊寄存器声明************************/sfr P1ASF = 0x9D; //12C5A60AD/S2系列模拟输入(AD或LVD)选择sfr ADC_CONTR = 0xBC; //带AD系列sfr ADC_RES = 0xBD; //带AD系列sfr ADC_RESL = 0xBE; //带AD系列#define ADC_OFF() ADC_CONTR = 0 //ADC转换关#define ADC_ON (1 << 7) //ADC转换开#define ADC_90T (3 << 5) //90个时钟周期转换一次#define ADC_180T (2 << 5) //180个时钟周期转换一次#define ADC_360T (1 << 5) //360个时钟周期转换一次#define ADC_540T 0 //540个时钟周期转换一次#define ADC_FLAG (1 << 4) //软件清0#define ADC_START (1 << 3) //开始ADC转换#define ADC_CH0 0 //P1_0作为AD转换通道#define ADC_CH1 1 //P1_1作为AD转换通道#define ADC_CH2 2 //P1_2作为AD转换通道#define ADC_CH3 3 //P1_3作为AD转换通道#define ADC_CH4 4 //P1_4作为AD转换通道#define ADC_CH5 5 //P1_5作为AD转换通道#define ADC_CH6 6 //P1_6作为AD转换通道#define ADC_CH7 7 //P1_7作为AD转换通道/************* 本地变量声明 **************/sbit P_TXD1 = P3^1;/************* 本地函数声明 **************/void Tx1Send(uchar dat);void PrintString(unsigned char code *puts);void delay_ms(unsigned char ms);uint adc10_start(uchar channel); //channel = 0~7/************************************************************** 函数名:main( void )* 输入:无* 输出:无* 功能描述:串口初始化参数为9600 8 N 1.* 值通过串口输出**************************************************************/void main(void){ uint j; P1ASF = (1 << ADC_CH0); //STC12C5A16S2的模拟输入(AD转换通道)选择 ADC_CONTR = ADC_360T | ADC_ON; while(1) { delay_ms(250); delay_ms(250); delay_ms(250); delay_ms(250); j = adc10_start(0); // P1_0 开启AD转换 Tx1Send(A); Tx1Send(D); Tx1Send(0); Tx1Send(=); Tx1Send(j/1000 + 0); Tx1Send(j%1000/100 + 0); Tx1Send(j%100/10 + 0); Tx1Send(j%10 + 0); Tx1Send(0x0d); Tx1Send(0x0a); }}/************************************************************** 函数名:adc10_start(uchar channel)* 输入:需要转换的ADC通道* 输出:无* 功能描述:串口初始化参数为9600 8 N 1.* 值通过串口输出**************************************************************/uint adc10_start(uchar channel) { uint adc; uchar i; ADC_RES = 0; //AD转换结果高位寄存器清零 ADC_RESL = 0; //AD转换结果低位寄存器清零 ADC_CONTR = (ADC_CONTR & 0xe0) | ADC_START | cha。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.