智能仪器原理与设计实验报告.docx
- 文档编号:29875968
- 上传时间:2023-08-03
- 格式:DOCX
- 页数:14
- 大小:245.42KB
智能仪器原理与设计实验报告.docx
《智能仪器原理与设计实验报告.docx》由会员分享,可在线阅读,更多相关《智能仪器原理与设计实验报告.docx(14页珍藏版)》请在冰豆网上搜索。
智能仪器原理与设计实验报告
实验课程:
智能仪器原理与设计
实验项目:
基于MCS-51单片机的直流电压测量显示仪设计
专业班级:
学号:
学号姓名:
指导教师:
实验日期:
一、设计题目
基于MCS-51单片机的直流电压测量、显示仪设计。
二、硬件电路设计
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
编号
符号
引脚说明
编号
符号
引脚说明
1
VSS
电源地
9
D2
数据
2
VDD
电源正极
10
D3
数据
3
VL
液晶显示偏压
11
D4
数据
4
RS
数据/命令选择
12
D5
数据
5
R/W
读/写选择
13
D6
数据
6
E
使能信号
14
D7
数据
7
D0
数据
15
BLA
背光源正极
8
D1
数据
16
BLK
背光源负极
图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
序号
指令
RS
R/W
D7
D6
D5
D4
D3
D2
D1
D0
1
清显示
0
0
0
0
0
0
0
0
0
1
2
光标返回
0
0
0
0
0
0
0
0
1
*
3
置输入模式
0
0
0
0
0
0
0
1
I/D
S
4
显示开/关控制
0
0
0
0
0
0
1
D
C
B
5
光标或字符移位
0
0
0
0
0
1
S/C
R/L
*
*
6
置功能
0
0
0
0
1
DL
N
F
*
*
7
置字符发生存贮器地址
0
0
0
1
字符发生存贮器地址
8
置数据存贮器地址
0
0
1
显示数据存贮器地址
9
读忙标志或地址
0
1
BF
计数器地址
10
写数到CGRAM或DDRAM)
1
0
要写的数据内容
11
从CGRAM或DDRAM读数
1
1
读出的数据内容
图8
1602液晶模块的读写操作、屏幕和光标的操作都是通过指令编程来实现的。
(说明:
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:
读数据。
读操作时序
1602LCD的一般初始化(复位)过程
延时15mS
写指令38H(不检测忙信号)
延时5mS
写指令38H(不检测忙信号)
延时5mS
写指令38H(不检测忙信号)
以后每次写指令、读/写数据操作均需要检测忙信号
写指令38H:
显示模式设置
写指令08H:
显示关闭
写指令01H:
显示清屏
写指令06H:
显示光标移动设置
写指令0CH:
显示开及光标设置
三、软件程程设计
源代码:
#include
#include
#include
#include
#definePCF85910x90//PCF8591地址
//elseIO
sbitLS138A=P2^2;
sbitLS138B=P2^3;
sbitLS138C=P2^4;
unsignedcharAD_CHANNEL;
unsignedlongxdataLedOut[8];
unsignedintD;
unsignedcharStringBuf[10]={0};
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
typedefunsignedcharBYTE;//用BYTE代替unsignedchar
typedefunsignedintWORD;//WORD代替unsignedint
typedefbitBOOL;//用BOOL代替bit
sbitrs=P2^6;//复位端
sbitrw=P2^5;//写数据端
sbitep=P2^7;//使能端
BYTEcodedis1[]={"==...zhudc&huzh"};
BYTEcodedis2[]={"WENHUACollege"};
/*******************延时函数********************/
voiddelay(BYTEms)
{
BYTEi;
while(ms--)
{
for(i=0;i<250;i++)
{
_nop_();
_nop_();//空执行消耗CPU时间达到等待的效果
_nop_();
_nop_();
}
}
}
/*******************LCD侧忙函数********************/
BOOLlcd_bz()
{
BOOLresult;
rs=0;
rw=1;
ep=1;
_nop_();
_nop_();
_nop_();
_nop_();
result=(BOOL)(P0&0x80);//检测P0最高位是否为1
ep=0;
returnresult;//返回侧忙结果
}
voidlcd_wcmd(BYTEcmd)
{//写入指令数据到LCD
while(lcd_bz());
rs=0;
rw=0;
ep=0;
_nop_();
_nop_();
P0=cmd;//将8位指令通过P0口传给1602
_nop_();
_nop_();//用于产生一个脉冲宽度
_nop_();
_nop_();
ep=1;
_nop_();
_nop_();
_nop_();
_nop_();
ep=0;
}
voidlcd_pos(BYTEpos)
{//设定显示位置
lcd_wcmd(pos|0x80);
}
voidlcd_wdat(BYTEdat)
{//写入字符显示数据到LCD
while(lcd_bz());
rs=1;
rw=0;
ep=0;
P0=dat;//将8位数据通过P0口传给1602
_nop_();
_nop_();
_nop_();//用于产生一个脉冲宽度
_nop_();
ep=1;
_nop_();
_nop_();
_nop_();
_nop_();
ep=0;
}
voidlcd_init()
{//LCD初始化设定
lcd_wcmd(0x38);////16*2显示,5*7点阵,8位数据
delay
(1);
lcd_wcmd(0x0c);//显示开,关光标
delay
(1);
lcd_wcmd(0x06);//移动光标
delay
(1);
lcd_wcmd(0x01);//清除LCD的显示内容
delay
(1);
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/*******************************************************************
ADC发送字节[命令]数据函数
*******************************************************************/
bitISendByte(unsignedcharsla,unsignedcharc)
{
Start_I2c();//启动总线
SendByte(sla);//发送器件地址
if(ack==0)return(0);
SendByte(c);//发送数据
if(ack==0)return(0);
Stop_I2c();//结束总线
return
(1);
}
/*******************************************************************
ADC读字节数据函数
*******************************************************************/
unsignedcharIRcvByte(unsignedcharsla)
{unsignedcharc;
Start_I2c();//启动总线
SendByte(sla+1);//发送器件地址
if(ack==0)return(0);
c=RcvByte();//读取数据0
Ack_I2c
(1);//发送非就答位
Stop_I2c();//结束总线
return(c);
}
floatDivision(floatdivisor,floatdividend)//除法,保留后5位小数
{
floatdiv;
div=(divisor*100000/dividend)*0.00001;
returndiv;
}
unsignedintVoltage=0;
//******************************************************************/
main()
{
BYTEi;
lcd_init();//初始化LCD
delay(10);
lcd_pos(3);//置显示位置为第一行的第5个字符
while(dis1[i]!
='\0')
{//显示字符"VoltageDisplay"
lcd_wdat(dis1[i]);
i++;
}
i=0;
while
(1)
{
ISendByte(PCF8591,0x40);//对0通道进行AD转换
D=IRcvByte(PCF8591);//ADC0模数转换
Voltage=Division(D,256)*5*100;//将数据转换为电压,保留2位小数
StringBuf[0]=Voltage%1000/100+0x30;//将电压值的各位转换为ASCII码,以便在LCD上显示
StringBuf[1]='.';
StringBuf[2]=Voltage%100/10+0x30;
StringBuf[3]=Voltage%10+0x30;
StringBuf[4]='V';
lcd_pos(0x44);//设置显示位置为第二行第一个字符
for(i=0;i<5;i++)
{
lcd_wdat(StringBuf[i]);//显示电压值
}
}
}
四、实验结果
五、实验结果分析(实验过程中出现问题、原因及解决方案)
这次试验中开始什么都不懂经过其他同学的帮助慢慢摸索出程序然后一步步的解决问题开始名字什么都不显示 然后知道在BYTEcodedis1[]里添加注释 最后才成功做成
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 智能 仪器 原理 设计 实验 报告