PIC16F877A单片机 (ADC)

发布者:zukeq2009最新更新时间:2022-01-29 来源: eefocus关键字:PIC16F877A  单片机  ADC 手机看文章 扫描二维码
随时随地手机看文章

1 基本原理

1.1 ADC基本原理

根据微芯的ADC手册,ADC可以分为单端ADC和差分ADC。


1.1.1 单端ADC

单端ADC的输出范围是[0,2^n-1]。

在这里插入图片描述

根据标黄的这句话,就可以得知,如果电压高于参考电压,ADC的输出结果仍然为全1,如果电压低于0V,ADC的输出结果为全零。


1.1.2 差分ADC

差分ADC的输出范围一般为[-2 ^ (n-1) , 2^(n-1)-1]。编码一般采用补码,最高位表示符号位。


视频教程链接


1.2 PIC16F877A单片机的ADC模式

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2 实现原码


/*---------------------------------函数功能:-------------------------------------

 将模拟输入变成数字输出AD的转换以及AD转换完成后产生一个AD中断

 RA0为模拟电压输入,RD口为AD量化输出

 

 编程思路:参考手册的P131  To do an A/D Conversion, follow these steps

----------------------------------------------------------------------------*/



#include// 调用PIC16f87XA单片机的头文件


//#include"delay.h"//调用延时子函数的头文件




__CONFIG(0xFF32);//芯片配置字,看门狗关,上电延时开,掉电检测关,低压编程关

//__CONFIG(HS&WDTDIS&LVPDIS);




/*-----------宏定义--------------*/

#define  uint  unsigned int

#define  uchar unsigned char


uint  ADbuf=0; // 缓存AD转换结果



/*-----------子函数声明--------------*/




/*-----------主函数--------------*/

void main()

{

// The corresponding data direction register is TRISA. 

// Setting  a TRISA bit (= 1) will make the corresponding PORTA pi an input. 

// Clearing a TRISA bit (= 0) will make the corresponding PORTA pin an output.


// 解释为什么需要TRISA0=1? After the A/D module has been configured as desired, 

// the selected channel must be acquired before the conversion is started. 

// The analog input channels must have their corresponding TRIS bits selected as inputs. 

TRISA0=1; // RA0口为输入口,电压输入口

TRISE0=0; // AD中断对应的LED灯的数据方向为输出

// 用来显示AD转换结果(10bit,对应10个LED)

TRISC7=0;

TRISC6=0;

TRISD=0x00;




// 1 = Port pin is > VIH,即高电平  ;  0 = Port pin is < VIL,即低电平

RA0=0; // 要不要这行语句没有影响,因为该端口是输入端口

RE0=0; // LED灯的初值为灭

// AD转换结果(10bit)对应的led灯初值为灭

RC7=0;

RC6=0;

RD=0x00;





while(1) // 死循环,单片机初始化后,就一直运行这个死循环

{

/****************AD初始化****************/

// The ADCON1 register, configures the functions of the port pins.

//ADCON1=0x0e; //RA0为AD输入口.   ADFM=1,转换后数据右移

//下面几条语句等价于上面一条语句

ADFM=1; // AD Result Format Select bit.  0 = Left justified.  1 = Right justified

ADCS2=0; // AD Conversion Clock Select bit. // ADCS1=0; ADCS0=1;(ADCON0配置这两位)   FOSC/8

PCFG3=1;PCFG2=1;PCFG1=1;PCFG0=0; //AD Port Configuration Control bits.  1110 D D D D D D D A




//ADIE=0; //禁止AD中断

//AD中断使能

ADIE=1;

ADIF=0; // Clear ADIF bit 

PEIE=1; // 允许外设中断

GIE=1; // 总中断允许



/******************启动一次AD转换*******************/

// The ADCON0 register, controls the operation of the A/D module.

//ADCON0=0x01;//选择AN0通道准备AD转换,启动AD模块

//下面几条语句等价于上面一条语句

ADCS1=0;ADCS0=0; // AD Conversion Clock Select bits    FOSC/8

CHS2=0;CHS1=0;CHS0=0; // Analog Channel Select bits。  000 = Channel 0 (AN0)   

  GO_DONE=0; // AD Conversion Status bit。为什么叫用GO_DONE看一下pic.h头文件,该文件在HT-PICinclude目录下  

ADON=1; //模数转换器使能位。 1 = A/D converter module is powered up

 



asm("NOP"); //延时,让模拟电压稳定

asm("NOP");

asm("NOP");

asm("NOP");

asm("NOP");



// When ADON = 1时,GO_DONE=1: AD conversion in progress set this bit(GO_DONE=1), starts the AD conversion. 

// it is automatically cleared by hardware when the AD conversion is complete

GO_DONE=1; //开始进行AD转换   GO/DONE: A/D Conversion Status bit

while(GO_DONE) continue;//等待AD转换结束,AD转换完成后,GO_DONE自动由1变成0




// The conversion of an analog input signal results in a corresponding 10-bit digital number. 

// The ADRESH(高8位):ADRESL(低8位) registers contain the 10-bit result of the AD conversion.

// When the AD conversion is complete, the result is loaded into this AD Result register pair, 

// the GO/DONE bit is cleared and the A/D interrupt flag bit ADIF is set

ADbuf=ADRESH*256+ADRESL;//转换结果一共有10bit。由于2^10为1024,所以这是一个4位数  0-1023

//ADbuf=ADRESL;


// 将一个4位数用10位的LED灯显示出来  RC7 RC6 RD7...RD0

RC7= ADbuf/512;

RC6=(ADbuf-RC7*512)/256;

RD7=(ADbuf-RC7*512-RC6*256)/128;

RD6=(ADbuf-RC7*512-RC6*256-RD7*128)/64;

RD5=(ADbuf-RC7*512-RC6*256-RD7*128-RD6*64)/32;

RD4=(ADbuf-RC7*512-RC6*256-RD7*128-RD6*64-RD5*32)/16;

RD3=(ADbuf-RC7*512-RC6*256-RD7*128-RD6*64-RD5*32-RD4*16)/8;

RD2=(ADbuf-RC7*512-RC6*256-RD7*128-RD6*64-RD5*32-RD4*16-RD3*8)/4;

RD1=(ADbuf-RC7*512-RC6*256-RD7*128-RD6*64-RD5*32-RD4*16-RD3*8-RD2*4)/2;

RD0= ADbuf%2;

}

}





