基于PIC单片机SPI接口的数据采集模块设计说明.docx
《基于PIC单片机SPI接口的数据采集模块设计说明.docx》由会员分享,可在线阅读,更多相关《基于PIC单片机SPI接口的数据采集模块设计说明.docx(49页珍藏版)》请在冰点文库上搜索。
基于PIC单片机SPI接口的数据采集模块设计说明
基于PIC单片机SPI接口的数据采集模块设计
摘要
PIC单片机比MCS-51单片机功能更强大,因为其部集成了A/D转换模块、USART通讯模块及MSSP端口;本文介绍一种基于PIC16F877A单片机的数据采集模块的设计。
首先主机的A/D端口接电位器,实现模拟电压向数字信号的转换,然后对转换后得数据通过SPI接口传输给从机,从机通过显示控制芯片HD7279A,最后通过四位数码管把采集的模拟电压显示出来。
系统需要两片单片机完成,分为主机和从机,主机完成数据的采集、A/D转换,转换结果的输出,从机主要完成数据的接受,工程量变换功能。
程序采用C语言编写,在集成开发环境MPLAB-IDE下完成编译及程序下载,最终实现能通过调节电位器实现变化的电压显示。
关键词PIC单片机数据采集A/D转换SPI接口
DESIGNOFDATACOLLECTIONSYSTEMBASEDONTHESPIPORTofPICMICROCONTROLLER
ABSTRACT
ThefunctionofPICMCUismorepowerfulthanMCS-51,becauseitintegratealargenumberofon-chipperipheralssuchasADconvertermodule.USARTcommunicationmoduleandMSSPport,ThisarticleintroducedthedesignofdatacollectionsystembasedontheSPIportofPICMCU,firsttheADCconvertermoduleisconnectedwiththepotentiometer,sotheanalogvoltagecanbeconvertedtodigitalsignal,andthensendthemtothemastermicroprocessorbytheSPIport,Theslavedisplaytheanalogvoltagethroughmulti-pointcalibrationwhichiscontrolledbytheHD7279A.
Itneedstwopiecesofmicrocontrollertodothejob,whichisdividedintothemasterandtheslave,theformercompletesdatacollection,A/Dconversion,theconversionresultsofoutput,andthelateracceptsthedatatransmissionaswellasthequantitychange.Clanguageisusedinprogramming,theMPLAB-IDEintegrateddevelopmentenvironmentcompletescompilinganddownloading.Andfinallytheanalogvoltageisdisplayed.
KEYWORDSPICMCUDataCollectionADConversionSPIPort
摘要I
ABSTRACTII
1绪论1
1.1课题背景及研究意义1
1.2本设计方案介绍2
2硬件部分设计3
2.1PIC单片机介绍3
2.1.1PIC单片机的优越之处3
2.1.2PIC16F877A最小系统图及主要性能4
2.2PIC单片机片ADC模块及接口实现5
2.2.1ADC模块结构和操作原理5
2.2.2ADC模块相关的寄存器介绍6
2.2.3A/D转换接口电路设计7
2.3主控同步串口MSSP介绍9
2.3.1I2C总线介绍9
2.3.2SPI简介10
2.3.3SPI主模式接口设计13
2.3.4SPI从模式接口设计14
2.4HD7279A芯片原理介绍及接口实现15
2.4.1HD7279A简介15
2.4.2HD7279指令介绍16
2.4.3HD7279A的接口实现20
2.5电源模块23
3软件设计程序流程图25
3.1C语言编程简介25
3.2MPLABIDE编程环境简介25
3.3MPLABICD2介绍26
3.3.1MPLABICD2系统组成26
3.3.2MPLABICD2的安装和配置27
3.4系统程序流程图29
4结论31
致32
参考文献33
附录134
附录235
附录336
1绪论
1.1课题背景及研究意义
在工业生产和日常生活中,经常要对模拟信号进行测量与控制,例如在有些系统中经常要对模拟电压信号进行采集并显示出来,于是数据采集模块必不可少。
数据采集涉及多学科,所研究的对象是物理或生物等各种非电或电信号,如温度、压力、流量、位移等模拟量,根据各种非电或电信号的特征,利用相应的归一化技术,将其转化为可真实反映事物特征的电信号后,经A/D转换器转换为计算机可识别的有限二进制数编码,即数字量,并进行存储、处理、显示或打印。
以此二进制数字编码作为研究自然科学和实现工业实施控制的重要依据,实现对宏观和微观自然科学的量化认识[3]。
在当今社会各个领域,包括科研和实验研究,数据采集系统有着不可替代的作用,数据采集和处理进行的越及时,工作效率就越高,取得的经济效益就越大,数据采集系统性能的好坏主要取决于它的精度和速度,在保证精度的条件下,还要尽可能地提高采样速度,以满足实时采集、实时处理和实时控制的要求。
数据分析是指用适当的方法对采集的数据进行分析,以求最大化的开发数据资料的功能,发挥数据的作用,并将分析结果显示出来,通过数据采集硬件采集到数据,然后将其传送到CPU中,应用不同的软件,将采集到的数据进行实时分析,并显示出分析结果。
其典型的系统组成如图1-1所示[1]:
图1-1数据采集典型系统框图
1.2本设计方案介绍
本设计主要由PIC单片机完成。
模拟信号的采集离不开AD转换,通常我们都是采用AD转换器实现由模拟量到数字量的转换,然后将数字信号输入单片机进行数字处理;其特点是工作性能可靠、稳定,但灵活性差、成本也比较高。
本文所介绍的技术是利用PIC单片机的特点结合AD转换的技术直接实现AD转换,该方法只需外接少量元件,而且分辨率可编程设置,且可实现多路AD转换,此技术主要用于控制精度要求不是很高、成本要求较低的电子产品中,意义尤为突出[1]。
PIC单片机具有SPI总线,SPI是一种高速的、全双工、同步的通信总线,并且只占用四根线。
为了系统功能的扩展,又是一个单片机不能完成整个系统的要求,这时就需要两个单片机,第一片完成数据的采集、AD转换、转换结果的输出,第二片主要完成数据的接受,工程量变换等功能,本设计就是基于这种情况而设计的。
数据采集模块构架框图如图1-1所示:
图1-2数据采集模块构架框图
通过上图可知,要完成本系统设计,一下几个模块必不可少,按照数据流动的先后顺序,依次是:
AD采集模块、SPI模块、HD7279显示控制模块,各模块联系紧密,在下面的论文当中,会按照这个顺序一一进行介绍。
要想成功完成设计,硬件和软件两者缺一不可。
2硬件部分设计
2.1PIC单片机介绍
2.1.1PIC单片机的优越之处
PIC单片机采用了RISC结构,其高速度、低电压、低功耗、大电流LCD驱动能力和低价位OTP技术等都体现出单片机产业的新趋势。
PIC16F877是Microchip公司于1998年底推出的一款特色鲜明的新产品,片资源丰富,使用方便等诸多优点使其在应用领域中越来越受用户喜爱,这也是本设计为什么要采用它的原因,其主要特点如下所述[13]:
(1)哈弗总线结构:
MCS-51单片机的总线结构是-诺依曼型,计算机在同一个存储空间取指令和数据,两者不能同时进行;而PIC单片机的总线结构是哈佛结构,指令和数据空间是完全分开的,正因如此,PIC单片机程序和数据总线可以采用不同的宽度。
数据总线都是8位的,但指令总线位数分别位12、14、16位。
(2)流水线结构:
MCS-51单片机的取指和执行采用单指令流水线结构,即取一条指令,执行完后再取下一条指令;而PIC的取指和执行采用双指令流水线结构,当一条指令被执行时,允许下一条指令同时被取出,这样就实现了单周期指令。
(3)寄存器组:
PIC单片机的所有寄存器,包括I/O口,定时器和程序计数器等都采用RAM结构形式,而且都只需要一个指令周期就可以完成访问和操作;而MCS-51单片机需要两个或两个以上的周期才能改变寄存器的容。
(4)运行速度高、功耗低
(5)驱动能力强、程序性强
每个I/O引脚吸入和输出电流的最大值可分别达到25mA和20mA,能够直接驱动发光二极管LED、光电耦合器或者轻微继电器等;其部程序尚无法直接进行拷贝,可最大限度保护用户[1]。
2.1.2PIC16F877A最小系统图及主要性能
由于本系统对速度要求并不是很高,故没必要采用很高的晶振,4M已经可以满足系统需求。
由于上电复位不是很可靠,程序一旦跑飞就得重新上电,故本系统采用按键复位电路,上电复位电阻为10K,电容选电解电容10uF,该电路的优点在于降低复位引脚对地的阻抗,可以显著增强单片机复位电路的抗干扰能力,并且有利于程序的调试,PIC16F877A的最小系统如图2.2-1所示:
图2-1PIC16F877A最小系统图
与本设计相关主要性能参数如下所示[6]:
●具有高性能的CPU
●除程序分支指令为两个周期外,其余均为单周期指令
●8K*14个FLASH程序存储器
368*8个数据存储器(RAM)字节
256*8EEPRM数据存储器字节
●提供14个中断源
●10位多通道模数转换器
●部有主控同步串行通讯端口MSSP,可工作于SPI、I2C两种模式
●功耗低
在5V,4MHZ时钟运行时电流小于2mA
在3V,32KHZ时钟运行时电流小于20uA
●支持在线串行编程(ICSP)
●运行电压围广,2.0V到5.5V
●输入及输出电流可达到25mA
2.2PIC单片机片ADC模块及接口实现
2.2.1ADC模块结构和操作原理
PIC16F87X部带有10位ADC,40脚封装的芯片有8通道ADC,其部结构包含四部分:
8选1选择开关、双刀双掷开关、A/D转换电路和采样/保护电路。
PIC16F87X的ADC部结构示意图如图3.1-1所示。
图2-2ADC模块部结构图
ADC模块各部分功能和组成关系如下:
(1)8选1选择开关
由控制寄存器ADCON0中的CHS2-CHS0位控制,用于在引脚AN0-AN7中选择将要进行转换的输入模拟通道,选中者与部采样/保持电路接通。
(2)双刀双掷切换开关
由控制寄存器ADCON1中的PCFG3-PCFG0位控制用于选择A/D转换器所需要的参考电压源的获取途径。
(3)A/D转换电路
用于实现将模拟信号转换为数字量。
(4)采样/保持电路
用于对输入模拟信号电平进行抽样,并且为后续A/D转换电路保持一个平稳的电压样值。
2.2.2ADC模块相关的寄存器介绍
1.ADC控制寄存器0-ADCON0见表3-1。
表2-1ADCON0各位描述
符号
地址
Bit7
Bit6
Bit5
Bit4
Bit3
Bit2
bit1
Bit0
ADCON0
1FH
ADCS1
ADCS0
CHS2
CHS1
CHS0
GO
-
ADON
功能:
●ADCS1-ADCS0:
A/D转换时钟及频率选择位
●CHS2-CHS0:
A/D模拟通道选择位
●GO/DONE:
A/D转换启动控制位,兼作状态位,在ADON=1的前提下,1=启动A/D转换或转换正在进行中,0=A/D转换已完成。
2.ADC控制寄存器1-ADCON1见表2-2。
表2-2ADCON1各位描述
符号
地址
Bit7
Bit6
Bit5
Bit4
Bit3
Bit2
bit1
Bit0
ADCON1
9FH
ADFM
-
-
-
PCFG3
PCFG2
PCFG1
PCFG0
功能:
●ADFM:
A/D转换结果格式选择位。
1=结果右对齐,ADRESH寄存器高6位读作0;0=结果左对齐,ADRESL寄存器低6位读作0。
●PCFG3-PCFG0:
A/D模块引脚配置位。
这三个决定了功能复用的引脚那些作为普通数字I/O口,哪些作为A/D转换时的电压信号输入。
在8位分辨率的A/D转换模块中其组合控制模式见表3-3。
表2-3位分辨率的A/D模块引脚配置
PCFG2-PCFG0
AN7
AN6
AN5
AN4
AN3
AN2
AN1
AN0
000
A
A
A
A
A
A
A
A
001
A
A
A
A
Vref
A
A
A
010
D
D
D
A
A
A
A
A
011
D
D
A
A
Vref
A
A
A
100
D
D
D
D
A
D
A
A
101
D
D
D
D
Vref
D
A
A
11x
D
D
D
D
D
D
D
D
3.ADC结果高字节寄存器—ADRESH
●当ADMF=0时,用于存放A/D转换结果的高8位;当ADMF=1时,用于存放A/D转换结果的高2位,此时结存器的高6位读作0。
4.ADC结果低字节寄存器—ADRESL
●当ADMF=1时,用于存放A/D转换结果的低8位;当ADMF=0时,用于存放A/D转换结果的低2位,此时寄存器低6位读作0。
2.2.3A/D转换接口电路设计
A/D转换的外围器件是电位器,电位器与+5V电源相连,通过调节电位器R101即可向单片机ADC模块的AN0通道输入连续变化的模拟电压信号。
其硬件电路图如图3.2所示:
图2-3A/D转换接口电路图
ADC模块程序流程图如图2-4所示:
图2-4ADC模块程序流程图如图
该部分主要子程序程序如下所示:
/************************************************************************
函数功能:
ADC端口初始化子程序
************************************************************************/
voidinit_ad()
{
PORTA=0XFF;
TRISA=0X01;//设置RA0为输入
ADCON0=0X41;//系统时钟f/8,选择RA0通道,允许ADC工作
ADCON1=0X0E;//ADRESH用于存放A/D转换结果高八位,RA0做模拟输入口
delay();
}
/************************************************************************
函数功能:
ADC模块接受子程序
************************************************************************/
unsignedcharread_ad()
{
ADGO=1;
while(ADGO);
return(ADRESH);//只返回转换值的高八位
}
/************************************************************************
函数功能:
延时子程序
************************************************************************/
voiddelay()
{
inti;
for(i=200;i>0;i--);
}
2.3主控同步串口MSSP介绍
2.3.1I2C总线介绍
MSSP模块主要用来和带串行接口的外围器件或者带有同类接口的单片机进行通讯的一种串行接口。
这些外围器件可以是串行的RAM、EEPROM、Flash、LCD驱动器等。
MSSP模块可以工作于一下两种模式:
●芯片间总线(I2C)
●串行外围接口(SPI)
I2C总线是PhilipsSemiconductors在20世纪80年代中期开发的,最初用于音频和视频目的,如今主要在服务器管理中使用,由于只需要微控制器的两个端口引脚就可以传输任意特性的数据,所以I2C总线协议得到了广泛的应用,并促进了大量的I2C外部芯片的开发。
I2C总线可用于控制IC卡、数据转换、LCD控制、时钟控制、存贮器控制、多机通信等。
其主要的优点是其简单性和有效性,由于接口在组件上,因此I2C总线占用的空间非常小,其另外一优点是,它支持多主控,其中任何能够进行发送和接受的设备都可以成为主总线,一个主控可以控制信号的传输和时钟频率。
当然,在任何时间点上只能有一个主控[6]。
I2C总线是由数据线SDA和时钟SCL构成的串行总线,可发送和接受数据,最高传送速率100kbps,各种被控制电路均并联在这条总线上,且每个电路和模块都有唯一的地址,在信息传输过程中,I2C总线上并接的每一模块电路既是主控器,又是发送器,这取决与它所要完成的功能。
CPU发出的控制信号分为地址码和控制量两部分,地址码用来选址,即接通需要控制的电路,确定控制的种类;控制量决定该调整的类别及需要调整的量。
这样,各控制电路虽然挂在同一条总线上,却彼此独立,互不相关。
I2C总线在传送数据过程中共有三种类型信号,它们分别是:
开始信号、结束信号和应答信号。
开始信号:
SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。
结束信号:
SCL为低电平时,SDA由低电平想高电平跳变,结束传送数据。
应答信号:
接受数据的IC在接受到8bit数据后,向发送数据的IC发送特定的低电平脉冲,表示已收到数据。
CPU向受控单元发送一个信号后,等待受控单元发送一个应答信号,CPU接收到应答信号后,根据实际情况作出是否继续传递信号的判断。
若未收到应答信号,则判断受控单元出现故障。
2.3.2SPI简介
串行外围设备接口SPI(SerialPeripheralInterface)总线技术是Motrola公司推出的一种同步串行接口。
SPI总线是一种三线同步总线,因其硬件能力很强,与SPI有关的软件就相当简单,使CPU有更多的时间处理其它事务,因此得到广泛应用。
SPI模式允许8位数据同步发送和接收,支持SPI的所有四种方式。
SPI模式传输数据需要四根信号线:
串行数据输出(SDO)线、串行数据输入(SDI)线、串行时钟(SCK)和从选择(SS)。
其中,从选择线只用于从属模式。
当主控同步串口工作于SPI接口模式时,其电路结构如图3.3所示[7]:
图2-5SPI接口电路结构图
SPI的核心部分是数据缓冲器SSPBUF和由SSPBUF实现装载与卸载的数据移位寄存器SSPSR,寄存器SSPSR数据移入端与引脚SDI连接,其输出端与SDO连接,移位时钟取自引脚SCK。
要让SPI串行端口工作,必须把MSSP模块的使能位SSPEN置1。
这样就可以把引脚SDI、SDO、SCK和SS作为SPI接口的专用引脚,并且还得对其方向位进行相应定义:
●SDI引脚的I/O方向由SPI接口自动控制,应设TRISC4=1;
●SDO引脚定义为输出,即TRISC5=0;
●在主控方式下,SCK引脚为输出,即TRISC3=0;
●在从动方式下,SCK引脚为输入,即TRISC3=1;
●在从动方式下如果用到SS引脚,则定义为输入,即TRISA5=1;
针对本设计,主机和从机的SPI模块的初始化程序分别如下所示:
/************************************************************************
函数功能:
主机SPI端口初始化程序
************************************************************************/
voidinit_spi()
{
TRISC5=0;//SDO引脚定义为输出
TRISC3=0;//SCK引脚定义为输出
TRISB1=0;//RB1引脚定义为输出
SSPCON=0X30;//允许串行口工作,时钟=f/4
SSPSTAT=0X80;//在输出数据末端采样输入数据
}
/************************************************************************
函数功能:
SPI方式初始化程序如下:
************************************************************************/
voidinit_spi()
{
TRISA5=1;//RA5(片选)引脚定义为输入
TRISB=0X00;//B口定义为输出
TRISC3=1;//SCK引脚定义为输入
TRISC4=1;//SDI引脚定义为输入
SSPCON=0X34;//SPI从动工作方式
SSPSTAT=0X00;
}
两片PIC单片机直接进行SPI通讯,其典型电路连接如图4.2所示,SPI主要使用4个信号:
MOSI、MISO、SCK(串行时钟)和CS(片选)。
其中,SCK由主机产生,在双机SPI通讯中,这四个信号线的连接如图4-2所示:
主机的SDO与从机的SDI相连,主机的SDI与从机的SDO相连,主机的SCK与从机的SCK相连作为传输的同步时钟,控制所有数据传输;另外在双机SPI通讯中,还必须用到从机的RA5/SS引脚,主机通过控制从机RA5/SS引脚是高电平还是低电平来决定SPI传输是否能够进行,当RA5/SS引脚为低电平时,从机可以进行发送和接受,当RA5/SS引脚为高电平时,即使在发送数据过程中,从机的SDO输出也会变为高阻浮空状态。
主机和从机都要用到串行输入缓冲器(SSPBUF);主机通过向自己的SPI串行寄存器写入1个字节来发起1次传输,然后通过SDO信号线将数据传给从机,同时从机也可将将自己移位寄存器中的容通过SDO信号线返回给主机,如图4.2所示。
这样,两个移位寄存器中的容就交换了。
在实际应用中,如果只进行写操作,则主机只需忽略收到的字节即可;如果主机要读外设的数据,必须发送1个字节来引发从机的传输,发送的这个字节可以是任意数据[8]。
图2-6双机SPI通讯连接框图
2.3.3SPI主模式接口设计
由于控制时钟SCK的输出,主模式可以在任何时候开始