您好,欢迎来到华拓科技网。
搜索
您的当前位置:首页proteus串口结合1602显示的仿真

proteus串口结合1602显示的仿真

来源:华拓科技网


LCDLM016LVSSVDDVEERSRWE456123U119XTAL1P0.0/AD0P0.1/AD1P0.2/AD2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6P0.7/AD7P2.0/A8P2.1/A9P2.2/A10P2.3/A11P2.4/A12P2.5/A13P2.6/A14P2.7/A15P3.0/RXDP3.1/TXDP3.2/INT0P3.3/INT1P3.4/T0P3.5/T1P3.6/WRP3.7/RD39383736353433322122232425262728101112131415161718XTAL29RST293031PSENALEEA12345678P1.0/T2P1.1/T2EXP1.2P1.3P1.4P1.5P1.6P1.7ATC5271011121314D0D1D2D3D4D5D6D7P116273849DCDDSRRXDRTSTXDCTSDTRRIERRORCOMPIM

先用Virtual serial port driver在电脑上模拟出两个串口,且它们默认已相互连接。本人模拟出的两个串口分别为COM1和COM2,它们可以在设备管理器里查看到。如下图所示:

不同电脑模拟出的虚拟串口可能不一样,但设置方法一样,即ProteusS中的COMPIM占用一个虚拟串口COM1,串口调试助手占用一个虚拟串口COM2,这样单片机就可以接收串口调试助手发来的数据,并显示在LCD上。Proteus中的仿真串口COMPIM的设置如

下图:

在“手动发送”右边的框中输入想要发送的字符,可以是10进制的数字,也可以是16进制的字符,字符源于LCD1602的字符库,如下图所示:

在上图中,比如说,数字“1”对应0011 0001,即31H,“H”表示16进制数。我们只需要在调试助手的发送框中输入31,然后将“16进制发送”选上勾,即可将数字“1”发送给单片机,单片机再将其显示在LCD上。

注意:先启动Proteus仿真,再启动调试助手,然后更改调试助手的串口号和波特率(调试助手可能会提示串口不存在,不用管它,点确定就行)。

以下是仿真代码,复制到keil或其他编辑器中,先保存为xxx.c文件后,加入工程后编译,生成hex文件,在proteus中加载即可启动仿真。

#include

#include

#include

#define uchar unsigned char

#define uint unsigned int

sbit lcd1602_rs =P3^3; //LCD指令、数据位定义

sbit lcd1602_rw =P3^4; //LCD读、写位定义

sbit lcd1602_e =P3^5; //LCD读写使能位定义

void inilcd(void); //函数声明

void wrlcd_cmd(uchar cmd); //

void wrlcd_dat(uchar dat);

void delay(uint z); //

void main(void) //主函数

{

uchar i=0,j; SBUF接收到的数据

//变量i用于对LCD1602的光标位置进行跟踪,j用于暂时存放

inilcd(); //初始化LCD1602

wrlcd_cmd(0x80); //对LCD1602写指令,使其光标回到起始位00H

wrlcd_cmd(0x0f); //对LCD1602写指令,开显示,开光标,光标闪烁

TMOD=0x20; //T1定时器工作于2(自动加载初值方式),

TH1=0xe6;TL1=0xe6; //根据波特率=1200,串口工作于方式1,晶振fosc=12MHz,

//Baud=1200=(1/32)*{(12*1000000)/(12*(256-X))},X=230=E6H,装载定时器初值

TR1=1; //启动T1定时器,

SCON=0x50; //设置串口工作于方式1

while(1) //循环接收数据

{

while(!RI); //串口中断标志位为0时,表达式为真,继续等待接收结束,结束

时引起中断,硬件自动置RI=1

RI=0; //接收完毕后,清除中断标志位

j=SBUF; //将SBUF缓存器里收到的字符存入j

wrlcd_dat(j); //将收到的字符显示在LCD1602中

i++; //LCD每显示一个字符,光标自动右移,光标位置加1

if(i==16)wrlcd_cmd(0xc0);// 如果光标到了LCD显示屏上行的最右边,换行

if(i==32){wrlcd_cmd(0x80);i=0;}//如果光标到了LCD显示屏下行的最右边,将光标归位到上行最左边

}

}

void inilcd() //初始化LCD1602

{

wrlcd_cmd(0x38); // 按芯片要求置3次功能指令,之间延时5ms

delay(5);

wrlcd_cmd(0x38); //

delay(5);

wrlcd_cmd(0x38); //

delay(5);

wrlcd_cmd(0x38); //

wrlcd_cmd(0x01); //清屏,光标归位

wrlcd_cmd(0x06); //光标自动右移,文字不移动

wrlcd_cmd(0x0f); //开总显示,开光标,光标闪烁

}

void wrlcd_cmd(uchar cmd)//写指令子函数

{

lcd1602_rw=0; //写

lcd1602_rs=0; //指令

P2=cmd; //将指令送到P2口,待写入LCD

lcd1602_e=1; //

delay(5); //

lcd1602_e=0; //使能引脚的下降沿将指令写入

}

void wrlcd_dat(uchar dat) //写显示数据子函数

{

lcd1602_rw=0; //写

lcd1602_rs=1; //数据

P2=dat; //将数据送到P2口,待写入LCD

lcd1602_e=1; //

delay(5); //

lcd1602_e=0; //使能引脚的下降沿将数据写入

}

void delay(uint z) //延时z毫秒

{

uint x,y;

for(x=110;x>0;x--)

{for(y=z;y>0;y--);}

}

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- huatuo6.cn 版权所有 赣ICP备2024042791号-9

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务