PIC单片机AD转换数据存储及串口

合集下载

PIC24系列单片机原理与开发 第6章 AD转换器及编程

PIC24系列单片机原理与开发 第6章 AD转换器及编程
因为只有一个 S/H 和一个 A/D 转换器,所以不能多个输入通道同时采样和转换 ,只能 通过多路开关切换,逐个对输入通道进行采样和转换 。这种多通道顺序采样、转换方式对大 多数应用没有问题,但对于严格要求多通道同步采样的某些应用场合 ,可能会带来通道间的 相位差(时间差)问题,需要在硬件上或软件中进行修正 。
R/W -0
U-0
U-0
R/W-0
U-0
U-0
VCFG<2:0>
未用
未用
CSCNA
未用
未用
bit 15
bit 8
R -0
BUFS bit 7
U-0 未用
R/W -0
R/W -0
R/W -0
SMPI<3:0>
R/W-0
R/W -0 BUFM
R/W -0 ALTS bit 0
其中: U=未用(读为0),R=可读, W=可写,-n =上电复位值
逐次逼近型(SAR)A/D 转换,转换位数或分辨率为 10 位,转换速度最高可达 500 ksps; 最多可有 16 路模拟输入通道,由多路模拟开关切换; 有采样/保持电路(S/H); 具有外部参考电压输入引脚; 有自动通道扫描转换模式; 有多种转换触发源供用户编程选择; 16 个转换结果缓冲器,4 种数据存储格式; 可在 CPU 休眠和空闲模式下工作。
采样完成后,应启动 A/D 转换。PIC24F 提供有 4 种启动 A/D 转换的方式,由位域 SSRC<2:0>的赋值确定。对于自动转换方式(SSRC<2:0>=“111”),采样时间由寄存器 AD1CON3 中的设置值(1~31 个 A/D 的时钟周期 TAD)所确定,采样完毕硬件自动启动 A/D 转换。另 外 3 种结束采样且启动 A/D 转换的方式为:定时器 Timer3 发生匹配时、INT0 引脚产生有 效电平和清零 SAMP 位。对于它们的编程将在下面的应用例程中给予进一步说明 。

PIC单片机 串口通信程序

