基于Proteus的89C52双机通信仿真.docx
- 文档编号:10673820
- 上传时间:2023-05-27
- 格式:DOCX
- 页数:16
- 大小:421.07KB
基于Proteus的89C52双机通信仿真.docx
《基于Proteus的89C52双机通信仿真.docx》由会员分享,可在线阅读,更多相关《基于Proteus的89C52双机通信仿真.docx(16页珍藏版)》请在冰点文库上搜索。
基于Proteus的89C52双机通信仿真
基于Proteus的AT89C52双机通信仿真
在一个Proteus工程中,添加两个AT89C52单片机,一个做主机,另一作从机。
现在要实现主机与从机之间的简单通信。
具体功能是:
主机不停扫描矩阵键盘,如果有键被按下,则把相应按键的数字发送给从机,从机通过数码管显示它接受到的数据。
主机与从机之间的通信通过串行口实现。
构建Proteus仿真图时,如果感觉图纸不够大,放置元器件比较拥挤,可以通过System选项SetSheetSide…选择A3图纸就合适了。
Proteus中的RS-232C标准接头COMPIM不需要连接MAX232,可以直接和单片机的RXD,TXD连接,因为COMPIM已经把MAX232集成在内部。
这里的串行通讯选择方式1,因为方式1的波特率与定时器T1的溢出率有关,所以可以通过设置定时器T1的初值来确定串行通信的波特率。
这里选择了波特率为9600,T1选择具有自动重装功能的方式2,那么TH1和TL1的初值通过计算得到0xfd。
具体的电路连接如下:
主机电路:
从机电路:
要顺利实现双机通信重要的是要保持两机的波特率一致。
所以,下面的一些参数设置很重要。
1.利用虚拟串口软件VirtualSerialPortDriver,建立一对相连的虚拟串口。
如果没有安装这个软件可以网上下载安装。
这是实现仿真必须的。
这里的虚拟串口为COM1和COM4,下图可以看到两个端口是相连的。
2.设置主机RS-232接头P1的参数。
Physicalport选择端口COM1,PhysicalBaudRate选择9600,VirtualBaudRate也选择9600。
其他参数默认,设置如下:
3.设置从机RS-232接头P2的参数。
Physicalport选择端口COM4,PhysicalBaudRate选择9600,VirtualBaudRate也选择9600。
其他参数默认,设置如下:
4.晶振频率设置为11.0592MHz,它与上面设置波特率为9600是对应的。
两个晶振设置相同,如下图。
5.单片机的时钟频率也要设置为11.0592MHz。
两单片机参数设置一致,如下图:
参数设置完成之后,Proteus的任务就完成了。
接着就是编写从机与主机之间的控制程序。
程序编写完成后,分别把主机程序调入U1,从机程序调入U2。
主机与从机程序如下:
1.主机程序
#include
#defineucharunsignedchar
#defineuintunsignedint
voiddelay(uintx)//延时
{
uinti,j;
for(i=0;i for(j=0;j<125;j++); } voidsent_data(uchardate)//发送数据 { SBUF=date; while(! TI); TI=0; } voidmatrixkeyscan()//键盘扫描 { uchartemp,key; P1=0xfe; temp=P1; temp=temp&0xf0; if(temp! =0xf0) { delay(10); temp=P1; temp=temp&0xf0; if(temp! =0xf0) { temp=P1; switch(temp) { case0xee: key=0; break; case0xde: key=1; break; case0xbe: key=2; break; case0x7e: key=3; break; } while(temp! =0xf0) { temp=P1; temp=temp&0xf0; } sent_data(key); } } P1=0xfd; temp=P1; temp=temp&0xf0; if(temp! =0xf0) { delay(10); temp=P1; if(temp! =0xf0) { temp=P1; switch(temp) { case0xed: key=4; break; case0xdd: key=5; break; case0xbd: key=6; break; case0x7d: key=7; break; } while(temp! =0xf0) { temp=P1; temp=temp&0xf0; } sent_data(key); } } P1=0xfb; temp=P1; temp=temp&0xf0; if(temp! =0xf0) { delay(10); temp=P1; temp=temp&0xf0; if(temp! =0xf0) { temp=P1; switch(temp) { case0xeb: key=8; break; case0xdb: key=9; break; case0xbb: key=10; break; case0x7b: key=11; break; } while(temp! =0xf0) { temp=P1; temp=temp&0xf0; } sent_data(key); } } P1=0xf7; temp=P1; temp=temp&0xf0; if(temp! =0xf0) { delay(10); temp=P1; temp=temp&0xf0; if(temp! =0xf0) { temp=P1; switch(temp) { case0xe7: key=12; break; case0xd7: key=13; break; case0xb7: key=14; break; case0x77: key=15; break; } while(temp! =0xf0) { temp=P1; temp=temp&0xf0; } sent_data(key); } } } voidmain()//主函数 { TMOD=0x20; TH1=0xfd; TL1=0xfd; SM0=0; SM1=1; TR1=1; EA=1; ES=1; while (1) { matrixkeyscan(); } } 2.从机程序 #include #defineucharunsignedchar #defineuintunsignedint ucharcodedisp[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; voiddelay(uintx) { uinti,j; for(i=0;i for(j=0;j<124;j++); } voiddisplay(uchardate)//显示 { P0=disp[date]; delay(500); } voidmain()//主函数 { TMOD=0x20; TH1=0xfd; TL1=0xfd; TR1=1; SM0=0; SM1=1; REN=1;//Notice! ! ! “REN=1”必须放在“SM0=0;SM1=1;”后。 ES=1; EA=1; P0=0x00; while (1); } voidser()interrupt4//串行中端 { uchara; RI=0; a=SBUF; display(a); } //谨供交流学习使用,如有错误欢迎指正。 //2011/11/10
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 Proteus 89 C52 双机 通信 仿真
![提示](https://static.bingdoc.com/images/bang_tan.gif)