基于51单片机用PCF8591进行AD-DA转换用1602LCD显示的电流采样_第1页
基于51单片机用PCF8591进行AD-DA转换用1602LCD显示的电流采样_第2页
基于51单片机用PCF8591进行AD-DA转换用1602LCD显示的电流采样_第3页
基于51单片机用PCF8591进行AD-DA转换用1602LCD显示的电流采样_第4页
基于51单片机用PCF8591进行AD-DA转换用1602LCD显示的电流采样_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

./大学学院本科生课程设计题目:可编程序控制器实训姓名:学号:系别:专业:年级:指导教师:目录TOC\o"1-3"\t"1,1,1.1,2,1.1.1,3"1、PCF8591概述32、芯片介绍33、PCF8591的A/D转换44、A/D转换程序设计流程55、1602LCD主要技术参数76、Proteus仿真原理图107、程序代码108、结语179、参考文献171、PCF8591概述PCF8591是一种具有I2C总线接口的8位A/DD/A转换芯片,在与CPU的信息传输过程中仅靠时钟线SCL和数据线SDA就可以实现。I2C总线是Philips〔飞利浦公司推出的串行总线,它与传统的通信方式相比具有读写方便,结构简单,可维护性好,易实现系统扩展,易实现模块化标准化设计,可靠性高等优点。2、芯片介绍2.1部结构及引脚功能描述PCF8591为单一电源供电〔2.56V典型值为5V,CMOS工艺PCF8591有4路8位A/D输入,属逐次比较型,含采样保持电路;1路8位D/A输出,含有DAC的数据寄存器A/DD/A的最大转换速率约为11kHz,但是转换的基准电源需由外部提供PCF8591的引脚功能如图1所示图1PCF8591引脚功能2.2片可编程功能设置在PCF8591部的可编程功能控制字有两个,一个为地址选择字,另一个为转换控制字PCF8591采用典型的I2C总线接口的器件寻址方法,即总线地址由器件地址引脚地址和方向位组成Philips〔飞利浦公司规定A/D器件高四位地址为1001,低三位地址为引脚地址A0A1A2,由硬件电路决定,地址选择字格式具体描述如表2所示因此I2C系统中最多可接2^3=8个具有总线接口的A/D器件地址的最后一位为方向位R/W,当主控器对A/D器件进行读操作时为1,进行写操作时为0总线。操作时,由器件地址引脚地址和方向位组成的从地址为主控器发送的第一字节。图2地址选择字格式描述D0:读写控制位,对转换器件进行读操作时为1,进行写操作时为0。D1,D2,D3:引脚硬件地址设置位,由硬件电路设定该PCF8591的物理地址。D7,D6,D5,D4:器件地址位固定为1001.PCF8591的转换控制字存放在控制寄存器中,用于实现器件的各种功能总线操作时为主控器发送的第二字节转换控制字的格式功能具体描述如图3所示图3转换控制字格式描述D0,D1:通道选择位。00:通道0;01:通道1;10:通道2;11:通道3。D2:自动增量允许位,为1时,每对一个通道转换后自动切换到下一通道进行转换,为0时不自动进行通道转换,可通过软件修改进行通道转换D3:特征位,固定位0。D4,D5:模拟量输入方式选择位。00:输入方式0,四路单端输入;01:输入方式1,三路差分输入;10:输入方式2,二路单端输入,一路差分输入;11:输入方式3,两路差分输入。D6:模拟输出允许位,A/D转换时设置为〔地址选择字D0位此时设置为1,D/A转换时设置为1〔地址选择字位此时设置为。D7:特征位,固定为0。3、PCF8591的A/D转换PCF8591的A/D转换为逐次比较型,在A/D转换周期中借用DAC及高增益比较器对PCF8591进行写读操作<R/W>后便立即启动A/D转换,并读出A/D转换结果在每个应答信号的后沿触发转换周期,采样模拟电压并读出前一次转换后的结果。A/D转换中,一旦A/D采样周期被触发,所选择通道的采样电压便保存在采样,保持电路中,并转换成8位二进制码〔00四路单端输入或二进制补码〔01三鹿差分输入存放在ADC数据寄存器中等待器件读出。如果控制字节中自动增量选择位置1,则一次A/D转换完毕后自动选择下一通道。读周期中读出的第一个字节为前一个周期的转换结果。上电复位后读出的第一字节为80H。PCF8591的A/D转换亦使用的是I2C总线的读方式操作完成的。其数据操作格式如图4所示。图4A/D转换数据操作格式其中data0~datan为A/D的转换结果,分别对应于前一个数据读取期间所采样的模拟电压。A/D转换结束后,先发送一个非应答信号位A再发送结束信号位P。灰底位由主机发出,白底位是由PCF8591产生。上电复位后控制字节状态为00H,在A/D转换时须设置控制字,即须在读操作之前进行控制字节的写入操作。逻辑操作波形时序图如图5所示。图5A/D转换逻辑操作波形时序图4、A/D转换程序设计流程如下图6所示图65、1602LCD主要技术参数:显示容量:16×2个字符,芯片工作电压:4.5—5.5V,工作电流:2.0mA<5.0V>,模块最佳工作电压:5.0V,字符尺寸:2.95×4.35<W×H>mm。5.1引脚功能说明1602LCD采用标准的14脚〔无背光或16脚〔带背光接口,各引脚接口说明如图7编号符号引脚说明编号符号引脚说明1VSS电源地9D2数据2VDD电源正极10D3数据3VL液晶显示偏压11D4数据4RS数据/命令选择12D5数据5R/W读/写选择13D6数据6E使能信号14D7数据7D0数据15BLA背光源正极8D1数据16BLK背光源负极图7引脚接口说明表第1脚:VSS为地电源。第2脚:VDD接5V正电源。第3脚:VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生"鬼影",使用时可以通过一个10K的电位器调整对比度。第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。第5脚:R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和R/W共同为低电平时可以写入指令或者显示地址,当RS为低电平R/W为高电平时可以读忙信号,当RS为高电平R/W为低电平时可以写入数据。第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。第7~14脚:D0~D7为8位双向数据线。第15脚:背光源正极。第16脚:背光源负极。5.21602LCD的指令说明及时序1602液晶模块部的控制器共有11条控制指令,如图8序号指令RSR/WD7D6D5D4D3D2D1D01清显示00000000012光标返回000000001*3置输入模式00000001I/DS4显示开/关控制0000001DCB5光标或字符移位000001S/CR/L**6置功能00001DLNF**7置字符发生存贮器地址0001字符发生存贮器地址8置数据存贮器地址001显示数据存贮器地址9读忙标志或地址01BF计数器地址10写数到CGRAM或DDRAM10要写的数据容11从CGRAM或DDRAM读数11读出的数据容图81602液晶模块的读写操作、屏幕和光标的操作都是通过指令编程来实现的。〔说明:1为高电平、0为低电平指令1:清显示,指令码01H,光标复位到地址00H位置。指令2:光标复位,光标返回到地址00H。指令3:光标和显示模式设置I/D:光标移动方向,高电平右移,低电平左移S:屏幕上所有文字是否左移或者右移。高电平表示有效,低电平则无效。指令4:显示开关控制。D:控制整体显示的开与关,高电平表示开显示,低电平表示关显示C:控制光标的开与关,高电平表示有光标,低电平表示无光标B:控制光标是否闪烁,高电平闪烁,低电平不闪烁。指令5:光标或显示移位S/C:高电平时移动显示的文字,低电平时移动光标。指令6:功能设置命令DL:高电平时为4位总线,低电平时为8位总线N:低电平时为单行显示,高电平时双行显示F:低电平时显示5x7的点阵字符,高电平时显示5x10的点阵字符。指令7:字符发生器RAM地址设置。指令8:DDRAM地址设置。指令9:读忙信号和光标地址BF:为忙标志位,高电平表示忙,此时模块不能接收命令或者数据,如果为低电平表示不忙。指令10:写数据。指令11:读数据。读操作时序写操作时序5.31602LCD的一般初始化〔复位过程延时15mS写指令38H〔不检测忙信号延时5mS写指令38H〔不检测忙信号延时5mS写指令38H〔不检测忙信号以后每次写指令、读/写数据操作均需要检测忙信号写指令38H:显示模式设置写指令08H:显示关闭写指令01H:显示清屏写指令06H:显示光标移动设置写指令0CH:显示开及光标设置6、仿真原理图如下所示7、C语言程序#include<reg52.h>#include<intrins.h>#defineucharunsignedchar#defineuintunsignedint#defineDelay4us<>{_nop_<>;_nop_<>;_nop_<>;_nop_<>;}sbitLCD_RS=P2^6;sbitLCD_RW=P2^5;sbitLCD_EN=P2^7;sbitSCL=P2^0;//I2C时钟引脚sbitSDA=P2^1;//I2C数据输入输出引脚ucharRecv_Buffer[4];//数据接收缓冲uintVoltage[]={'0','0','0','0'};//数据分解为电压x.xxbitbdataIIC_ERROR;//I2C错误标志位ucharLCD_Line_1[]={".V"};//延时voiddelay<intms>{uchari;while<ms-->for<i=0;i<250;i++>Delay4us<>;}//LCD忙检测bitLCD_Busy_Check<>{bitResult;LCD_RS=0;LCD_RW=1;LCD_EN=1;Delay4us<>;Result=<bit><P0&0x80>;LCD_EN=0;returnResult;}//写指令voidLCD_Write_Command<ucharcmd>{while<LCD_Busy_Check<>>;LCD_RS=0;LCD_RW=0;LCD_EN=0;_nop_<>;_nop_<>;P0=cmd;Delay4us<>;LCD_EN=1;Delay4us<>;LCD_EN=0;}//写数据voidLCD_Write_Data<uchardat>{while<LCD_Busy_Check<>>;LCD_RS=1;LCD_RW=0;LCD_EN=0;P0=dat;Delay4us<>;LCD_EN=1;Delay4us<>;LCD_EN=0;}//初始化voidLCD_Initialise<>{LCD_Write_Command<0x38>;delay<5>;LCD_Write_Command<0x0c>;delay<5>;LCD_Write_Command<0x06>;delay<5>;LCD_Write_Command<0x01>;delay<5>;}//设置显示位置voidLCD_Set_Position<ucharpos>{LCD_Write_Command<pos|0x80>;}//显示一行voidLCD_Display_A_Line<ucharLine_Addr,uchars[]>{uchari;LCD_Set_Position<Line_Addr>;for<i=0;i<16;i++>LCD_Write_Data<s[i]>;}//将模数转换后得到的值分解存入缓存voidConvert_To_Voltage<ucharval>{ucharTmp;//最大值为255,对应5V,255/5=51Voltage[2]=val/51+'0';//整数部分Tmp=val%51*10;//第一位小数Voltage[1]=Tmp/51+'0';Tmp=Tmp%51*10;Voltage[0]=Tmp/51+'0';}//启动I2C总线voidIIC_Start<>{SDA=1;SCL=1;Delay4us<>;SDA=0;Delay4us<>;SCL=0;}//停止I2C总线voidIIC_Stop<>{SDA=0;SCL=1;Delay4us<>;SDA=1;Delay4us<>;SCL=0;}//从机发送应答位voidSlave_ACK<>{SDA=0;SCL=1;Delay4us<>;SCL=0;SDA=1;}//从机发送非应答位voidSlave_NOACK<>{SDA=1;SCL=1;Delay4us<>;SCL=0;SDA=0;}//发送一字节voidIIC_SendByte<ucharwd>{uchari;for<i=0;i<8;i++>//循环移入8位{SDA=<bit><wd&0x80>;_nop_<>;_nop_<>;SCL=1;Delay4us<>;SCL=0;wd<<=1;}Delay4us<>;SDA=1;//释放总线并准备读取应答SCL=1;Delay4us<>;IIC_ERROR=SDA;//IIC_ERROR=1表示无应答SCL=0;Delay4us<>;}//接收一字节ucharIIC_ReceiveByte<>{uchari,rd=0x00;for<i=0;i<8;i++>{SCL=1;rd<<=1;rd|=SDA;Delay4us<>;SCL=0;Delay4us<>;}SCL=0;Delay4us<>;returnrd;}//连续读入4路通道的A/D转换结果并保存到Recv_BuffervoidADC_PCF8591<ucharCtrlByte>{uchari;IIC_Start<>;IIC_SendByte<0x90>;//发送写地址if<IIC_ERROR==1>return;//IIC_SendByte<CtrlByte>;//发送控制字节//if<IIC_ERROR==1>return;IIC_Start<>;//重新发送开始命令IIC_SendByte<0x91>;//发送读地址if<IIC_ERROR==1>return;IIC_ReceiveByte<>;//空读一次,调整读顺序Slave_ACK<>;//收到一字节后发送一个应答位for<i=0;i<4;i++>{Recv_Buffer[i++]=IIC_ReceiveByte<>;Slave_ACK<>;//收到一个字节后发送一个应答位}Slave_NOACK<>;IIC_Stop<>;//收到一个字节后发送一个非应答位}//向PCF8591发送1字节进行AD转换//主程序voidmain<>{LCD_Initialise<>;while<1>{ADC_PCF8591<0x04>;Convert_To_Voltage<Recv_Buffer[0]>;LCD_Line_1[2]=Voltage[2];LCD_Line_1[4]=Voltage[1];LCD

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论