51单片机仿真开发环境构建实验
Posted 皓霂dc
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了51单片机仿真开发环境构建实验相关的知识,希望对你有一定的参考价值。
51单片机仿真开发环境构建实验目录
实验目的
(1)熟悉Windows 10系统下Proteus8.6和Keil5的安装与使用方法;
(2)熟悉Keil软件和Proteuss仿真硬件联合调试环境的构建与使用;
(3)基于LCD显示实验验证所构建的开发环境
一、实验步骤
(1)keil5的安装与设置许可,Proteus8.6软件的安装与汉化
(2)熟悉keil软件和Proteus软件联合调试环境的构建
Step1:之前Debug,USE里面没有Proteus VSM Monitor Driver
Step2:把VDM51.dll复制到Proteus 8 Professional\\MODELS文件夹下和Keil\\MDK\\C51\\BIN文件夹下。
注:【proteus8.9无这个文件,安装在BIN目录下】
在TOOLS.INI文件里面 [C51] 栏目下加入 TDRV11=BIN\\VDM51.DLL (“Proteus VSM Monitor-51 Driver” ) ,其中“TDRV11” 中的 “11”要根据实际情况写,不要和原来的重复。(我的这个文件中已经有了从TDRV1到TDRV10, 所以我用的是TDRV11)
Step3:keil的设置
运行keil程序,建立一个新的工程。点击工具栏的"option for target"按钮,在出现的对话框里点击"Debug",在右栏上部的下拉菜单里选中" Proteus VSM Monitor-51 Driver",还要点击一下Use前面的小圆点。 最后还要点击后面的settings,如果你只是本机联调的话,host后面写127.0.0.1,port:后面写:8000。
Step4:Proteus的设置。
运行Proteus,鼠标左键点击菜单栏"调试",选中"启动远程编译监视器"
另:proteus8.9->Debug->Enable Remote Debug Monitor[不要点左下角的开始],再配置keil,进入仿真。
Step5:联调
(在显示字符串函数里面打断点,按全速运行,每次显示一个字符)
①第一次走到断点,LCD上无显示
②第二次走到断点,LCD上显示第一个字符
③第三次走到断点,LCD上显示第二个字符
二、程序代码
代码如下(keil):
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define out P0
sbit RS=P2^0;
sbit RW=P2^1;
sbit EN=P2^2;
void check_busy(void);
void write_command(uchar com);
void write_data(uchar dat);
void LCD_initial(void);
void string(uchar ad,uchar *s);
void lcd_test(void);
void delay(uint);
void Lcd_Set(uchar x,uchar y);
void Lcd_String(uchar x,uchar y,uchar *str);//x:0表示在第一个格子显示,y:0第一行,1第二行
uchar array1[]="1";
uchar array2[]='2';
uchar array3[]=49;
uchar array4[]=0x31;
//主程序
void main(void)
LCD_initial();
while(1)
// string(0x85,"Welcome");
// string(0xC2,"WUHAN CHINA");
// delay(100);
// write_command(0x01);//清屏
// delay(100);
// Lcd_String(0,0,array1);
// Lcd_String(1,1,array2);
// Lcd_String(4,0,array3);
// Lcd_String(0,1,array4);
// Lcd_String(3,1,"dc17130091");
// Lcd_String(4,0,"Welcome");
// Lcd_String(2,1,"WUHAN CHINA");
// delay(1);
// write_command(0x01);//清屏
// delay(100);
Lcd_String(0,0,"temperature:");
Lcd_String(0,1,"humidity:");
//1ms延时程序
void delay(uint j)
uchar i=250;
for(;j>0;j--)
while(--i);
i=249;
while(--i);
i=250;
//检测忙程序,D7为1则busy,不能进行读写操作;每次读写前应“忙”检测
void check_busy(void)
uchar dt;
do
dt=0xff;
EN=0;
RS=0;
RW=1;
EN=1;
dt=out;
while(dt&0x80);
EN=0;
//写控制指令
void write_command(uchar com)
check_busy();
EN=0;
RS=0;
RW=0;
out=com;
EN=1;
_nop_();
EN=0;
delay(1);
//写数据指令
void write_data(uchar dat)
check_busy();
EN=0;
RS=1;
RW=0;
out=dat;
EN=1;
_nop_();
EN=0;
delay(1);
//液晶屏初始化
void LCD_initial(void)
write_command(0x38);//设置16*2显示,每个方块5*7点阵,8位数据接口
write_command(0x0C);
//0000 1DCB(D=1开显示,C=1显示光标,B=1光标闪烁)//0000 1100
//0000 01NS(N=1读或写后地址光标加1,N=0减1;S=1整屏移动光标不动,S=0整屏不动光标动)
write_command(0x06);//光标右移(每次写入数据后地址指针加1)
write_command(0x01);//0x01数据指针清零,显示清零;0x02数据指针清零
delay(1);
//输出字符串
void string(uchar ad,uchar *s)
write_command(ad);
while(*s>0)
write_data(*s++);
delay(100);
//设置地址
void Lcd_Set(uchar x,uchar y)
uchar addr;
if(y==0)
addr=0x00+x;
else
addr=0x40+x;
write_command(addr|0x80);
//显示一段字符串
void Lcd_String(uchar x,uchar y,uchar *str)
Lcd_Set(x,y);
while(*str != '\\0')
write_data(*str++);
// delay(100);
三、实验分析
(1)显示屏连单片机的P0口的话,一定要加上拉电阻,要不然驱动不了,因为单片机的四组IO口就P0的内部无上拉,驱动能力弱。而P2口内部已经有上拉电阻了,不需要再外接排阻进行上拉。
(2)通过对LCD1602的指令了解,对代码进行了注释,并且完成了简化,可以实现相同功能;
思考:显示一组带提示信息的温度、湿度数据。
Step1:将显示字符串里面的延时函数注释
Step2:
Lcd_String(0,0,"temperature:");
Lcd_String(0,1,"humidity:");
Step3:
如果要显示温湿度数据的话将数值转化成字符串,如温度
string[0] = (tmp/10)%10 + ‘0’;
string[1] = (tmp%10) + ‘0’;
Lcd_String(12, 0, string);
总结
在51单片机的基础上,以Proteus为平台对LCD1602进行深入研究,可以对一些一知半解的东西进行尝试,加深单片机程序开发能力。
以上是关于51单片机仿真开发环境构建实验的主要内容,如果未能解决你的问题,请参考以下文章
Proteus仿真51单片机+SHT11温湿度传感器+LCD1602显示
51单片机 DHT11+LCD1602温湿度显示 + Proteus仿真
51单片机 DHT11+LCD12864温湿度显示 + Proteus仿真