基于51单片机的串行通信(二)<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
51单片机可以相互之间进行串行通信(本人的上篇博文已举例详述),也可以与PC机之间进行串行通信,下面举例详述。
1 硬件设计
51单片机与PC机之间进行串行通信。当按下按钮时,51单片机向PC机发出0、1、2……9共十个数据;当在PC机键盘上敲击任一按键时,PC机(虚拟终端VT2)向51单片机发出该字符的ASCII码,51单片机经串口接收后由数码管显示其数值。电路原理图如下所示。
<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />
在桌面上双击图标,打开ISIS 7 Professional窗口(本人使用的是v7.4 SP3中文版)。在器件选择按钮
中单击“P”按钮,或执行菜单命令“库”→“拾取元件/符号”,添加如下表所示的元件。
51单片机AT89C51 一片 | 晶体CRYSTAL 11.0592MHz 一只 |
瓷片电容CAP 22pF 二只 | 电解电容CAP-ELEC 10uF 一只 |
电阻RES 10K 一只 | 双列电阻网络 Rx8 300R(Ω) 一只 |
二位七段数码管7SEG-MPX2-CA 一只 | 电阻RES 4.7K 二只 |
三极管 PNP 9015 二只 | D型九针插座COMPIM 一只 |
按钮 BUTTON 一只 |
|
在工具栏中单击虚拟仪器按纽,再在对象选择器中选择虚拟终端——VIRTUAL TERMINAL,放置两个虚拟终端。要注意它们的极性,需分别左键双击VT1和VT2,在Advanced Properties中选择Inverted。
若用Proteus软件进行仿真,则上图中的晶振和复位电路以及U1的31脚,都可以不画,它们都是默认的。
在ISIS原理图编辑窗口中放置元件,再单击工具箱中元件终端图标,在对象选择器中单击POWER和GROUND放置电源和地。放置好元件后,布好线。再左键双击各元件,设置相应的元件参数,完成电路图的设计。最后将其保存的文件名为“串2.DSN”。
2 软件设计
51单片机与PC机之间串行通信中51单片机的流程图如下所示。
51单片机的串口接收PC机发出的数据采用中断方式,其详细的C51程序如下。
/***********************
51单片机与PC机串行通信
***********************/
#include<reg51.h> //包含单片机寄存器的头文件
#define uchar unsigned char
#define uint unsigned int
unsigned char code ddata[]={
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
0x88,0x83,0xc6,0xa1,0x86,0x8e
}; //0,1,2,3,4....E,F的段码
uchar code s[ ]={"0123456789"}; //本机将发出的数据
uchar dat;
sbit sw="P1"^0;
/****延时函数***************/
void delayms(uint t)
{
uint i,j;
for(i=0;i<t;i++)
for(j=0;j<120;j++)
;
}
/***************
主函数
****************/
void main(void)
{
uchar i,dath,datl;
TMOD=0x20; //TMOD=0010 0000B,定时器T1工作于方式2
SCON=0x50; //SCON=0101 0000B,串口工作方式1,允许接收
PCON=0x00;
TH1=0xfd; //定时器TH1赋初值,波特率9600
TL1=0xfd; //定时器TL1赋初值
TR1=1; //启动定时器T1
IE=0X90; //开串行口中断及总中断
F0=0; //数据接收标志
while(1)
{
if(sw==0)
{ //按钮按下
delayms(20); //消抖
if(sw==1) break;
i=0; //按钮仍按下
while(s!='\0')
{ //不等于字符结束标志
SBUF=s;
while(TI==0);
TI=0;
i++;
}
}
while(sw==0); //松开按钮退出
if(F0)
{ //串口收到数据
dath=dat>>4; //收到的数据分成两个字节
datl=dat&0x0f;
F0=0;
}
for(i=0;i<2;i++)
{
switch(i)
{
case 0:{P0=ddata[dath];P2=0XFE;break;} //显示第一个字
case 1:{P0=ddata[datl];P2=0XFD;break;}// 显示第二个字
}
delayms(5);
P2=0XFF;
}
}
}
/*********************
串口接收中断子函数
*********************/
void serial_int() interrupt 4
{
ES=0; //关闭串口中断
RI=0; //清除串行接收标志
dat=SBUF; //读取字符
F0=1; //置位串行接收标志
ES=1; //允许串口中断
}
打开Keil程序(本人使用的是Keil8.05中文版),执行菜单命令“工程”→“新建工程”创建“串2”项目,并选择单片机型号为AT89C51。执行菜单命令“文件”→“新建”创建文件,输入51单片机机的C语言源程序,保存为“串2.C”。在Project Workspace窗口中右击源代码组1,选择“添加文件到组‘源代码组 l’”将源程序“串2.C”添加到项目中。
在Keil中执行执行菜单命令“工程”→“创建目标”(或点击“创建目标”快捷按钮),编译源程序。如果编译成功,则在“Output Window”的“创建”窗口中显示没有错误,并创建了“串2.HEX”文件。
3 仿真与调试
关于Proteus与Keil的联合仿真调试,可参见我以前所写的博文或其它参考资料。需注意Proteus的ISIS CPU属性中Program File与Keil的μVision3中的路径和文件名要一致(或Program File为空)。
启动Proteus的ISIS,并将其放在屏幕的右上角(可将原理图放大到合适大小);再启动Keil的μVision3,并将其放在屏幕的左下角。
在Keil中执行菜单命令“调试”→“启动/停止调试”,或直接单击图标,进入Keil调试环境。同时,在Proteus ISIS的窗口中可看出Proteus也进入了程序调试状态。
在Keil代码编辑窗口中设置相应断点,断点的设置方法:在需要设置断点语句前双击鼠标左键,可设置断点;再次双击,可取消该断点。
在Keil中按F5键(或点击“运行”快捷按钮)运行程序。当按下按钮,51单片机通过串口发出0、1、2……9十个数据,虚拟终端VT1上将显示出ASCII码,如下图所示。
<?xml:namespace prefix = w ns = "urn:schemas-microsoft-com:office:word" />
当在PC机敲击键盘时,虚拟终端VT2上将显示该字符并向51单片机发出相应的ASCII码,51单片机收到后在其数码管上显示,如下图所示。
或可以点击单步、运行到光标处、全速运行等快捷按钮,以及同时观察工程窗口寄存器页面、存储器窗口等,来进行仿真调试。
本人邮箱:txxyc104@163.com,欢迎来信讨论.
文章评论(0条评论)
登录后参与讨论