PIC单片机AD转换数据存储及串口
- 格式:docx
- 大小:12.93 KB
- 文档页数:3
PIC24系列单片机原理与开发第6章AD转换器及编程AD转换器是一种用于将模拟信号转换为数字量的设备,它的主要用途是将模拟量转换为可用于数字控制系统的数字信号。
PIC24系列单片机内置了多路/低速模拟输入AD转换器,可以实现对模拟量的采集、处理和控制。
AD转换器的编程十分复杂,需要明确程序对模拟量的要求,包括采样率、量程、精度等,还需要根据PIC24系列单片机的资源情况,合理配置AD转换器的参数,以便实现模拟量的有效读取。
1)可以多路采样:多路采样可以提高采样精度,在故障时可以减少恢复时间,还可以提高采样率。
2)采样率:根据实际应用需要,调整单片机的时钟频率,来达到最佳的采样率。
3)精度范围:根据实际应用需要,调整AD转换器的精度范围,以保证采集到的数据和处理能力的均衡使用。
4)通道选择:根据实际应用,选择多路采样中的其中一路,来使用最佳的采样精度。
单片机ad转换原理单片机AD转换原理。
单片机(Microcontroller)是一种集成了微处理器、存储器和各种输入输出设备的微型计算机系统。
在很多电子设备中,单片机都扮演着至关重要的角色。
而AD转换(Analog to Digital Conversion)则是单片机中非常重要的功能之一,它可以将模拟信号转换为数字信号,使得单片机可以对外部的模拟信号进行采集和处理。
本文将介绍单片机AD转换的原理及相关知识。
AD转换的原理是利用单片机内部的模数转换器(ADC)来实现的。
模数转换器是一种将模拟信号转换为数字信号的电路,它可以将模拟信号的大小转换为相应的数字值。
在单片机中,模数转换器可以通过一定的采样和量化过程,将模拟信号转换为数字信号,并输出到单片机的数据总线上,以便单片机进行进一步的处理。
在进行AD转换时,首先需要对模拟信号进行采样。
采样是指在一定时间间隔内对模拟信号进行取样,获取其大小。
这样可以将连续的模拟信号转换为离散的信号。
然后,对采样后的信号进行量化。
量化是指将连续的模拟信号转换为一系列离散的数字值。
在单片机中,量化通常是按照一定的精度和分辨率进行的,精度越高,分辨率越大,转换后的数字值越接近原模拟信号的真实数值。
单片机中的ADC模块通常由输入端、采样保持电路、比较器、计数器、数字转换器和控制逻辑等部分组成。
当单片机需要进行AD转换时,首先需要将模拟信号输入到ADC的输入端,然后ADC会对输入信号进行采样和量化,最终输出转换后的数字信号。
在这个过程中,ADC的控制逻辑会根据预设的转换精度和采样频率等参数,控制ADC的工作状态,以保证转换的准确性和稳定性。
在实际应用中,单片机的AD转换功能被广泛应用于各种测控系统、仪器仪表、传感器等领域。
通过AD转换,单片机可以对外部的模拟信号进行采集和处理,实现数据的数字化和处理,为系统的控制和监测提供了重要的支持。
同时,单片机的AD转换功能也为各种信号处理算法和数字信号处理提供了基础,为系统的功能和性能提升提供了可能。
//ADC采样实验//#include <pic.h>#define uchar unsigned char#define uint unsigned intuchar LED_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf};//不带小数点的字型码uchar LED_CODE1[]={0x40,0x79,0x24,0x30,0x19,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf};//带小数点的字型码void delay(uchar x);void init();void display(uchar num1,uchar num2,uchar num3,uchar num4);void beep();uint get_ad()//整型带返回值子函数{uint adval,ad;//定义两个无符号整型变量ADGO=1;//启动AD转换//while(ADGO);//查询AD转换是否完成,此行可以不用,程序一样运行正常//if(ADGO==1);//可以采用while查询也可以用if查询AD转换是否完成,此行一样可以不要//adval=ADRESH;//注释此行可以不要adval=ADRESH<<8|ADRESL;//ADRESH高8位数据左移8位,然后再与ADRESL低8位数据相加ad=adval*41;//这里的41是VDD电压,adval的值在0-1023之间,假设adval当前数字量是800,那么800*41=32800adval=ad/10;//因为我的是4位数码显示,将得到的32800除以10以后给数码管显示当前电压值即:3280(3.28V)return(adval); //返回adval值给主程序调用的地方}void main(){init();//程序初始化uint tempad;//定义临时整型变量uchar s1,s2,s3,s4;//定义4个无符号字符型变量while(1){tempad=get_ad();//调用ad子程序s1=tempad/1000;//将得到的值3280除以1000取商丢去余数,所以s1的值是3(即千位)s2=tempad%1000/100;//3280除1000求余280再除以100取商,所以s2的值是2(取百位)s3=tempad%100/10;//3280除100求余80再除以10取商,所以s3的值是8(取十位)s4=tempad%10;//3280除10求余,余数是0(取个位)display(s1,s2,s3,s4); //给数码管分别显示四位值/////以下是判断ad采样的电压是否大于4v,大于或等于4v时led等亮///// if(s1>=4)//判断千位值{RA5=0;}/////////////~~~~~~~~~~~~~~~~~~~~~~~~~~///////////////////////////////////}}void init(){TRISA=0x01;//RA0设置为输入AN0(AD采集端口)TRISD=0;//D端口全部设置成输出PORTA=0x01;PORTD=0xFF;TRISE=0;PORTE=0;ADCON0=0x41;ADCON1=0x8e;delay(1);//延时5ms稳定AD采用}void display(uchar num1,uchar num2,uchar num3,uchar num4){PORTD=LED_CODE[num4];//数码管个位显示值PORTA=0xfd;//1111 1101 开数码管个位位选delay(1);PORTD=LED_CODE[num3];//数码管十位显示值PORTA=0xfb;//1111 1011delay(1);PORTD=LED_CODE[num2];//数码管百位显示值PORTA=0xf7;//1111 0111delay(1);PORTD=LED_CODE1[num1];//数码管千位显示值(这个值是带小数点的)PORTA=0xef;delay(1);}void delay(uchar x)//5ms延时子函数{uint y,k;for(y=0;y<x;y++)for(k=0;k<200;k++);}void beep(){RE1=0;delay(20);RE1=1;delay(20);}教你如何用WORD文档(2012-06-27 192246)转载▼标签:杂谈1. 问:WORD 里边怎样设置每页不同的页眉?如何使不同的章节显示的页眉不同?答:分节,每节可以设置不同的页眉。
//实验目的:熟悉A/D转换//软件思路:选择RA0做为模拟输入通道;// 结果只取低8位// 连续转换5次再求平均值做为转换结果// 结果送数码管的高低3位显示//硬件要求:跳线J18接通// 拨码开关S6全部置ON,S5第4-6位置ON,第1-3位置OFF// 为不影响结果,其他拨码开关置OFF。
#include<pic.h> //包含单片机内部资源预定义__CONFIG(0x1832);//芯片配置字,看门狗关,上电延时开,掉电检测关,低压编程关,加密,4M晶体HS振荡const char TABLE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0X82,0XF8,0X80,0X90};//定义常数0-9的数据表格void DELAY(); //delay函数申明void init(); //I/O口初始化函数申明void display(int x); //显示函数申明//------------------------------------------------//主程序开始void main(){int result=0x00; //定义转换结果寄存器while(1) //死循环{int i; //定义循环次数控制寄存器result=0x00; //转换结果清0for(i=5;i>0;i--) //求5次转换结果的平均值{init(); //调用初始化函数ADGO=0X1; //开启转换过程while(ADGO); //等待转换完成result=result+ADRESL; //累计转换结果}result=result/5; //求5次结果的平均值display(result); //调用显示函数}}//-----------------------------------------------//初始化函数void init(){PORTA=0XFF;PORTD=0XFF; //熄灭所有显示TRISA=0X1; //设置RA0为输入,其他为输出TRISD=0X00; //设置D口全为输出ADCON1=0X8E; //转换结果左对齐,RA0做模拟输入口,其它做普通I/O ADCON0=0X41; //系统时钟Fosc/8,选择RA0通道,允许ADC工作DELAY(); //保证采样延时}//----------------------------------------------//延时程序void DELAY() //延时程序{int i; //定义整形变量for(i=0x100;i--;); //延时}//-----------------------------------------------//显示函数void display(int x){int bai,shi,ge,temp; //定义4个临时变量temp=x; //暂存AD转换的结果bai=temp/0x64; //求显示的百位shi=(temp%0x64)/0xa; //求显示的十位ge=(temp%0x64)%0xa; //求显示的个位PORTD=TABLE[bai]; //查表得百位显示的代码PORTA=0x1f; //RA3输出低电平,点亮百位显示DELAY(); //延时一定时间,保证显示亮度PORTD=TABLE[shi]; //查表得十位显示的代码PORTA=0x2F; //RA4输出低电平,点亮十位显示DELAY(); //延时一定时间,保证亮度PORTD=TABLE[ge]; //求个位显示的代码PORTA=0x37; //RA5输出低电平,点亮个位显示DELAY(); //延时一定时间,保证亮度}。
PIC单片机与16位串行D/A转换类型概述
1.电流型D/A
图1 所示为电流衰减型D/A 转换器原理图。
图中T1、T2TN 和RE 构成权电流发生器中的恒流源。
各个管子的RE 是相等的,所以各位恒流源中的电流相等,我们把它记为IE。
R-2R 梯形为电流源的负载。
电子开关K1,K2 KN 可以控制乃通向地端还是流进R-2R 梯形电阻网络和加法器,在加法器的相加点可以流入加权电流的和。
图1 电流衰减型D/A 转换器
如果只有电子开关Κ,将恒流源Y1 和R-2R 梯形电阻网络与加法器接通,其他电子开关均接向地,则通过加法器相加点的电流正好是一个IE。
电流源型D/A 转换器是用源器件(一般是MOS 管)构成的电路来提供加权电流。
与电阻加权型转换器相比,电流源型D/A 转换器速度比较快,对开关的寄生参数不敏感。
这种结构一般用于MOS 结构的D/A 转换器。
电流源型D/A 转换器的简单结构如图2 所示。
图2 电流型D/A 转换器的简单结构
2.电压型D/A
电压型的D/A 转换器原理如图3 所示。
图3 3 位电压定标D/A 转换器
电压定标D/A 转换器特别适合MOS 工艺,MOS 工艺中模拟开关容易实现,而且MOS 缓冲放大器的直流偏置电流很小。
电压定标D/A 转换器常用作MOS
D/A转换器系统中的一个部件,被用作逐次逼近式D/A转换器中的D/A转换子电路。
tips:感谢大家的阅读,本文由我司收集整编。
仅供参阅!。
单片机adc进行连续电压转换
单片机的ADC(模数转换器)可以用于连续电压转换。
通常情况下,单片机的ADC模块可以配置为连续转换模式,这样就可以持续地将模拟输入信号转换为数字值。
下面我将从硬件配置和软件编程两个方面来详细说明。
硬件配置:
1. 确保选择的单片机具有内置ADC模块,或者外部ADC芯片与单片机连接。
2. 确保输入电压范围在ADC的输入范围内,否则需要外部电压分压电路。
3. 连接模拟输入信号到ADC引脚,并连接ADC引脚到单片机的对应引脚。
4. 确保ADC的参考电压源正确连接,以确保准确的电压转换。
软件编程:
1. 首先配置ADC的工作模式为连续转换模式,这通常需要设置ADC控制寄存器。
2. 确定转换的采样率,即多久进行一次转换,这取决于应用的要求和单片机的性能。
3. 在主程序中编写ADC中断服务程序或者轮询ADC转换完成标志位的状态,以获取转换结果。
4. 在获取转换结果后,可以对数字值进行进一步处理,比如显示在数码管上、发送到串口或者存储到内存中等。
总之,要实现单片机ADC的连续电压转换,需要合理配置硬件连接,并编写相应的软件程序来控制ADC的工作模式和获取转换结果。
这样就可以实现持续不间断地将模拟电压信号转换为数字值。
PIC单片机串口通讯程序单片机串口通讯是一个常用的程序模块。
PIC单片机是一款常用的单片机。
在网上搜索到一个PIC单片机串口通讯程序。
这个PIC单片机串口通讯程序站长没有验证,应该是正确的。
假如大家有更好的PIC单片机串口通讯程序,请向我推荐。
1. 单片机PIC1编程(发送部分)LIST P=16F877#INCLUDE P16F876.INCCBLOCK 0X24 ;保留三个字节作为显示用COUNT ;作计数器或暂存器用ENDCORG 0X0000 ;程序复位入口NOPSTART GOTO MAINORG 0X20MAIN MOVLW 0X30 ;以下将RAM内容初始化MOVWF FSR ;从30H单元开始MOVLW 0X30 ;将值30H赋给单元30HMOVWF COUNTINTRAM MOVF COUNT,0 ;将30H~7FH赋给单元30H~7FHMOVWF INDFINCF COUNT,1INCF FSR,1BTFSS COUNT,7GOTO INTRAMBSF STATUS,RP0 ;将SCI部件初始化MOVLW 0X19 ;将传输的波特率设为约9600 bpsMOVWF SPBRGMOVLW 0X04 ;选择异步高速方式传输8位数据MOVWF TXSTABCF STATUS,RP0MOVLW 0X80 ;允许同步串行口工作MOVWF RCSTABSF STATUS,RP0BSF TRISC,7 ;将RC6、RC7设置为输入方式,断绝与外接电路的连接BSF TRISC,6BCF STATUS,RP0MOVLW 0X30 ;30H作为同步字符发送MOVWF FSRMOVF INDF,0MOVWF TXREG ;将待发送的数据写入发送缓冲器TXREGBSF STATUS,RP0BSF TXSTA,TXEN ;发送允许BCF STATUS,RP0BSF RCSTA,CREN ;接收数据允许LOOPTX BTFSS PIR1,RCIF ;等待PIC2的响应字节GOTO LOOPTXMOVF RCREG,0 ;读响应字节,清RCIFLOOPTX1 BTFSS PIR1,TXIF ;发送下一字节GOTO LOOPTX1INCF FSRMOVF INDF,0MOVWF TXREGBTFSS FSR,7 ;30H~7FH单元的内容是否发送完?GOTO LOOPTX ;没有,继续下一字节的发送BSF STATUS,RP0 ;如果是,则停止发送BCF TXSTA,TXENBCF STATUS,RP0 ;数据发送完毕CALL LED ;调用显示子程序,将发送的数据显示出来END ;程序完2. 单片机PIC2编程(接收部分)LIST P=16F876#INCLUDE P16F876.INCCBLOCK 0X24COUNTENDCORG 0X0000NOPSTART GOTO MAINMAIN BSF STATUS,RP0 ;初始化程序同发送子程序MOVLW 0X19 ;波特率设置与PIC1相同MOVWF SPBRGMOVLW 0X04 ;异步高速传输MOVWF TXSTABCF STATUS,RP0MOVLW 0X80 ;串行口工作使能MOVWF RCSTABSF STATUS,RP0BSF TRISC,7 ;与外接电路隔离BSF TRISC,6BCF STATUS,RP0MOVLW 0X30 ;从30H单元开始存放发送来的数据MOVWF FSRBSF RCSTA,CREN ;接收允许BSF STATUS,RP0BSF TXSTA,TXEN ;发送允许BCF STATUS,RP0WAIT BTFSS PIR1,RCIF ;等待接收数据GOTO WAITMOVF RCREG,0 ;读取数据MOVWF INDF ;将接收到的响应字节存入PIC2的RAM INCF FSRMOVWF TXREG ;发送响应字节LOOPTX BTFSS PIR1,TXIF ;等待写入完成GOTO LOOPTXBTFSS FSR,7 ;全部数据接收否?GOTO WAIT1 ;没有,继续接收其它数据BCF RCSTA,RCEN ;接收完,则关断接收和发送数据允许BSF STATUS,RP0BCF PIE1,TXENBCF STATUS,RP0CALL LED ;调用显示子程序,将接受到的数据显示出来END ;程序完PIC单片机双机同步通信1. 单片机PIC1编程(主控发送)LIST P=16F876#INCLUDE P16F876.INCCBLOCK 0X24 ;保留三个字节作为显示用COUNT ;作计数器或暂存器用ENDCORG 0X0000 ;程序复位入口NOPSTART GOTO MAINORG 0X0100MAIN MOVLW 0X30MOVWF FSR ;以下将从30H单元开始的RAM内容初始化MOVLW 0X30 ;将值30H赋给单元30HMOVWF COUNTINTRAM MOVF COUNT,0 ;将30H~7FH赋给单元30H~7FH MOVWF INDFINCF COUNT,1INCF FSR,1BTFSS COUNT,7GOTO INTRAMBSF STATUS,RP0 ;将SCI部件初始化MOVLW 0X19 ;将传输的波特率设为约9600 bpsMOVWF SPBRGMOVLW 0X94 ;选择同步高速方式传输8位数据MOVWF TXSTABCF STATUS,RP0MOVLW 0X80 ;允许同步串行口工作MOVWF RCSTABSF STATUS,RP0BSF TRISC,7 ;将RC6、RC7设置为输入方式,断绝与外接电路的连接BSF TRISC,6BSF STATUS,RP0MOVLW 0X30 ;将从30H单元开始的内容传送到PIC2MOVWF FSRMOVF INDF,0MOVWF TXREG ;将待发送的数据写入发送缓冲器TXREGBSF STATUS,RP0BSF TXSTA,TXEN ;发送允许BCF STATUS,RP0TX1 BTFSS PIR1,TXIF ;等待上一个数据写完GOTO TX1INCF FSR ;准备发送下一个数据MOVF INDF,0MOVWF TXREG ;将新的数据写入TXREGBTFSS FSR,7 ;判断所有30H~7FH单元的内容是否发送完毕?GOTO TX1 ;没有,则继续发送其它字节TX2 BTFSS PIR1,TXIF ;等所有要求发送的数据已经发送完,再额外GOTO TX2 ;写一个字节到TXREG,使最后一个数据能够顺利发送MOVWF TXREGNOP ;延时几个微秒后,关发送允许NOPNOPNOPNOPBSF STATUS,RP0BCF TXSTA,TXENBCF STATUS,RP0CALL LED ;调用显示子程序,将发送的数据显示出来END ;程序完2. 单片机PIC2编程(从动接收)LIST P=16F876#INCLUDE P16F876.INCCBLOCK 0X24COUNTENDCORG 0X0000NOPSTART GOTO MAINORG 0X0100MAIN BSF STATUS,RP0MOVLW 0X10 ;选择同步从动方式MOVWF TXSTABCF STATUS,RP0MOVLW 0X80 ;串行口使能MOVWF RCSTABSF STATUS,RP0BSF TRISC,7 ;关断与外部电路的联系BSF TRISC,6BCF STATUS,RP0MOVLW 0X30 ;从30H单元开始存放接收的数据MOVWF FSRBSF RCSTA,CREN ;接收允许WAIT BTFSS PIR1,RCIF ;等待接收GOTO WAITMOVF RCREG,0 ;读取接收到的数据MOVWF INDF ;将接收到的数据存入PIC2的RAMINCF FSRBTFSS FSR,7 ;所有的数据是否已接收完?GOTO WAIT ;没有,继续接收其它字节NOP ;延时数微秒后,清接收允许位NOPNOPNOPBCF RCSTA,RCENCALL LED ;调用显示子程序,将接受到的数据显示出来END ;程序完PIC单片机与PC机通过串口通信1. PC机编程PC采用Toubr C 进行编写。
PIC 单片机AD 转换数据存储及串口
引言
PIC 单片机A/D 转换后的数据通常需要占用两个8 位宽的RAM 单元, 而PIC 单片机的存储单元有限,因此造成了单片机的存储单元不能被有效利用, 同时通过串口向上位机传送数据时也需要花费较多的时间。
为此提出一种数据打包的方法, 使得相同的数据量占用较少的存储空间, 并可提高传输效率。
1程序设计思路
以10 位的A/D 转换为例, 可以将A/D 转换的结果暂存在a[size] 中, 然后把数组a 中的数据一位一位地取出, 把低8 位和高8 位拆开分别存放, 低8 位存放在数组b 中, 高8 位存放在数组c 中, 由于高8 位的数据中只有2 位是有效数据, 我们可以把有效数据取出组合成一个新的数据存放, 当上传数据后再用相反的方法解码, 把数据恢复到原先的状态。
这样对于10 位的A/D 转换来说可以节省3/8 的空间, 需要向上位机传送的数据也会比较少, 数据传输时间仅为原来的5/8。