C51LCD1602VB上位机实现简单通信.docx
- 文档编号:1910425
- 上传时间:2022-10-25
- 格式:DOCX
- 页数:13
- 大小:249.11KB
C51LCD1602VB上位机实现简单通信.docx
《C51LCD1602VB上位机实现简单通信.docx》由会员分享,可在线阅读,更多相关《C51LCD1602VB上位机实现简单通信.docx(13页珍藏版)》请在冰豆网上搜索。
C51LCD1602VB上位机实现简单通信
设计
基本原理
主要功能:
上位机和下位机连接好后握手,如果成功,上位机就可以发字符串让下位机的LCD显示出来,如果没有握手就不显示上位机发来的内容.
下位机设计:
主程序首先初始化串口和LCD,然后进入一个死循环,这个循环往
LCD写dataArray这个数组中的数据,因此只要改变了这个数组中的第0-31位的内容就相当于改变了屏幕上显示的内容.当串口发来消息的时候,执行中断号为4(串口中断)的服务子程序.这时候还不能让上位机往下位机传字符串,因此需要判断是否已经握手,判断的标志就是dispEn(displayenable),如果等于0说明还没有握手,就把用户发来的数据当成是控制字control,如果是等于1说明之前已经握过手了,就把用户发来的数据放到dataArray中.最后判断控制字是否是握手,如果control等于0x00是就握手信号,然后回复0x01.然后把dispEn=1,最后把控制字control改掉(因为下一次中断可能已经不是握手信号了)
上位机设计:
由于已经把端口号写在vb程序中了,所以要改端口号的话要进vb
第1页的代码中把MSComm1.CommPort=4中的4改为自己需要的串行端口号.然后运行程序,打开端口,此时没有和下位机握手,所以输入数据后单击发送是没有反应的,所以需要先单击握手按钮,向传哭发送0x00,然后延时800毫秒等待回复,然后接收数据,如果回复的是0x01那就表明握手成功,如果没有回复那就是握手失败.用户点击发送信息,上位机把字符串拆分成字符来发送一次发送一个字符每个字符发送延时30毫秒避免因为连续发送而造成的乱码.
a)原理框图
b)硬件电路原理图
第2页
AT89C52
1~8:
I/OP1口(P1.0~P1.7);
9:
复位脚(RST/Vpd);
10~17:
I/OP3口(P3.0=RXD,P3.1=TXD,P3.2=-INT0,P3.3=-INT1,P3.4=T0,
P3.5=T1,P3.6=-WR,P3.7=-RD)主要是此引脚;
18、19:
晶振(18=XTAL2,19=XTAL1);
20:
地(Vss);
21~28:
I/OP2口(P2.0~P2.7);
29:
-PSEN;
30:
ALE/-PROG;
31:
-EA/Vpp
32~39:
I/OP0口(P0.7~P0.0);
40:
+5V电源。
MAX232
第3页
产生+5v和-5v两个电源,提供给RS-232串口电平的需要。
第二部分是数据转换通道。
由7、8、9、10、11、12、13、14脚构成两个数据通道。
其中13脚(R1IN)、12脚(R1OUT)、11脚(T1IN)、14脚(T1OUT)为第一数据通道。
8脚(R2IN)、9脚(R2OUT)、10脚(T2IN)、7脚(T2OUT)为第二数据通道。
TTL/CMOS数据从T1IN、T2IN输入转换成RS-232数据从T1OUT、
T2OUT送到电脑DB9插头;DB9插头的RS-232数据从R1IN、R2IN输入转换成TTL/CMOS数据后从R1OUT、R2OUT输出。
第三部分是供电。
15脚GND、16脚VCC(+5v)
LCD1602
第4页
2.软件设计
a)流程图
第5页
1.主程序流程图
2.串口中断服务程序流程图
b)代码(请参照代码附录第10页)
第6页调试连线装载下位机程序后开始调试。
打开下位机电源,在输出文本框中输入字母abc,点发送没反应。
点击握手按钮后,在接收文本框中显示握手成功后再点击发送按钮,
LCD上显示出字母“abc”。
每点击一次就发送一次,LCD第一行被字母填满后会自动跳到第二显示,第二行也填满后会重新跳到第一行来继续显示,如此循环。
如果下位机电源没打开就向下位机发送握手,则会在接收文本框中显示握手失败。
发送的字母和数字,还有符号都能正确显示。
发送中文则显示为乱码。
第7页
代码附录
下位机
#include
#defineuintunsignedint
#defineucharunsignedchar
uchardataArr[32]={"hellohxwaitingforshakehand"};codeucharshOKStr[32]=("shakehandsuccesful");
voidlcd_init();
voidlcd_command(uchar);//lcd命令字写入
voidlcd_dataArr(uchar);//lcd显示数据写入
voiddelay(uchar);//延时
voiddisplayArray(uchar*arr[]);//显示一个数组的内容
voidclearDataArr();//清空显示数组voidserial_init(void);
voidserial(void);
//LCD初始化voidlcd_init()
lcd_command(0x38);
lcd_command(0x38);
lcd_command(0x08);
lcd_command(0x01);
lcd_command(0x06);
lcd_command(0x0c);
delay
(2);
//LCD指令
voidlcd_command(ucharl_data)
第8页
RS=0;
RW=0;
E=1;
P0=l_data;
E=0;
delay
(2);
RW=1;
}
//LCD数据
voidlcd_data(ucharl_data)
{
RS=1;
RW=0;
E=1;
P0=l_data;
E=0;
delay
(2);
RW=1;
}
//延时
voiddelay(uchari)
{
ucharj;
while(i--)
{
j=128;
while(j--);
}
}
//串口中断服务程序,从RI判断接收中断,TI判断发送中断,由软件清除
voidserial()interrupt4using1
{
while(RI==0);//等待接收
RI=0;
if(current==32)current=0;//如果写到数组结尾就从头开始
if(dispEn==1)
{dataArr[current]=SBUF;//如果已经握手成功就把SBUF送数据数组current++;
}
if(dispEn==0)
第9页
送控制字符
if}(control==0x00)//如果控制字符是握手00,那就回
复01表示接受
{
SBUF=0x01;//发送回上位机说明握手接受
while(TI==0);
TI=0;
for(current=0;current<32;current++)//显示握手成功dataArr[current]=shOKStr[current];
dispEn=1;//我收过后可以接受数据了
control=0x01;//清除
}
//显示控制
voiddisplayArray(uchararr[])
{uchari=0;lcd_command(0x80);//写第一行for(i=0;i<16;i++)
{lcd_data(arr[i]);
}
lcd_command(0xc0);//写第二行
for(i=16;i<32;i++)
{
lcd_data(arr[i]);
}
}
voidclearDataArr()
{
for(current=0;current<32;current++)dataArr[current]="";
}//初始化串口voidserial_init(void)
第10页
TMOD=0x20;
TH1=0xf3;//2400波特TL1=0xf3;
SCON=0xd8;//方式3
PCON=0x00;
TR1=1;
ES=1;//打开串口中断
EA=1;//允许中断
RI=0;
TI=0;
}
//主函数
voidmain(void)
{
serial_init();lcd_init();
delay(20000);
while
(1)
{
displayArray(dataArr);//processmsg();
}
}
第11页
上位机
PrivateDeclareSubSleepLib"kernel32"(ByValdwMillisecondsAs
Long)'延时函数
PrivateSubclear_receivetext_Click()
receivetext.Text=""
EndSub
PrivateSubclear_sendtext_Click()
sendtext.Text=""
EndSub
PrivateSubclose_Click()MSComm1.PortOpen=False'关闭串口Label3="当前状态:
关闭"
EndSub
PrivateSubCommand1_Click()
EndSub
PrivateSubclr_Click()
OnErrorResumeNext'简单的错误处理
第12页
IfMSComm1.PortOpen=FalseThen
MsgBox"串口已关闭"
EndIf
'用FF代表清屏
MSComm1.Output=Chr(255)
MSComm1.InputMode=comInputModeText'设置接受模式
是文本接受,还是二进制接受
EndSub
PrivateSubForm_Load()
Label3="当前状态:
关闭"
EndSub
PrivateSubopen_Click()
MSComm1.CommPort=4'使用串行端口4
MSComm1.Settings="2400,N,8,1"'设置波特率等
MSComm1.InputLen=0'清空从接收缓存器中读到的字符
MSComm1.PortOpen=True'打开端口
Label3="当前状态:
打开"
EndSub
第13页
PrivateSubreceive_Click()
receivetext.Text=MSComm1.Input
的数据以文本形式写到接收部分的窗体内这是核心代码。
'实现将接受到
EndSub
PrivateSubsend_Click()
OnErrorResumeNext
'简单的错误处理
IfMSComm1.PortOp
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C51LCD1602VB 上位 实现 简单 通信