51单片机课程设计AD转换Word格式文档下载.docx
- 文档编号:8563020
- 上传时间:2023-05-11
- 格式:DOCX
- 页数:17
- 大小:21.94KB
51单片机课程设计AD转换Word格式文档下载.docx
《51单片机课程设计AD转换Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《51单片机课程设计AD转换Word格式文档下载.docx(17页珍藏版)》请在冰点文库上搜索。
式具体描述如表2所示因此I2C系统中最多可接23=8个具有总线接口的
A/D器件地址的最后一位为方向位R/W,当主控器对A/D器件进行读操作时为
1,进行写操作时为0总线。
操作时,由器件地址引脚地址和方向位组成的从
地址为主控器发送的第一字节。
4图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,二路单端输入,一路差分
输入;
输入方式3,两路差分输入。
D6:
模拟输出允许位,A/D转换时设
置为(地址选择字D0位此时设置为1),D/A转换时设置为1(地址选择字位
此时设置为)。
D7:
特征位,固定为0。
3、PCF8591的A/D转换PCF8591的A/D转换为逐次比较型,在A/D转换周期中借用DAC及高增益比
较器对PCF8591进行写读操作后便立即启动A/D转换,并读出A/D转换结果
在每个应答信号的后沿触发转换周期,采样模拟电压并读出前一次转换后的结
果。
A/D转换中,一旦A/D采样周期被触发,所选择通道的采样电压便保存在采样,
保持电路中,并转换成8位二进制码(单端输入)或二进制补码(差分输入)
存放在ADC数据寄存器中等待器件读出。
如果控制字节中自动增量选择位置1,
则一次A/D转换完毕后自动选择下一通道。
读周期中读出的第一个字节为前一
个周期的转换结果。
上电复位后读出的第一字节为80H。
PCF8591的A/D转换亦使用的是I2C总线的读方式操作完成的。
其数据操作格
式如图4所示。
5图4A/D转换数据操作格式其中data0~datan为A/D的转换结果,分别对应于前一个数据读取期间所采样
的模拟电压。
A/D转换结束后,先发送一个非应答信号位A再发送结束信号位P。
灰底位由主机发出,白底位是由PCF8591产生。
上电复位后控制字节状态为
00H,在A/D转换时须设置控制字,即须在读操作之前进行控制字节的写入操
作。
逻辑操作波形时序图如图5所示。
图5A/D转换逻辑操作波形时序图
4、A/D转换程序设计流程如下图6所示
6图6
75
55
5、
、、
、1602LCD
1602LCD1602LCD
1602LCD主要技术参数
主要技术参数主要技术参数
主要技术参数:
:
显示容量:
16×
2个字符,芯片工作电压:
4.5—5.5V,工作电流:
2.0mA(5.0V),
模块最佳工作电压:
5.0V,字符尺寸:
2.95×
4.35(W×
H)mm。
5.1
5.15.1
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.2
5.25.2
5.2
1602LCD
1602LCD的指令说明及时序
的指令说明及时序的指令说明及时序
的指令说明及时序1602液晶模块内部的控制器共有11条控制指令,如图8
序号指令RSR/WD7D6D5D4D3D2D1D0
1清显示0000000001
2光标返回000000001*
3置输入模式00000001I/DS
84显示开/关控制000
0001DCB
5光标或字符移位000001S/CR/L**
6置功能00001DLNF**
7
置字符发生存贮器地
址
0001
字符发生存贮器地址
8置数据存贮器地址001显示数据存贮器地址
9读忙标志或地址01BF计数器地址
10
写数到CGRAM或
DDRAM)
10
要写的数据内容
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:
读数据。
读操作时序
9写操作时序5.3
5.35.3
5.3
1602LCD的一般初始化
的一般初始化的一般初始化
的一般初始化(
((
(复位
复位复位
复位)
))
)过程
过程过程
过程延时15mS
写指令38H(不检测忙信号)
延时5mS
以后每次写指令、读/写数据操作均需要检测忙信号
写指令38H:
显示模式设置
写指令08H:
显示关闭
写指令01H:
显示清屏
10写指令06H:
显示光标移动设置
写指令0CH:
显示开及光标设置6、仿真原理图如下所示
7、C语言程序#include<
reg52.h>
#include<
intrins.h>
#defineucharunsignedchar
#defineuintunsignedint
#defineDelay4us(){_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];
//数据接收缓冲
11uintVoltage[]={'
0'
'
};
//数据分解为电压x.xx
bitbdataIIC_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_RW=0;
P0=cmd;
//写数据
voidLCD_Write_Data(uchardat)
LCD_RS=1;
P0=dat;
//初始化
12voidLCD_Initialise()
LCD_Write_Command(0x38);
delay(5);
LCD_Write_Command(0x0c);
LCD_Write_Command(0x06);
LCD_Write_Command(0x01);
//设置显示位置
voidLCD_Set_Position(ucharpos)
LCD_Write_Command(pos|0x80);
//显示一行
voidLCD_Display_A_Line(ucharLine_Addr,uchars[])
LCD_Set_Position(Line_Addr);
for(i=0;
16;
i++)LCD_Write_Data(s[i]);
//将模数转换后得到的值分解存入缓存
voidConvert_To_Voltage(ucharval)
ucharTmp;
//最大值为255,对应5V,255/5=51
Voltage[2]=val/51+'
;
//整数部分
Tmp=val%51*10;
//第一位小数
Voltage[1]=Tmp/51+'
Tmp=Tmp%51*10;
Voltage[0]=Tmp/51+'
/**********************************************************
函数名称:
iic_start()
函数功能:
启动I2C总线子程序
时钟保持高,数据线从高到低一次跳变,I2C通信开始
**********************************************************/
13voidiic_start(void)
SDA=1;
SCL=1;
Delay4us();
//延时5us
SDA=0;
SCL=0;
iic_stop()
停止I2C总线数据传送子程序
时钟保持高,数据线从低到高一次跳变,I2C通信停止
voidiic_stop(void)
iicInit_()
初始化I2C总线子程序
voidiicInit(void)
iic_stop();
slave_ACK
14函数功能:
从机发送应答位子程序
voidslave_ACK(void)
slave_NOACK
从机发送非应答位子程序,迫使数据传输过程结束
voidslave_NOACK(void)
check_ACK
主机应答位检查子程序,迫使数据传输过程结束
voidcheck_ACK(void)
//置成输入
F0=0;
if(SDA==1)
15//若SDA=1表明非应答
F0=1;
//置位非应答标志F0
IICSendByte
入口参数:
indata
发送一个字节
voidIICSendByte(unsignedcharindata)
unsignedcharn=8;
//发送一字节数据,共八bit
while(n--)
{
SDA=(bit)(indata&
indata=indata<
<
1;
//数据左移一位
}
IICreceiveByte
返回接收的数据tdata
接收一字节子程序
unsignedcharIICreceiveByte(void)
//读取一字节数据,共八bit
unsignedchartdata=0;
16SCL=1;
tdata=tdata<
//左移一位
tdata=tdata|0x01;
//若接收到的位为1,则数据的最后一位置1
else
tdata=tdata&
0xfe;
//否则数据的最后一位置0
return(tdata);
ADC_PCF8591
A/D转换,结果存入receivebuf
voidADC_PCF8591(unsignedcharcontrolbyte)
unsignedchari=0;
iic_start();
IICSendByte(0x90);
//控制字0x90
check_ACK();
IICSendByte(controlbyte);
//通道控制字
//重新发送开始命令
IICSendByte(0x91);
//控制字0x91
IICreceiveByte();
//空读一次
slave_ACK();
//收到一个字节后发送一个应答位
while(i<
3)
//采集0,1,2通道
17{
Recv_Buffer[i++]=IICreceiveByte();
Recv_Buffer[3]=IICreceiveByte();
//采集第3通道
slave_NOACK();
//收到最后一个字节后发送一个非应答位
iic_stop();
//主程序
voidmain()
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 51 单片机 课程设计 AD 转换
![提示](https://static.bingdoc.com/images/bang_tan.gif)