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仿真

基于单片机串口远程多路温湿度采集仿真-毕设课设资料

51单片机的家居空气质量监控系统设计(原理图+PCB+仿真+源码+论文)

51单片机串口通讯实验2+Proteus仿真