/*************中断服务程序***************/

void interrupt ISR(void)//PIC单片机的所有中断都是这样一个入口

{

// When the AD conversion is complete, the A/D interrupt flag bit ADIF is set. 

if(ADIF==1) // 需要进一步判断是否为外部中断的溢出中断标志位    

{

// The interrupt flag bit(s) must be cleared in software before 

// re-enabling interrupts to avoid recursive interrupts

//溢出中断标志位清零     如果ADIF出现上升沿,则产生中断,所以中断发生之后要清零。

ADIF=0;



// 执行中断处理程序,执行中断产生时想要执行的功能

RE0=1; // 外部中断发生时,LED灯亮


}

}


3 protues仿真结果

特别要注意ADFM位的选择,左对齐还是右对齐。这会影响ADbuf=ADRESH*256+ADRESL;这条语句对不对。

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

4 一般的ADC的首位都是符号位,为什么PIC单片机没有符号位,如何解释?

以下结论仅适用于单端ADC。

在这里插入图片描述

如上图所示,这是在PIC16F1513的数据手册找到的模拟信号到数字信号的转化图。根据芯片手册可知,该芯片的ADC转换结果一共有10bit。

从这幅图可以看出,最大值为3FFh(0011_1111_1111),最小值为00h。也就是说,如果有符号位,那么符号位肯定在这10bit内。现在看VREF-(负参考电压)这里,它的转换结果为00h。它最小可以接地,即0V,如下图所示。结论:如果电压小于0V,那么相当于会当成0V来被量化,AD量化结果还是为00h。

在这里插入图片描述

下面这几幅图是PIC16F877a的AD转换仿真图,这款芯片的转化结果也是10bit,所设置的VREF+(正参考电压)为VDD(+5v),负参考电压为地(0V)。

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

结论:PIC单片机的ADC转换机理应该是这样的,小于负参考电压的模拟输入电压的量化结果为全0,大于正参考电压的模拟输入电压的量化结果为全1。

关键字:PIC16F877A  单片机  ADC 引用地址:PIC16F877A单片机 (ADC)

上一篇:PIC16F15323单片机 (ADC)--汇编+C语言
下一篇:PIC16F877A单片机 (外部中断与定时器Timer0的综合使用)

推荐阅读最新更新时间:2024-11-13 10:40

