pic1路AD转换c语言,pic单片机的ad转换(实例解析)
描述
AD转换就是模数转换。顾名思义,就是把模拟信号转换成数字信号。主要包括积分型、逐次逼近型、并行比较型/串并行型、Σ-Δ调制型、电容阵列逐次比较型及压频变换型。A/D转换器是用来通过一定的电路将模拟量转变为数字量。模拟量可以是电压、电流等电信号,也可以是压力、温度、湿度、位移、声音等非电信号。但在A/D转换前,输入到A/D转换器的输入信号必须经各种传感器把各种物理量转换成电压信号。
PIC单片机如何表示电压
PIC用十位二进制位的数来表示电压,也就是数值0~1023来表示电压。那比如现在这个数值是400那这代表多少的电压?这就要根据参考电压来确定了。
比如我们设置正参考电压为3.3V ,当输入的电压为0时,数值就为0。当输入的电压为3.3V时,数值就是1023. 那如果输入的电压是1.2V代表多少电压。
首先,先算出一个数值代表多少的电压 3.3V除以1023 约等于 0.003V 。
然后,1.2V除以0.003V 等于400. 这就得出了400代表的是1.2V。
见下图我们可以看AN0~AN7.这些都是可以配置成模拟输入的端口。只有这些引脚才能做为AD转换的端口。
实例讲解
例如:下面的原理图,从RA0/AN0脚输入个模拟量如果电压大于1.2v则LED亮否则LED灭。
AD的设置步骤
1,设置端口
将RA0口设置为输入 TRISA = 0x01;
将RA0口设置为模拟 ANSELA = 0x01;
2, 配置ADC模块
选择ADC的转换时钟。
如何选择转换时钟呢 要根据现在的时钟频率进行选择。可以根据数据手册中的表格进行选择 。
我们设置单片机的时钟频率为32MHZ ,选择ADC周期关键不要选择阴影部分,在32MHz 这一列 我们随意选择了ADC时钟周期1us,对应的时钟源为Fosc/32.,AD控制寄存器1 ADCON1的ADCS《2:0》=010注:ADCS《2:0》代表的意思就是 ADCS的0到2位。
配置参考电压
我们这里选择右对齐,所以AD控制寄存器1 ADCON1的 ADFM=1
上面将有关ADCON1寄存器的配置说完了。下面来讲解ADCON0
选择ADC输入通道
AD转换模块只有一个,而AD输入通道有8个AN0~AN7.所以不可能同时进行AD转换,那个需要用我们就分配给那个,根据硬件我们将AD转换模块分配给AN0.
所以 ADCON0 的CHS《4:0》=0000;
开启ADC模块
ADC模块开启,ADCON0的ADON=1,只是单纯的启用ADC模块。并不开始AD转换。如果不用ADC模块时候建议关闭。可以省点电哦!!!
开始AD转换
ADCON0的GO/DONE=1开启AD转换。
4 等待AD转换结束
5 读取结果
一般情况下我们并不取一次的AD转换的值。而是取多次之后算平均值。这样来确保转换的准确性。 配置ADC模块,有许多地方并没有讲解为什么这么配置,因为许多配置其实是比较随意的。并不是那么的绝对的。一定非要选择哪一个。当然实际的配置还是要根据你项目需求。
//开发环境MPLAB X IDE ,单片机PIC16LF1823.
#include 《pic.h》
__CONFIG(FOSC_INTOSC&WDTE_OFF&PWRTE_ON&MCLRE_OFF&CP_ON&CPD_OFF&BOREN_ON
&CLKOUTEN_OFF&IESO_ON&FCMEN_ON);//这个要放到上一行去
__CONFIG(PLLEN_OFF&LVP_OFF) ;
#define ADC_NUM 8 //转换的次数
#define LED LATA1
void init_GPIO(void)
{
TRISA = 0x01;//端口设置为输入
ANSELA = 0x01;//设置为模拟输入
PORTA = 0x00;
LATA = 0x00;
}
void init_fosc(void)
{
OSCCON = 0xF0;//32MHZ
}
void init_AD(void)
{
ADCON1= 0xA0;//右对齐,AD时钟为Fosc/32,参考电压为电源电压,
ADCON0= 0x00;//选择通道AN0
ADCON0bits.ADON = 1;//开启模块
}
unsigned int ADC_BAT_ONE(void)//转换一次
{
unsigned int value;
value=0;
ADCON0bits.CHS =0;//选择通道AN0
ADCON0bits.ADGO=1;//开始转换
while(ADCON0bits.GO==1);//等待转换结束
value=(unsigned int)ADRESH;//强制类型转换,因为ADRESH是字符型的只能表示8位二进制。所以必须转换成可以容纳10位二进制的整型。
value= value《《8;// 将高两位左移8位
value += ADRESL;//低八位加入ADRESL的值。
return value;
}
unsigned int ADC_BAT_contiue(void)
{
unsigned int ADV_MCU[ADC_NUM],ADV_CNT,ADV_ALL;
ADV_ALL=0;
for(ADV_CNT=0;ADV_CNT《ADC_NUM;ADV_CNT++)//进行多次AD转换
{
ADV_MCU[ADV_CNT]=ADC_BAT_ONE();
}
for(ADV_CNT=0;ADV_CNT《ADC_NUM;ADV_CNT++)//计算多次AD转换的平均值
{
ADV_ALL += ADV_MCU[ADV_CNT];
}
ADV_ALL= ADV_ALL/ADC_NUM;
return ADV_ALL;//得到结果返回
}
/*
*
*/
int main(int argc, char** argv) {
init_fosc();//设置时钟
init_GPIO();//设置I/O口
init_AD();//设置AD
while(1)
{
if( ADC_BAT_contiue()》400)//判断输入电压是否大于1.2V
{
LED=1;//灯亮
}
else
{
LED=0;//灯灭
}
}
}
打开APP精彩内容
点击阅读全文
pic1路AD转换c语言,pic单片机的ad转换(实例解析)相关推荐
- PIC单片机的AD数据传输和上位机C#串口界面实时显示
PIC单片机的AD数据传输和上位机C#窗口界面实时显示 硬件:BK300开发板+PIC16F877A芯片+Pickit2 软件:MPLAB IDE v8.91.Visual Studio 2019 下 ...
- C语言 int 转单精度浮点,单精度浮点数与十六进制转换 C语言程序 单片机也可用...
单精度浮点数与十六进制转换 C语言程序 单片机也可用 #include float Hex_To_Decimal(unsigned char *Byte,int num)//十六进制到浮点数 { // ...
- pic单片机c语言读eeprom,PIC单片机的EEPROM读写实例及说明
PIC单片机的EEPROM读写实例及说明 来源:luchaohai 作者:华仔 浏览:1397 时间:2016-08-10 14:18 标签: 摘要: ; PIC单片机的EEPROM读写实例及说明;* ...
- pic单片机c语言读eeprom,PIC单片机的EEPROM读写实例
PIC单片机的EEPROM读写实例及说明 ;**************************************************************************** ; ...
- 单片机ad显示程序c语言,pic单片机ad转换c程序分享
A/D转换器是用来通过一定的电路将模拟量转变为数字量.模拟量可以是电压.电流等电信号,也可以是压力.温度.湿度.位移.声音等非电信号.但在A/D转换前,输入到A/D转换器的输入信号必须经各种传感器把各 ...
- 单片机模数转换实验c语言程序,单片机实验AD转换实验
<单片机实验AD转换实验>由会员分享,可在线阅读,更多相关<单片机实验AD转换实验(5页珍藏版)>请在人人文库网上搜索. 1.实验报告课程名称: 单片机原理及应用 实验项目: ...
- pic单片机延时程序C语言,PIC单片机C语言延时程序和循环子程序实现方法
PIC单片机C语言延时程序和循环子程序实现方法 很多朋友说C中不能精确控制延时时间,不能象汇编那样直观. 其实不然,对延时函数深入了解一下就能设计出一个理想的框价出来. 一般的我们都用 for(x=1 ...
- pic单片机配置字c语言,PIC单片机配置字说明及使用.pdf
PIC单片机配置字说明及使用 PIC 单片机器件配置字简介和使用 在PIC系列单片机里,其芯片内部大都有设置一个特殊的程序存储单元,地 址为2007 ,由单片机的用户自由配置,用来定义一些单片机功能电 ...
- pic单片机流水灯循环右移c语言,PIC单片机LED流水灯程序
PIC 单片机 LED流水灯程序 ;************************************************************* include ;*********** ...
最新文章
- HDU1808(抽屉原理)
- vue项目中开启Eslint碰到的一些问题及其规范
- sprintboot 配置文件上传大小(默认是1MB)
- 数美科技-AI独角兽-NLP/语音/图像等岗位等你来~
- 我是如何获取新知识的?
- Atitit 如何让精灵控件运动
- 概率收敛、分布收敛、Lp收敛
- c语言中calloc是什么意思,C语言中malloc和calloc以及relloc函数的区别
- 太极图形课-01-Taichi编程
- struct的构造函数
- html返回首页页面代码,后台返回的HTML整个页面代码打开方法
- 视频知识点(20)- H264码流如何在SPS中获取宽高信息?
- java 类转换_java实体类转换有没有更优雅的方式?
- C/C++重要知识点
- 05_Python_变量的基本使用
- 如何用Stata完成(shui)一篇经济学论文(九):画线性图
- pdf文件的简单介绍-提取pdf中的内容
- mysql sdi_SDI文件扩展名 - 什么是.sdi以及如何打开? - ReviverSoft
- 以太坊黄皮书翻译连载2-20170829
- 阿里百秀项目实战day3
热门文章
- 第2讲 | 网络分层的真实含义是什么?
- java 从数据库取值_JAVA操作数据库--从一张表中取值,经过判断,然后插入另一张表中。...
- python简单网络爬虫_【Python】简单的网络爬虫
- python和sqlserver_利用python实现mysql数据库向sqlserver的同步
- java 更新对象_java通过key-list和对应value更新当前对象
- h5上传图片_怎么搭建自己的H5响应式网站
- poj1985 Cow Marathon(树的直径#入门)
- 第三届Apache Flink 极客挑战赛暨AAIG CUP攻略发布!
- 一文详解PolarDB披荆斩棘的“秘密武器”
- 阿里云云效技术专家:一文详解kubernetes下5种常见发布模式如何选择