IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> PIC16F877A单片机 (ADC) -> 正文阅读

[嵌入式]PIC16F877A单片机 (ADC)

1 基本原理

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

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

2 实现原码


/*---------------------------------函数功能:-------------------------------------
 将模拟输入变成数字输出AD的转换以及AD转换完成后产生一个AD中断
 RA0为模拟电压输入,RD口为AD量化输出
 
 编程思路:参考手册的P131  To do an A/D Conversion, follow these steps
----------------------------------------------------------------------------*/


#include<pic.h>// 调用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-PIC\include目录下  
		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;这条语句对不对。
在这里插入图片描述

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

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-10-24 15:04:06  更:2021-10-24 15:04:22 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 6:29:11-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码