AVR单片机教程——数字输出
从上一篇教程中我们了解到,按键与开关的输入本质上就是数字信号的读取。这一篇教程要讲的是,控制LED的原理是数字信号的输出。数字IO是单片机编程之有别于桌面编程的各项内容中最简单、最基础的。 在讲数字信号输出之前,我们先来了解一下它控制的器件。LED,是一种二极管,在理想模型中,加以正向电压会发光,反向电压则不会。在稍微实际一点的模型中,当正向电压超过一定阈值时,二极管会发光,其电流会随着正向电压的增大而急剧增大;对反向电压的耐受力也是有限的。现实中的LED的具体参数因生产厂家而异,一般红色与黄色LED的导通压降为2V多,绿、蓝、白色的为3V左右或多一点;反向耐压一般为5V。 电流大到一定程度,任何器件都会烧毁,我们最好要把
[单片机]
AVR<font color='red'>单片机</font>教程——数字输出
51单片机学习笔记
一、基础知识 1.1 名词解释 比特(bit): 即一位二进制数,用小写b表示bit。二进制数字后面用B或b作后缀。 字节(Byte): 由八位二进制数构成,一般用大写B表示。十六进制数后面用H作后缀,或0X、0x作前缀。 PROM(Programmable ROM): 可编程(烧写)只读存储器,内容断电可以维持。内容的存储过程称为固化、烧录、烧写。烧写(一次性)时需要加高电压。 EPROM(Erasable PROM): 可擦除、可编程只读存储器,也需要高电压。存储器顶部有窗口,专用紫外线照射可擦除其内容。 EEPROM( Electrical EPROM,E^2PROM): 电可擦除、可编程只读存储器。5v电压即可反复烧写。
[单片机]
51<font color='red'>单片机</font>学习笔记
基于51单片机的贪吃蛇游戏
前言: 这篇文章是我当时制作完成后写的总结,已经过去了一段时间,苦于找不到实物的图片,就把全文都粘贴到了下面。 今天是11月2日,昨天我完成了我的贪吃蛇的制作。那个战线一个多月,让我煞费苦心的工作。在这一过程中,学到了许多新知识,也认识了许多新朋友,无论星火杯结果如何,它都将成为我的大学生涯,甚至一生中宝贵的财富。所以我决定将我学到的,想到的都写下来,给将来的自己一份美好的回忆。这次总结的内容主要是进入西电来学到的一些硬件知识,主要包括51单片机基础知识(最小系统、LED流水灯、蜂鸣器、独立按键、数码管显示),Protues仿真(以贪吃蛇为例),Keil的使用(贪吃蛇程序的分析),最后是贪吃蛇制作的基本步骤。 一、51单片
[单片机]
基于51<font color='red'>单片机</font>的贪吃蛇游戏
汽车的智能感官之“心”:适于检测及传感应用的MCU
Renesas(瑞萨电子)一直以来在汽车电子应用中具有重要地位,MCU R5F1177A属于Renesas RL78系列微控制器产品,该款MCU具有极低的功耗,丰富的模拟功能以及出色的低功耗表现,这使R5F1177A可以完美的应用于对功耗敏感的汽车电子应用,尤其是检测及传感器应用。 完备的模拟功能 世强代理的R5F1177A,集成了丰富的模拟功能,包括运算放大器、模式转换器、窗口比较器等。 同时该款MCU内部集成了4路运算放大器,2路窗口比较器,在外部配合简单的电阻电容设计,即可完成对信号的放大、滤波以及信号的监测,配合内部集成的分辨率高达12位的模数转换器,R5F1177A以极小的设计面积就可以完成对外部信号的测
[汽车电子]
PIC16F877A 的CCP使用
//************************************************************* // |-| |-| |-| // | | | | | | // __| |________| |_______|_|_____------ PWM1 // // |----| |----| |----| // | | | | | | // __| |_____| |____| |_------ PWM2 //本实验利用PIC单片机的CCP模块功能产生PWM功能,PWM的周期为: //(PR2+1)*4TOSC*(TMR2预分频值) //了解CCP模
[单片机]
瑞萨电子宣布开发支持低功耗蓝牙®5.3的下一代无线MCU
瑞萨RAMCU阵容重磅新品,2022年第一季度样片上市 2021年10月21日,日本东京讯 - 全球半导体解决方案供应商瑞萨电子集团)今日宣布,将开发全新微控制器(MCU),以支持最近发布的低功耗(LE)蓝牙®5.3规范。新产品将成为Renesas Advance(RA)32位Arm® Cortex®-M微控制器产品家族的重要部分,加入去年推出的RA4W1蓝牙5.0 LE产品阵容,首批样片将于2022年一季度推出。 全新蓝牙5.3规范已于2021年7月13日发布,包括多项重要功能:例如允许接收器无需通过主机堆栈即可过滤信息,以改善接收器占空比;允许外围设备能够向中央设备开辟首选通道,从而提升吞吐量和可靠性;增加了次级
[网络通信]
瑞萨电子宣布开发支持低功耗蓝牙®5.3的下一代无线<font color='red'>MCU</font>
8位元MCU市占率排名
    根据Gartner针对2012年全球8位元MCU排名调查数据,2012年前三大MCU厂商排名分别为瑞萨电子(Renesas Electronics)、MicroChip Technology及触控厂商Atmel,市占率分别为17%、14%及11%。 意法半导体(ST)维持第四名位置,而恩智浦(NXP)则从2011年第八名晋升至第五名,两家厂商市占率分别为9%和8%。 至于第六到十名则依序为飞思卡尔(Freescale)、三星电子(Samsung Electronics)、Cypress、Silicon Labs和Panasonic,市场占有率分别是7%、6%、5%、2%、2%。 值得注意的是,台系厂商盛群半导体2012年8位