PIC单片机 串口通信程序
{
TXREG=RCREG; //把接收到的数据发送回去
}
}
#include<pic.h> //包含单片机内部资源预定义
__CONFIG(0xFF32);
//芯片配置字,看门狗关,上电延时开,掉电检测关,低压编程关,加密,4M晶体HS振荡
/****************************************************************************
TRISC=0XFF; //设置C口方向全为输出
SPBRG=0XC; //设置波特率为119200BPS
TXSTA=0X24; //使能串口发送,选择高速波特率
RCSTA=0X90; //使能串口工作,连功 能:主函数
* 入口参数:无
* 出口参数:无
* 说 明:无
****************************************************************************/
void main()
{
要判断中断源标志
****************************************************************************/
void interrupt usart(void)
{
if(RCIE&&RCIF) //判断是否为串口接收中断
RCIE=0X1; //使能接收中断
GIE=0X1; //开放全局中断
PEIE=0X1; //使能外部中断
while(1) //等待中断
/***************************************************************************************************

PIC单片机的AD和DA技术

PIC单片机的AD和DA技术

§7.3 D/A转换技术
• D/A转换器(数模转换器)是把数字量转换成与之成一
定比例的模拟量的线性电路器件。
• 衡量一个D/A转换器的性能的主要参数有:分辨率、转
换时间、精度和线性度等。
• 主要朝着高精度、高速度、高可靠性和低功耗等方面
发展。
• 按分辨率分有八位、十位、十二位、十四位、十六位
几种;按接口形式分有串行与并行的;按芯片集成组 分有单路、双路、四路、八路。主要的厂家有AD公司、 MAXIM公司、TI公司、Linear Technology公司、 Intersil公司、Xicor公司、Cirrus公司等。
– 转换数据可以在SCLK脉冲串的作用下从DOUT 引脚逐位输出,数据输出的顺序为先高位后低 位。
• 在SCLK的下降沿,DOUT输出数据,在
SCLK的上升沿,数据稳定。
• 在SCLK信号为高电平期间单片机从DOUT引
脚上读数据。需要13个时钟脉冲下降沿来 传送12位数据元和一个导引位。
4 应用实例
• 旁路电容选择
– 推荐最低值是0.1μF. 如果基准的输出阻抗值较高 或是内含纹波等噪声,则紧靠于引脚REF旁安装 一个的旁路电容。
3 MAX187时序
• MAX187的接口时序
3 MAX187时序(续1)
• Max187转换和读数据操作由/CS和SCLK引
脚的数字输入信号控制。
• /CS的下降沿触发转换序列:
• ⑧等待A/D转换完成,读取转换结果
– 当启动A/D转换后,ADCON0<2>会一直保持高 电平,到转换结束自动跳到低电平。通过检测 这一位,判断A/D的转换状态。转换结束后可 以直接读取结果。
例片内RA0通道A/D转换

PIC24系列单片机原理与开发第6章AD转换器及编程

PIC24系列单片机原理与开发第6章AD转换器及编程

PIC24系列单片机原理与开发第6章AD转换器及编程AD转换器是一种用于将模拟信号转换为数字量的设备,它的主要用途是将模拟量转换为可用于数字控制系统的数字信号。

PIC24系列单片机内置了多路/低速模拟输入AD转换器,可以实现对模拟量的采集、处理和控制。

AD转换器的编程十分复杂,需要明确程序对模拟量的要求,包括采样率、量程、精度等,还需要根据PIC24系列单片机的资源情况,合理配置AD转换器的参数,以便实现模拟量的有效读取。

1)可以多路采样:多路采样可以提高采样精度,在故障时可以减少恢复时间,还可以提高采样率。

2)采样率:根据实际应用需要,调整单片机的时钟频率,来达到最佳的采样率。

3)精度范围:根据实际应用需要,调整AD转换器的精度范围,以保证采集到的数据和处理能力的均衡使用。

4)通道选择:根据实际应用,选择多路采样中的其中一路,来使用最佳的采样精度。

单片机ad转换原理

单片机ad转换原理

单片机ad转换原理单片机AD转换原理。

单片机(Microcontroller)是一种集成了微处理器、存储器和各种输入输出设备的微型计算机系统。

在很多电子设备中,单片机都扮演着至关重要的角色。

而AD转换(Analog to Digital Conversion)则是单片机中非常重要的功能之一,它可以将模拟信号转换为数字信号,使得单片机可以对外部的模拟信号进行采集和处理。

本文将介绍单片机AD转换的原理及相关知识。

AD转换的原理是利用单片机内部的模数转换器(ADC)来实现的。

模数转换器是一种将模拟信号转换为数字信号的电路,它可以将模拟信号的大小转换为相应的数字值。

在单片机中,模数转换器可以通过一定的采样和量化过程,将模拟信号转换为数字信号,并输出到单片机的数据总线上,以便单片机进行进一步的处理。

在进行AD转换时,首先需要对模拟信号进行采样。

采样是指在一定时间间隔内对模拟信号进行取样,获取其大小。

这样可以将连续的模拟信号转换为离散的信号。

然后,对采样后的信号进行量化。

量化是指将连续的模拟信号转换为一系列离散的数字值。

在单片机中,量化通常是按照一定的精度和分辨率进行的,精度越高,分辨率越大,转换后的数字值越接近原模拟信号的真实数值。

单片机中的ADC模块通常由输入端、采样保持电路、比较器、计数器、数字转换器和控制逻辑等部分组成。

当单片机需要进行AD转换时,首先需要将模拟信号输入到ADC的输入端,然后ADC会对输入信号进行采样和量化,最终输出转换后的数字信号。

在这个过程中,ADC的控制逻辑会根据预设的转换精度和采样频率等参数,控制ADC的工作状态,以保证转换的准确性和稳定性。

在实际应用中,单片机的AD转换功能被广泛应用于各种测控系统、仪器仪表、传感器等领域。

通过AD转换,单片机可以对外部的模拟信号进行采集和处理,实现数据的数字化和处理,为系统的控制和监测提供了重要的支持。

同时,单片机的AD转换功能也为各种信号处理算法和数字信号处理提供了基础,为系统的功能和性能提升提供了可能。

pic单片机自学手记之adc采样采集模数转换

pic单片机自学手记之adc采样采集模数转换

//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 里边怎样设置每页不同的页眉?如何使不同的章节显示的页眉不同?答:分节,每节可以设置不同的页眉。

PIC单片机ADC程序

PIC单片机ADC程序

//实验目的:熟悉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转换类型概述

PIC单片机与16位串行D-A转换类型概述

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 转换器
如果只有电子开关&Kappa;,将恒流源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进行连续电压转换
单片机的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单片机串口通讯程序。

这个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单片机AD转换汇编程序

PIC单片机AD转换汇编程序;此汇编程序实现A/D转换功能,应用于pic单片机上,A/D采用中断方式。

该程序通过单片机的RA2模拟通道送入;一直流电压,当送入的直流电压大于2.5V时,8个LED闪动,当直流电压恢复到2.5V以下;时,LED停止闪动。

为了防止干扰,本程序对直流电压采样10次后再作判断,中间的采样结;果用间接寻址的方式存取。

LIST P=18F458INCLUDE "P18F458.INC"TIMES EQU 0X20DEY EQU TIMES+1ACCALO EQU TIMES+2 ;ACCA为双精度加数寄存器ACCAHI EQU TIMES+3ACCBLO EQU TIMES+4 ;ACCB为双精度加法的结果寄存器ACCBHI EQU TIMES+5FLAG EQU TIMES+6DEYH EQU TIMES+7DEYL EQU TIMES+9BEGFSR EQU 0X30 ;间接寻址FSR的起始值(宏定义方式给出)ORG 0X0000GOTO MAINORG 0X0008GOTO INTSERVE ;转向中断服务子程序;***双字节减法子程序,入口地址ACCB-ACCA,出口地址ACCB*** D_SUB CALL NEG_A ;求ACCA的补码;***双字节加法子程序,入口地址ACCB+ACCA,出口地址ACCB*** D_ADD MOVF ACCALO,0 ;ACCB和ACCA低半字节相加ADDWF ACCBLOBTFSC STATUS,C ;有进位否?INCF ACCBHI ;有,ACCB高字节加1,再加ACCAHIMOVF ACCAHI,0 ;ACCA、ACCB高半字节相加ADDWF ACCBHIRETURN ;子程序返回;************** ACCA取补子程序*****************NEG_ACOMF ACCALO ;ACCALO取反加1INCF ACCALOBTFSC STATUS,Z ;低8位有进位吗?DECF ACCAHI ;有,ACCAHI减1,再取反COMF ACCAHI ;否则ACCAHI直接取反RETURN ;子程序返回;*********初始化子程序***************CLRF INTCON ;禁止总中断和外围中断MOVLW 0X51MOVWF ADCON0 ;选择AD通道为RA2,且打开A/D转换器;在工作状态,且使AD 转换时钟为8ToscMOVLW 0X80MOVWF ADCON1 ;转换结果右移,即ADRESH寄存器的高6 ;位为"0",且把RA2口设置为模拟量输入式;(注意后面要把RA5改成数据I/O方式,以;输出显示琐存信号)BCF PIR1,ADIF ;清除A/D转换标志BSF PIE1,ADIE ;A/D转换中断允许BSF INTCON,PEIE ;外围中断允许BSF IPR1,ADIP ;B口变位中断高优先级BSF RCON,7 ;使能中断优先级BSF TRISA,2 ;设置RA2为输入方式BCF TRISA,5 ;置RA5为输出方式,以输出锁存信号BCF TRISC,5BCF TRISC,3 ;设置SCK与SDO为输出方式MOVLW 0XC0MOVWF SSPSTAT ;设置SSPSTAT寄存器MOVLW 0X30MOVWF SSPCON1 ;设置SPI的控制方式,允许SSP方式,并;且时钟下降沿发送,与"74HC595当其;SCLK从低到高电平跳变时,串行输入数据;(DI)移入寄存器"的特点相应CLRF FLAGRETURN;*********软件延时子程序****************DELAYMOVLW 0XFFMOVWF DEYHAGAIN1 MOVLW 0XFFMOVWF DEYLAGAIN2 NOPDECFSZ DEYLGOTO AGAIN2DECFSZ DEYHGOTO AGAIN1RETURN;*************** A/D中断服务子程序***************** INTSERVE BCF PIR1,ADIF ;清除A/D转换标志MOVF ADRESH,WMOVWF INDF0 ;读取并存储A/D转换结果的高两位INCF FSR0LMOVF ADRESL,WMOVWF INDF0INCF FSR0L ;读取并存储A/D转换结果的低8位DECF TIMES,1 ;A/D转换次数减1MOVLW 0X02MOVWF DEYLOOP13 DECFSZ DEY,1GOTO LOOP13 ;给予一定的延时,保证两次A/D转换期间;2Tad的间隔时间和电容的采样时间BSF ADCON0,2 ;启动下一次A/D转换RETFIE ;中断返回;********** LED闪烁报警子程序*************ALARMMOVLW 0X01XORWF FLAG,1BTFSS FLAG,0CALL DISPLAY0 ;调用显“0”子程序NOPBTFSC FLAG,0CALL DISPDARK ;调用显“DARK”子程序RETURN;**********显全0子程序*************DISPLAY0TRANSMIT ;SPI发送显示子模块CLRF PORTA ;LACK送低电平,为锁存做准备MOVLW 0X08MOVWF TIMESLOOP80 MOVLW 0XC0 ;显示值为0,C0H为0的段码MOVWF SSPBUF ;启动发送WAITBTFSS PIR1,SSPIFGOTO WAIT ;等待发送结束BCF PIR1,SSPIF ;清除中断标志DECFSZ TIMESGOTO LOOP80 ;一次要发送完8个数据BSF PORTA,5 ;最后给一个锁存信号,代表一次显示任务完成RETURN;**********显示全DARK子程序*************DISPDARKTRANSMIT1 ;SPI发送显示子模块CLRF PORTA ;LACK送低电平,为锁存做准备MOVLW 0X08LOOP8D MOVLW 0XFF ;显示值为0,FFH为DARK的段码MOVWF SSPBUF ;启动发送WAIT1BTFSS PIR1,SSPIFGOTO WAIT1 ;等待发送结束BCF PIR1,SSPIF ;清除中断标志DECFSZ TIMESGOTO LOOP8D ;一次要发送完8个数据BSF PORTA,5 ;最后给一个锁存信号,代表一次显示任务完成RETURN;*********PIC单片机A/D转换汇编程序主程序************;转载单片机网MAIN NOPCALL INITIAL ;初始化LOOPMOVLW 0X80 ;转换结果右移,及ADRESH寄存器的高6位为"0" ;且把RA2口设置为模拟量输入式(注意后面要把; RA5改成数据I/O方式,以输出显示琐存信号)MOVWF ADCON1MOVLW BEGFSRMOVWF FSR0L ;给出间接寻址时FSR的初值MOVWF TIMES ;每一轮A/D连续采样10次BSF INTCON,GIE ;总中断打开,及可以进行A/D转换中断BSF ADCON0,2 ;启动A/D转换LOOP1 MOVF TIMES,WBTFSS STATUS,ZGOTO LOOP1 ;等待A/D转换中断BCF INTCON,GIE ;A/D转换次数到10次,关闭中断NOPCLRF ACCBHICLRF ACCBLO ;双精度加法的结果寄存器清0,为后面准备MOVLW 0X0AMOVWF TIMESMOVLW BEGFSRMOVWF FSR0LLOOP15 MOVF INDF0,WMOVWF ACCAHIINCF FSR0LMOVF INDF0,WMOVWF ACCALOINCF FSR0LCALL D_ADDDECFSZ TIMESGOTO LOOP15NOP ;计算得到10次A/D转换的和MOVLW 0X84MOVWF ADCON1 ;把RA5设成数字I/O,以输出显示锁存信号MOVLW 0X14 MOVWF ACCAHICLRF ACCALOCALL D_SUB ;通过双精度减判断模拟量是否达到报警限;度(1400H=200H*0AH,200H与2.5V对应)BTFSS ACCBHI,7CALL ALARM ;若ACCBHI的最高位为1,则证明减法结;果为负,即直流电压值超过2.5V,则报警NOPBTFSC ACCBHI,7CALL DISPLAY0 ;若没有超过2.5V,则不报警,8个LED ;同时显示0CALL DELAY ;软件延时,使电压检测不要过于频繁GOTO LOOP ;重复检测输入的直流电压值END。

单片机实现ad转换的原理

单片机实现ad转换的原理

单片机实现ad转换的原理
AD转换(Analog-to-Digital Conversion)是将连续变化的模拟信号转换为数字信号的过程。

在单片机中,AD转换通常由模拟输入引脚、采样保持电路、比较器和计数器等组成。

下面是单片机实现AD转换的一般原理:
1. 模拟输入引脚:单片机有专门的引脚用于接收模拟信号。

该引脚可以连接外部模拟信号源,如传感器等。

2. 采样保持电路:模拟输入信号需要经过采样保持电路。

这个电路会根据某种时钟信号,周期性地对输入信号进行采样,并将采样结果保持在一个电容中,以供后续的转换过程使用。

3. 比较器:采样保持结束后,采样保持电路的输出会送到一个比较器。

比较器会将采样信号与参考电压进行比较,产生一个数字信号,用以表示该采样信号是大于还是小于参考电压。

4. 计数器:比较器的输出信号会连接到一个计数器模块。

计数器会对比较器输出的数字信号进行计数,以产生AD转换的结果。

计数器的计数周期和分辨率决定了转换的精度。

5. 数字输出:转换完成后,计数器的结果会输出到单片机的某个寄存器中,以供后续的数据处理使用。

这样,模拟信号就被转换为数字信号,可以被单片机的其他部分处理。

需要注意的是,AD转换的精度和速度取决于单片机内部的AD转换模块的性能,以及外部电路的设计和连接方式。

每种单片机的具体实现方式有所差异,所以在实际应用中,需要查阅相关单片机的参考手册,了解具体的AD转换原理和实现方式。

dsPIC_AD转换的使用总结

dsPIC_AD转换的使用总结

dsPIC 单片机AD转换的使用总结1、要使用模拟输入做AD转换,将相应的TRIS寄存器对应的位置为输入。

以dsPic24FJ16GA002为例,假设模拟输入接在AN10上,必须使TRISBbits.TRISB14=1;2、配置AD1PCFG 寄存器,使对应的模拟输入引脚位为0,对应的数字引脚置1;如:AD1PCFG=0xFFF7; 说明在AN命名的引脚中只有AN3为模拟引脚,其它ANx都是数字引脚。

3、手动采样和自动采样的控制AD转换过程分采样和转换两个过程,什么时候开始采样,什么时候开始转换,可以人工控制,也可以自动运行,通过配置AD1CON1可达到目的。

(1)将AD1CON1中的SSRC2:SSRC0配置为000:清零SAMP 位结束采样并启动转换这时,AD1CON1中的SAMP位是唯一控制采样的开关位,置1就开始“采样”,再清零,就开始“转换”。

SAMP位的置1有自动置1和手动置1两种方式,取决与ASAM 的设置,当ASAM设定为1时,就成了自动转换,每次转换完成后,SAMP位就自动置1,也就是自动开始采样,等待转换开始的命令,就立即开始转换过程。

当ASAM设定为0的时候,采样和转换完全由人工控制,人工控制的转换过程是:SAMP位置1,开始采样,间隔一段合适的时间,再将SAMP位清零,就开始转换。

转换结束后,就停止了,如果还想继续转换,就重复上述过程。

(2)将AD1CON1中的SSRC2:SSRC0配置为001:由INT0 引脚信号的有效跳变沿结束采样并启动转换这时,转换开始是看INT0引脚的脉冲沿,是上升沿还是下降沿取决于INTCON2的配置。

但采样SAMP位仍要单独置1。

(3)将AD1CON1中的SSRC2:SSRC0配置为010:Timer3 比较结束采样并启动转换这时,转换开始是由Timer3控制,Timer3定时周期到就开始转换,可根据时钟周期通过T3CON 和PR3的配置来改变Timer3的定时周期,但无需指定Timer3的中断,也不用理会Timer3的中断标志。

PIC16f串口通信程序

PIC16f串口通信程序

#include <pic.h>#define INIT_OSC() OSCCON = 0x77unsigned char error=0x00; //错误数据帧,丢弃bit Q=0; //一次数据帧接收完成标志位unsigned char data;void interrupt isr(void) //接收中断处理{unsigned char Temp;if(RCIF&&RCIE){if(FERR)//监测是否有帧错误{error=RCREG;}if(OERR){CREN=0 ;CREN=1 ; //接收模块被复位重置,OERR清零}data=RCREG; //保存每一次接收到的数据Q=1;}if(T0IF) //TIME0{T0IF = 0;}else{if(RBIF ){Temp = PORTB;RBIF = 0;}}}void usart_init() //串口初始化{INIT_OSC();//InitPort();INTCON=0 ; // 关闭所有的中断TRISC6=0 ;//TX脚输出TRISC7=1 ;//RX脚输入RC6=1;RC7=1;//SPBRG=51;//波特率9600,6M时钟SPBRG=51;//波特率9600,8M时钟BRGH=1; //高速波特率SYNC=0;SPEN=1; //异步串口工作方式TXEN=1; //USART工作于发送器方式TXIE=0; //发送不需要中断处理RCIE=1; //接收需要中断处理CREN=1; //激活接收器PEIE = 1;GIE = 1;}void putch(unsigned char byte) //发送一个字节的数据{unsigned int t=0;TXREG = byte;for(t=0;t<50000;t++){if(TRMT==1){asm("nop");break;}}}void main() //将上位机发送的数据通过串口显示{unsigned int t=0; unsigned char x=0;usart_init();for(x=0;x<5;x++){for(t=0;t<10000;t++) {;}for(t=0;t<10000;t++) {;}}while(1){if(Q==1){putch(data);Q=0;}}}。

PIC16F917单片机c语言源程序ad变换,pwm输出,数码显示

PIC16F917单片机c语言源程序ad变换,pwm输出,数码显示

PIC16F917单片机c语言源程序ad变换,pwm输出,数码显示//说明:完整的PIC16F917编写的c语言程序,通过编译,内容包含有ad变换,pwm输出,数码显示(通过串口移位显示),串行口通讯等#include;#define uchar unsigned char#define uint unsigned int__CONFIG(0x20e4);#define choose1 RC4#define choose2 RC3#define power_high RA6#define power_low RA4#define relay_w RE2#define relay_v RB5#define relay_u RA0#define data1 RD0#define clk1 RA7#define bell RD3#define power_supply RD6#define pha RB2#define phb RB3#define phc RB4#define spa RB0#define spb RB1#define up RC1#define down RC2#define up1 RD2#define down1 RC0#define safe RD7#define start RD5 #define speeder RD4 #define KDF RD1#define test_num1 1 #define test_num2 2 #define test_num3 3 #define test_num4 4 #define test_num5 5 #define test_num6 6 #define test_num7 7 #define test_num8 8 #define test_num9 9 #define test_num10 10#define test_num11 11 #define test_num12 12 #define test_num13 13 #define test_num14 14 #define test_num15 15 #define test_num16 16 #define test_num17 17 #define test_num18 18 #define test_num19 19 #define test_num20 20 #define test_num21 21 #define test_num22 22 #define test_num23 23 #define test_num24 24 #define test_num25 25 #define test_num26 26 #define test_num27 27 #define test_num28 28 #define hold 29#define stop 30#define setout 31#define test_err 32#define power 33#define TEST_5045 34#define TEST_5046 35#define TEST_5055B 36#define power1 37#define setout1 38#define setout2 39#define disp_refresh 100const uchartable[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0, 0xfe,0xf6,0xee,0xfe,0x9c,0xfc,0x9e,0x8e,2,0x10,0x 80,4};const uchartable1[]={0xfd,0x61,0xdb,0xf3,0x67,0xb7,0xbf,0xe1 ,0xff,0xf7,0xef,0xff,0x9d,0xfd,0x9f,0x8f,0x6f,0x0 d};ucharkeyvalue=1,keystate=0,keypull=0,status=setout,rcd ata1=0x55,rcdata2=0x55,rcdata3=0x55,status2=0; ucharerr_status=0,disp_run=0,ad_test=0,test15_tmp1=0,t est15_tmp2=0,test15_tmp3=0,test15_tmp4=0,disp_mod=0,disp_hold=0;uint rcdata,disp_time1=0,ad_data1,ad_data2; volatile unsigned intkeytime=0,bell_time=0,test_time=0,err_time=0,disp _time=0,tx_time=0;void disp(uchar num1,uchar num2,uchar num3); // 76usvoid disp10(uchar j); // 314usvoid keyscan(void);void key1(void);void init(void);void delaye(uint x);void outpwm(uchar x);void addisp(uint a);void addisp_8(uchar a);void disp20(uchar i,uchar j);void disp16(uint j);void err_disp(uchar j);void disp21(uchar i,uchar j);uint ad(uchar x);//3次加和一个除法 87usvoid main(){uchar tx_conut=0;init();while(1){if(status==setout1){if(disp_time>;disp_refresh){disp(table[18],table[18],table[18]);disp_time=0;}power_supply=0;power_high=0;power_low=0;relay_u=0 ;relay_v=0;relay_w=0;spa=1;spb=1;pha=1;phb=1;phc=0;up=0;down=0;safe=0; up1=0;down1=0;}else if(status==setout2){if(disp_time>;disp_refresh){disp(table[19],table[19],table[19]);disp_time=0;}power_supply=0;power_high=0;power_low=0;relay_u=0 ;relay_v=0;relay_w=0;spa=1;spb=1;pha=1;phb=1;phc=0;up=0;down=0;safe=0; up1=0;down1=0;}else if(status==setout){if(disp_time>;disp_refresh){disp(table[16],table[16],table[16]);disp_time=0;}power_supply=0;power_high=0;power_low=0;relay_u=0 ;relay_v=0;relay_w=0;spa=1;spb=1;pha=1;phb=1;phc=0;up=0;down=0;safe=0; up1=0;down1=0;// TRISC7=0;// RC7=1;// speeder=1;if(keypull==1){bell=0;bell_time=0;keypull=0;status=power1;test_time=0;}}else if(status==power1){if(status2==TEST_5055B){TRISC7=1;TXSTA=0x26;RCSTA=0x90;SPBRG=103; //4.8k波特率power_supply=1;power_high=0;power_low=0;relay_u=0 ;relay_v=0;relay_w=0;spa=1;spb=1;pha=1;phb=1;phc=0;up=0;down=0;safe=0; up1=0;down1=0;speeder=1;if(tx_time>;50&&TRMT==1){if(tx_conut==0){TXREG=0xfe;tx_time=0;tx_conut=1;}else if(tx_conut==1){TXREG=0xfd;tx_time=0;tx_conut=2;}else if(tx_conut==2){TXREG=0xfc;tx_time=0;tx_conut=3;}else if(tx_conut==3){TXREG=0xfb;tx_time=0;tx_conut=4;}else if(tx_conut==4){TXREG=0xfa;tx_time=0;tx_conut=0;}}if(rcdata1==0xaa)status=power;if(test_time>;1500)status=setout2; }elseif(status2==TEST_5046||status2==TEST_5045)status= power;}else if(status==power){power_supply=1;power_high=0;power_low=0;relay_u=0 ;relay_v=0;relay_w=0;spa=1;spb=1;pha=1;phb=1;phc=0;up=0;down=0;safe=0; up1=0;down1=0;if(disp_time>;disp_refresh){disp(table[17],table[17],table[17]);disp_time=0;}if(status2==TEST_5046||status2==TEST_5045){TRISC7=0;RC7=1;speeder=1;}if(keypull==1){bell=0;bell_time=0;keypull=0;status=test_num1;TRISC7=1;TXSTA=0x26;RCSTA=0x90;SPBRG=103; //4.8k波特率test_time=0;disp_run=1;disp_time1=0;ad_test=1;ADCON0=0x85; //通道1ADCON1=0x50;}}else if(status==test_num1){spa=1;spb=1;pha=1;phb=1;phc=1;up=1;down=1;safe=1;up1=0;down1=0;power_supply=1;power_high=0;power_low=0;relay_u=0 ;relay_v=0;relay_w=0;speeder=1;if(test_time>;100&&test_time;1000){status=test_err;err_status=1;err_time=0;disp_hold=1;}}else if(status==test_num2){spa=0;spb=0;pha=0;phb=0;phc=0;up=0;down=0;safe=0; up1=0;down1=0;power_supply=1;power_high=0;power_low=0;relay_u=0 ;relay_v=0;relay_w=0;speeder=1;if(test_time>;100&&test_time;1000){status=test_err;err_status=2;err_time=0;disp_hold=1;}}else if(status==test_num3){if(status2==TEST_5046){spa=1;spb=1;pha=1;phb=0;phc=0;up=1;down=1;safe=1; up1=1;down1=1;power_supply=1;power_high=0;power_low=0;relay_u=0 ;relay_v=0;relay_w=0;speeder=1;if(test_time>;100&&test_time;1000){status=test_err;err_status=3;err_time=0;disp_hold=1;}}else if(status2==TEST_5055B||status2==TEST_5045) {outpwm(200);test_time=0;status=test_num5;}}else if(status==test_num4){spa=0;spb=0;pha=0;phb=0;phc=0;up=0;down=0;safe=0; up1=0;down1=0;power_supply=1;power_high=0;power_low=0;relay_u=0 ;relay_v=0;relay_w=0;speeder=1;if(test_time>;100&&test_time;1000){status=test_err;err_status=4;err_time=0;disp_hold=1;}}else if(status==test_num5){speeder=0;power_supply=1;power_high=0;power_low=0 ;relay_u=0;relay_v=0;relay_w=0;spa=1;spb=0;pha=0;phb=0;phc=0;up=0;down=0;safe=0; up1=0;down1=0;if(test_time>;100&&test_time;172&&rcdata1;172&&rc data2;172&&rcdata3;1000){status=test_err;err_status=5;err_time=0;disp_hold=1;}}else if(status==test_num6){speeder=0;power_supply=1;power_high=0;power_low=0 ;relay_u=0;relay_v=0;relay_w=0;spa=1;spb=0;pha=0;phb=0;phc=0;up=0;down=0;safe=0; up1=0;down1=0;if(test_time>;100&&test_time;101&&rcdata1;101&&rc data2;101&&rcdata3;1000){status=test_err;err_status=6;err_time=0;disp_hold=1;}}else if(status==test_num7){speeder=0;power_supply=1;power_high=0;power_low=0 ;relay_u=0;relay_v=0;relay_w=0;spa=1;spb=0;pha=0;phb=0;phc=0;up=0;down=0;safe=0; up1=0;down1=0;if(test_time>;100&&test_time;70&&rcdata1;70&&rcda ta2;70&&rcdata3;1000){status=test_err;err_status=7;err_time=0;disp_hold=1;}}else if(status==test_num8){speeder=0;power_supply=1;power_high=0;power_low=0 ;relay_u=0;relay_v=0;relay_w=0;spa=1;spb=0;pha=0;phb=0;phc=0;up=0;down=0;safe=0; up1=0;down1=0;if(test_time>;100&&test_time;14&&rcdata1;14&&rcda ta2;14&&rcdata3;1000){status=test_err;err_status=8;err_time=0;disp_hold=1;}}else if(status==test_num9) //2.4---2.53{if(test_time;=200&&test_time;=500&&test_time;=500 &&test_time;500&&ad_data1;500&&ad_data2;=1100) {status=test_err;err_status=9;err_time=0;ADON=0;ad_test=0;disp_mod=1;}}}else if(status==test_num10){if(test_time;=200&&test_time;=500&&test_time;=500 &&test_time;500&&ad_data1;500&&ad_data2;=1100) {status=test_err;err_status=10;err_time=0;ADON=0;ad_test=0;disp_mod=1;}}}else if(status==test_num11){if(test_time;=200&&test_time;=500&&test_time;=500 &&test_time;500&&ad_data1;500&&ad_data2;=1100){status=test_err;err_status=11;err_time=0;ADON=0;ad_test=0;disp_mod=1;}}}else if(status==test_num12) //+u,-V{if(test_time;=1000&&test_time;1000){spa=0;spb=1;p ha=1;phb=0;}elseif(test_time;1005){spa=0;spb=1;pha=1;phb=1;}elseif(test_time;1015){spa=0;spb=1;pha=1;phb=0;}ad_data1=0;}elseif(test_time>;=1100&&test_time;1100&&test_time;14 00&&ad_data1>;473&&ad_data1;2200){status=test_err;err_status=12;err_time=0;// SPEN=0;// CREN=0;// TRISC7=0;// RC7=1;ADON=0;ad_test=0;disp_mod=1;}}}else if(status==test_num13) //+U,-v{if(test_time;=1000&&test_time;1000){spa=0;spb=1;p ha=1;phb=0;}elseif(test_time;1005){spa=0;spb=1;pha=1;phb=1;}elseif(test_time;1015){spa=0;spb=1;pha=1;phb=0;}ad_data1=0;}elseif(test_time>;=1100&&test_time;1100&&test_time;14 00&&ad_data1>;534&&ad_data1;2200){status=test_err;err_status=13;err_time=0;// SPEN=0;// CREN=0;// TRISC7=0;// RC7=1;ADON=0;ad_test=0;disp_mod=1;}}}else if(status==test_num14) //+v,-U{if(test_time;=1000&&test_time;1000){spa=0;spb=1;p ha=1;phb=0;}elseif(test_time;1005){spa=0;spb=1;pha=1;phb=1;}elseif(test_time;1015){spa=0;spb=1;pha=1;phb=0;}}else if(test_time>;=1100&&test_time;1100){spa=1;spb=1;pha=0;phb=1;power_supply=1;power_high=1;power_low=0;relay_u=1 ;relay_v=0;relay_w=0;speeder=0;phc=0;up=0;down=0;safe=0;up1=0;down1=0;if(test_time>;1400&&ad_data1>;473&&ad_data1;2200) {status=test_err;err_status=14;err_time=0;// SPEN=0;// CREN=0;// TRISC7=0;// RC7=1;ADON=0;ad_test=0;disp_mod=1;}}}else if(status==test_num15) //+V,-u{if(test_time;=1000&&test_time;1000){spa=0;spb=1;p ha=1;phb=0;}elseif(test_time;1005){spa=0;spb=1;pha=1;phb=1;}elseif(test_time;1015){spa=0;spb=1;pha=1;phb=0;} }elseif(test_time>;=1100&&test_time;1100&&test_time;14 00&&ad_data1>;534&&ad_data1;2200){status=test_err;err_status=15;err_time=0;// SPEN=0;// CREN=0;/// TRISC7=0;// RC7=1;ADON=0;ad_test=0;disp_mod=1;}}}else if(status==test_num16) //-W,+v{if(test_time;=1000&&test_time;1000){spa=0;spb=1;p ha=1;phb=0;}elseif(test_time;1005){spa=0;spb=1;pha=1;phb=1;}elseif(test_time;1015){spa=0;spb=1;pha=1;phb=0;} }elseif(test_time>;=1100&&test_time;1100&&test_time;14 00&&ad_data1>;473&&ad_data1;2200){status=test_err;err_status=16;err_time=0;// SPEN=0;// CREN=0;// TRISC7=0;// RC7=1;ADON=0;ad_test=0;disp_mod=1;}}}else if(status==test_num17) //+W-v{if(test_time;=1000&&test_time;1000){spa=0;spb=1;p ha=1;phb=0;}elseif(test_time;1005){spa=0;spb=1;pha=1;phb=1;}elseif(test_time;1015){spa=0;spb=1;pha=1;phb=0;}ad_data1=0;}else if(test_time>;=1100&&test_time;1100){spa=1;spb=1;pha=0;phb=0;power_supply=1;power_high=0;power_low=1;relay_u=0 ;relay_v=0;relay_w=1;speeder=0;phc=0;up=0;down=0;safe=0;up1=0;down1=0;if(test_time>;1400&&ad_data1>;534&&ad_data1;2200) {status=test_err;err_status=17;err_time=0;// SPEN=0;// CREN=0;// TRISC7=0;// RC7=1;ADON=0;ad_test=0;disp_mod=1;}}}else if(status==test_num18) //+v,-U{if(test_time;=1000&&test_time;1000){spa=0;spb=1;p ha=1;phb=0;}elseif(test_time;1005){spa=0;spb=1;pha=1;phb=1;}elseif(test_time;1015){spa=0;spb=1;pha=1;phb=0;}ad_data1=0;}else if(test_time>;=1100&&test_time;1100){spa=1;spb=1;pha=0;phb=1;power_supply=1;power_high=1;power_low=0;relay_u=1 ;relay_v=0;relay_w=0;speeder=0;phc=0;up=0;down=0;safe=0;up1=0;down1=0;if(test_time>;1400&&rcdata1>;115&&rcdata1;2200) {status=test_err;err_status=18;err_time=0;SPEN=0;CREN=0;// TRISC7=0;// RC7=1;// ADON=0;// ad_test=0;}}}else if(status==test_num19) //+U,-v{if(test_time;=1000&&test_time;1000){spa=0;spb=1;p ha=1;phb=0;}elseif(test_time;1005){spa=0;spb=1;pha=1;phb=1;}elseif(test_time;1015){spa=0;spb=1;pha=1;phb=0;}ad_data1=0;}elseif(test_time>;=1100&&test_time;1100&&test_time;14 00&&rcdata1>;130&&rcdata1;2200){status=test_err;err_status=19;err_time=0;SPEN=0;CREN=0;// TRISC7=0;// RC7=1;// ADON=0;}}}else if(status==test_num20) //-W,+v{if(test_time;=1000&&test_time;1000){spa=0;spb=1;pha=1;phb=0;}else if(test_time;1005){spa=0;spb=1;pha=1;phb=1;} else if(test_time;1015){spa=0;spb=1;pha=1;phb=0;} ad_data1=0;}elseif(test_time>;=1100&&test_time;1100&&test_time;1400&&rcdata1>;115&&rcdata1;2200){status=test_err;err_status=20;err_time=0;SPEN=0;CREN=0;// RC7=1;// ADON=0;// ad_test=0;}}}else if(status==test_num21) //+W-v{if(test_time;=1000&&test_time;1000){spa=0;spb=1;p ha=1;phb=0;}elseif(test_time;1005){spa=0;spb=1;pha=1;phb=1;}elseif(test_time;1015){spa=0;spb=1;pha=1;phb=0;}ad_data1=0;}else if(test_time>;=1100&&test_time;1100){spa=1;spb=1;pha=0;phb=0;power_supply=1;power_high=0;power_low=1;relay_u=0 ;relay_v=0;relay_w=1;speeder=0;phc=0;up=0;down=0;safe=0;up1=0;down1=0;if(test_time>;1400&&rcdata1>;130&&rcdata1;2200) {status=test_err;err_status=21;err_time=0;SPEN=0;CREN=0;// TRISC7=0;// RC7=1;// ADON=0;// ad_test=0;}}}else if(status==test_num22){if(status2==TEST_5055B){if(test_time;900&&test_time;700&&ad_data1>;490&&a d_data1;1500){status=test_err;err_status=22;err_time=0;ADON=0;ad_test=0;disp_mod=1;}}elseif(status2==TEST_5046||status2==TEST_5045)status= test_num26;}else if(status==test_num23){if(test_time;900&&test_time;700&&ad_data1>;490&&a d_data1;1500){status=test_err;err_status=23;err_time=0;ADON=0;ad_test=0;disp_mod=1;}}else if(status==test_num24){if(test_time;900&&test_time;700&&ad_data1>;490&&a d_data1;1500){status=test_err;err_status=24;err_time=0;ADON=0;ad_test=0;disp_mod=1;}}else if(status==test_num25){if(test_time;900&&test_time;700&&ad_data1>;490&&a d_data1;1500){status=test_err;err_status=25;err_time=0;ADON=0;ad_test=0;disp_mod=1;}}else if(status==test_num26){speeder=0;power_supply=1;power_high=0;power_low=0 ;relay_u=0;relay_v=0;relay_w=0;speeder=0;KDF=0; spa=1;spb=0;pha=1;phb=0;if(test_time>;100&&test_time;240&&rcdata;1000) {status=test_err;err_status=26;err_time=0;disp_hold=1;}}else if(status==test_num27){speeder=0;power_supply=1;power_high=0;power_low=0 ;relay_u=0;relay_v=0;relay_w=0;speeder=0;KDF=0; spa=1;spb=0;pha=0;phb=1;if(test_time>;200&&test_time;220&&rcdata;400) {status=test_err;err_status=27;err_time=0;SPEN=0;CREN=0;// TRISC7=0;// RC7=1;// ADON=0;}}else if(status==test_num28){if(status2==TEST_5046){disp_run=0;power_supply=1;power_high=0;power_low= 0;relay_u=0;relay_v=0;relay_w=0;speeder=0;KDF=0; spa=0;spb=0;pha=0;phb=1;test15_tmp3=rcdata1;test15_tmp4=rcdata2;if(test_time>;100){if((test15_tmp3&0x20)==0)test15_tmp1=test15_tmp3; else test15_tmp2=test15_tmp3;if((test15_tmp4&0x20)==0)test15_tmp1=test15_tmp4; else test15_tmp2=test15_tmp4;disp20(test15_tmp1,test15_tmp2);}}else if(status2==TEST_5045){disp_run=0;power_supply=1;power_high=0;power_low= 0;relay_u=0;relay_v=0;relay_w=0;speeder=0;KDF=0; spa=0;spb=0;pha=0;phb=1;test15_tmp3=rcdata1;test15_tmp4=rcdata2;if(test_time>;100){if((test15_tmp3&0x20)==0)test15_tmp1=test15_tmp3; else test15_tmp2=test15_tmp3;if((test15_tmp4&0x20)==0)test15_tmp1=test15_tmp4; else test15_tmp2=test15_tmp4;disp21(test15_tmp1,test15_tmp2);test_time=0;}}else if(status2==TEST_5055B)status=setout1;}else if(status==test_err){disp_run=0;//power_supply=0;power_high=0;power_low=0;relay_u=0 ;relay_v=0;relay_w=0;speeder=0;KDF=0;speeder=0; if(disp_hold==1){if(err_status==26){power_supply=1;power_high=0;power_low=0;relay_u= 0;relay_v=0;relay_w=0;speeder=0;KDF=0;speeder=0;} else{power_supply=1;power_high=0;power_low=0;relay_u= 0;relay_v=0;relay_w=0;speeder=0;KDF=0;speeder=1;} }if(disp_hold==0){power_supply=0;power_high=0;power_low=0;relay_u= 0;relay_v=0;relay_w=0;speeder=0;KDF=0;speeder=0;} if(err_time;disp_refresh){err_disp(err_status);disp_time=0;}}else if(err_time;1000){if(disp_time>;disp_refresh){if(disp_mod==1){addisp(ad_data1);disp_time=0;}else{disp10(rcdata1);disp_time=0;}}}else if(err_time>;2000)err_time=0; }}}void init(){/*PORTA *//*RA0 relay_w 0 *//*RA1 vol 1 *//*RA2 +5V 1 *//*RA3 TYJ 1 *//*RA4 power_low 0 *//*RA5 SX 1 *//*RA6 power_high 0 *//*RA7 CLK1 0 */TRISA=0x2e; //0010 1110ANSEL=0x7e; //模拟输入PORTA=0;/*PORTB *//*RB0 SPA *//*RB1 SPB *//*RB2 PHA *//*RB3 PHB *//*RB4 PHC *//*RB5 ralay_v *//*RB6 CLK *//*RB7 DATA */TRISB=0xc0; //1100 0000,rb0--rb5输出,rb6、rb7输入PORTB=0;/*PORTC *//*RC0 DOWN1 *//*RC1 UP *//*RC2 DOWN *//*RC3 choose2 *//*RC4 choose1 *//*RC5 PWM *//*RC6 TXD *//*RC7 RXD */TRISC=0x58; //0101 1000PORTC=0x80; //1000 0000/*PORTD*//*RD0 DATA1 *//*RD1 KFD *//*RD2 up1 *//*RD3 bell *//*RD4 speeder *//*RD5 start *//*RD6 power_supply *//*RD7 safe */TRISD=0x20; //0010 0000PORTD=0x18; //0001 1000/*PORTE*//*RE0 DF *//*RE1 JX *//*RE2 relay_u *//*RE3 VPP */TRISE=0xb; //0000 1011,全输入RE2=0;OSCCON=0xfe; //时钟选择8mhz,内部振荡器VLCDEN=0;OPTION=0xc3;LCDEN=0;CMCON0=7;CCP2CON=0;ADCON1=0x50;TMR0=7;PEIE=1;T0IE=1;GIE=1;if(choose1==0&&choose2==1)status2=TEST_5045; if(choose1==1&&choose2==1)status2=TEST_5046; if(choose1==1&&choose2==0)status2=TEST_5055B; }void keyscan(){if(!start&&keyvalue){keyvalue=0;keytime=0;}if(start&&!keyvalue){keyvalue=1;keytime=0;}}void key1(){if(keystate==0){if(keyvalue==0&&keytime>;10) {keystate=1;keypull=1;keytime=0;}}else if(keystate==1){if(keyvalue==1&&keytime>;10) {keystate=0;keytime=0;}}else keystate=0;}void interrupt tm0(){uint int_i;if(bell_time>;50)bell=1; if(T0IF){keyscan();key1();keytime++;bell_time++;err_time++;test_time++;disp_time++;disp_time1++;tx_time++;if(ad_test==1){if(GODONE==0){// ad_data3=ad_data2; ad_data2=ad_data1;int_i=ADRESH;ad_data1=ADRESL|int_i;110)disp_time=0; if(disp_time1==100){disp10(status);disp_time1=0;}}T0IF=0;TMR0=7;}}void disp(uchar num1,uchar num2,uchar num3) {uchar i;uchar num_tmp1,num_tmp2;// cs1=0; //关闭显示// clr=0; //清除74ls164数据// clr=1;clk1=0; //上升沿移位num_tmp1=num1;for(i=8;i>;0;i--){num_tmp2=num_tmp1;num_tmp2=num_tmp2&0x01; if(num_tmp2==1)data1=1;elsedata1=0;clk1=1;clk1=0;num_tmp1=num_tmp1>;>;1; }num_tmp1=num2;for(i=8;i>;0;i--){num_tmp2=num_tmp1;num_tmp2=num_tmp2&0x01; if(num_tmp2==1)data1=1;elsedata1=0;clk1=1;clk1=0;。

PIC之AD转换数码管显示

PIC之AD转换数码管显示

#include "PIC18.h"const unsigned char table1[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xd8,0x80,0x90};unsigned int Adresult=0; //AD转换计算结果unsigned int Ad_Sample_result=0; //AD转换采样结果unsigned char AD_Flag=0; // =1有新的AD数据转换完成unsigned int AD_Delay_count=0; // 间隔一定时启动AD ,不使AD采样过于频繁/* ****************************************************************** 函数名: initial()** 功能描述: 系统初始化子程序,放在程序首部*************************************************************** */void initial(){ TRISC=0;TRISD=0;INTCON=0x00; //* bit7-bit0:关总中断*/ADCON1=0X07; //* 设置数字输入输出口*/PIE1=0; //* PIE1 的中断不使能*/PIE2=0; //* PIE2 的中断不使能*/PIE3=0; //* PIE3 的中断不使能*/}/* **************************************************************** 函数名: AD_Initial()** 功能:A/D转化初始化子程序****************************************************************** */ void AD_Initial(){ADCON0=0x51; //* 选择通道为AN2,A/D处于工作状态,转换时钟8tosc */ADCON1=0X82; //* 转换结果右移,及ADRESH寄存器的高6位为"0",且//把RA2(AN2,直流输入通道)设置为模拟量输入方式,RA5设置为数字口*/ADIF=0; //* 清除A/D转换标志*/ADIE=1; //* A/D转换中断允许*/ADIP=1; //* AD中断高优先级*/TRISA=TRISA|0x04; //* 设置RA2(AN2通道)为输入方式*/}void delay_1ms(void){unsigned int n;for(n=0;n<50;n++){NOP();}}void delay_ms(unsigned int time){for(;time>0;time--){delay_1ms();}}/* **************************************************************** 函数名: Deal_AD()** 功能:AD转换完成后处理数据子程序****************************************************************** */ void Deal_AD(){unsigned int temp,g;Ad_Sample_result=ADRESL+(ADRESH<<8);//* 读取并存储A/D转换结果(10位,高6位为0)*/AD_Flag=0; //* AD转换完成标志清0 */Adresult=(Ad_Sample_result*50)>>10;//* 将AD采样结果转换为以两位数表示的值,即放大//10倍,乘以满该度值5V,除以满刻度转换值10位(1024)*/// temp=Adresult;// Adresult=(((temp/10)<<4)&0xf0)+(Adresult % 10);//* 转换为带一位小数的BCD码实际值如25表示2.5V,//本程序在0通道输入时直接加直流电压0-5V */PORTD=0X01;PORTC=table1[Adresult/10];RC7=0;//点亮小数点delay_ms(80);PORTD=0X02;PORTC=table1[Adresult%10];}/* **************************************************************** ** 函数名: interrupt HI_ISR()** 功能描述: 高优先级中断子程序:AD转换完成中断*************************************************************** */ void interrupt HI_ISR(){if(ADIF==1) //AD转换完成{ADIF=0; //清除中断标志AD_Flag=1; //置AD转换完成标志}}main(){initial(); //* 系统初始化子程序*/AD_Initial(); // A/D转换初始化//SPIinitial(); //* SPI初始化子程序*/IPEN=1; // 使能中断高低优先级INTCON=INTCON|0xc0; // 开总中断、开外围接口中断while(1){//display(); //显示子程序(SPI串行输出AD测量结果)if(AD_Flag==1) // AD采样完成Deal_AD(); // 处理AD数据if(AD_Delay_count>=0x3f){AD_Delay_count=0;ADCON0=ADCON0|0x04; //间隔一定时间启动直流输入通道AD采样}else AD_Delay_count++; // 不到AD间隔采样时间,继续延时}}。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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。

相关文档
最新文档