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

Keil

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)
TDRV11

Step3:keil的设置

运行keil程序,建立一个新的工程。点击工具栏的"option for target"按钮,在出现的对话框里点击"Debug",在右栏上部的下拉菜单里选中" Proteus VSM Monitor-51 Driver",还要点击一下Use前面的小圆点。 最后还要点击后面的settings,如果你只是本机联调的话,host后面写127.0.0.1,port:后面写:8000。
Keil5

Step4:Proteus的设置。

运行Proteus,鼠标左键点击菜单栏"调试",选中"启动远程编译监视器"
另:proteus8.9->Debug->Enable Remote Debug Monitor[不要点左下角的开始],再配置keil,进入仿真。

Step5:联调

(在显示字符串函数里面打断点,按全速运行,每次显示一个字符)
①第一次走到断点,LCD上无显示
test1
②第二次走到断点,LCD上显示第一个字符
test2
③第三次走到断点,LCD上显示第二个字符
test3

二、程序代码

代码如下(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的指令了解,对代码进行了注释,并且完成了简化,可以实现相同功能;
Display
思考:显示一组带提示信息的温度、湿度数据。
Step1:将显示字符串里面的延时函数注释
Step2:

Lcd_String(0,0,"temperature:");
Lcd_String(0,1,"humidity:");

Step3:
xianshi
如果要显示温湿度数据的话将数值转化成字符串,如温度
string[0] = (tmp/10)%10 + ‘0’;
string[1] = (tmp%10) + ‘0’;
Lcd_String(12, 0, string);


总结

在51单片机的基础上,以Proteus为平台对LCD1602进行深入研究,可以对一些一知半解的东西进行尝试,加深单片机程序开发能力。

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

诊断协议那些事儿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值