[手机便携]
【GD32 MCU 入门教程】GD32 MCU 常见外设介绍(8)SPI 模块介绍
串行外设接口(Serial Peripheral Interface,缩写为 SPI) 提供了基于SPI 协议的数据发送和接收功能, 可以工作于主机或从机模式。 SPI 接口支持具有硬件 CRC 计算和校验的全双工和单工模式。 8.1.SPI 基础知识 SPI 物理层 SPI接口采用主从模式(Master Slave)架构;支持一主一从模式和一主多从模式,但不支持多主模式。它是一种同步高速全双工的通信总线,总体结构如下图常见的SPI通讯系统所示。 一个主机连接四个从机,其中一个SPI总线一般有四个信号分为: SCLK:时钟信号,由主机产生并控制。 MOSI:主机数据输出,从机数据输入。 MISO:主机数据输入,从机数据输出。
[单片机]
【GD32 <font color='red'>MCU</font> 入门教程】GD32 <font color='red'>MCU</font> 常见外设介绍(8)SPI 模块介绍

推荐帖子

讨论一个问题:类似于鸡生蛋还蛋生鸡的问题
我们设备发生高压放电现象,主要单元设备进行放电。目前比较困惑的问题,是由于IGBT故障导致过压产生还是过压导致IGBT故障。讨论一个问题:类似于鸡生蛋还蛋生鸡的问题自己顶起来
eeleader 工控电子
恩智浦LPC54100开发板发送状态(2015年03月25日)
活动详情:https://www.eeworld.com.cn/huodong/201412_NXP_LPC54100/下面网友的开发板已经发送,大家注意查收。关于LPC54100这块开发板,目前论坛的小伙伴们已经分享了好多资料,在论坛搜索“LPC54100”,就可以发现他们。第九批、2015年03月25日LPC54100开发板发送名单(快递:圆通)序号创意方案名称EEworld用户名货运单号1车载GPS伊亓50010
nmg NXP MCU
轻松玩起24L01例程
本帖最后由sacq于2015-11-1723:59编辑 【硬件准备】材料:MSP430G2开发板2块,24L01模块(MINI版)2个,24L01BoosterPack板1块(有2块更好)相关可见:https://bbs.eeworld.com.cn/thread-475407-1-1.html楼主只准备了1块24L01BoosterPack板的无模块空板,需自己动手把24L01模块焊到板上;另一个24L01模块则直接焊在开发板的背面。两块板子的接
sacq 微控制器 MCU
在msp430g2231中如何开启basic timer 的中断
我在g2231中的userguide中看到的IE1,即InterruptEnableRegister1,他控制的是Oscillatorfaultinterruptenable,这个是什么东西,还有要想开启g2231basictimer的中断该用什么语句呢?在Fx42x中用IE2=BTIE就可以开中断在msp430g2231中如何开启basictimer的中断设置基础时钟模块的时候,IE1一般都不置位的,因为默认的振荡器错误中断标志就是置一的,不知道楼主为什么想设置
gh1134537617 微控制器 MCU
tps65130芯片的几个问题
一,TPS65130具有正负(双路)输出的800mA升压电流,用于OLED和CCD传感器,24QFN。tps65130TI德州仪器_提供技术支持模拟产品芯片介绍:TPS6513x是双输出DC-DC转换器,在典型应用中产生高达15V的正输出电压和低至-15V的负输出电压,输出电流在200mA范围内,具体取决于输入电压与输出电压比。该器件的总效率高达85%,是便携式电池供电设备的理想选择。2.7V至5.5V的输入电压范围允许器件由电池或固定的3
qwqwqw2088 模拟与混合信号
有关用2812的GPIO管脚模拟I2C总线时序的问题
现在的情况是:启动I2C总线后,发送器件地址(PCF8576CT,器件地址为70H,SA0,A2/A1/A0接地),后能检测到应答信号,但是接下来发送的数据就不能够检测到应答信号了。SDA管脚始终为1。不知到为什么。想各位大侠请教了。^_^有关用2812的GPIO管脚模拟I2C总线时序的问题用万用表测得SDA和SCL两个信号都是有信号的。我发送的数据是:70H(PCF8576CT的器件地址)、E0H(发送子地址)、48H(工作模式)发送70H后测得应答信号是正确的,发
qy7551693 微控制器 MCU
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved