原创 基于51单片机的串行通信(二)

2010-5-24 10:13 5646 9 9 分类: MCU/ 嵌入式

基于51单片机的串行通信(二)<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />


51单片机可以相互之间进行串行通信(本人的上篇博文已举例详述),也可以与PC机之间进行串行通信,下面举例详述。


 


1  硬件设计


51单片机与PC机之间进行串行通信。当按下按钮时,51单片机向PC机发出012……9共十个数据;当在PC机键盘上敲击任一按键时,PC机(虚拟终端VT2)向51单片机发出该字符的ASCII码,51单片机经串口接收后由数码管显示其数值。电路原理图如下所示。


<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />


 点击看大图


在桌面上双击图标e428458b-1a6f-4685-abdd-5aa1b474fde5.jpg,打开ISIS 7 Professional窗口(本人使用的是v7.4 SP3中文版)。在器件选择按钮76117b74-57a7-4405-9188-76efaaa48f71.jpg中单击“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            一只


 


在工具栏中单击虚拟仪器按纽60f0e25f-9e4b-4251-9650-b887cc1ae830.jpg,再在对象选择器中选择虚拟终端——VIRTUAL TERMINAL,放置两个虚拟终端。要注意它们的极性,需分别左键双击VT1VT2,在Advanced Properties中选择Inverted


若用Proteus软件进行仿真,则上图中的晶振和复位电路以及U131脚,都可以不画,它们都是默认的。


ISIS原理图编辑窗口中放置元件,再单击工具箱中元件终端图标95c693d0-1f32-42a2-b84b-df333cfa1e26.jpg,在对象选择器中单击POWERGROUND放置电源和地。放置好元件后,布好线。再左键双击各元件,设置相应的元件参数,完成电路图的设计。最后将其保存的文件名为“串2.DSN”。


 


2        软件设计


51单片机与PC机之间串行通信中51单片机的流程图如下所示。



5e1a430d-28d3-4649-b22a-80a742e35ca9.jpg


 


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  仿真与调试


关于ProteusKeil的联合仿真调试,可参见我以前所写的博文或其它参考资料。需注意ProteusISIS CPU属性中Program FileKeilμVision3中的路径和文件名要一致(或Program File为空)。


启动ProteusISIS,并将其放在屏幕的右上角(可将原理图放大到合适大小);再启动KeilμVision3,并将其放在屏幕的左下角。


    Keil中执行菜单命令“调试”→“启动/停止调试”,或直接单击图标e153655c-d30d-40e4-92b7-6a5de6faf5d0.jpg进入Keil调试环境。同时,在Proteus ISIS的窗口中可看出Proteus也进入了程序调试状态。


   Keil代码编辑窗口中设置相应断点,断点的设置方法:在需要设置断点语句前双击鼠标左键,可设置断点;再次双击,可取消该断点。


Keil中按F5键(或点击“运行”快捷按钮)运行程序。当按下按钮,51单片机通过串口发出012……9十个数据,虚拟终端VT1上将显示出ASCII码,如下图所示。


<?xml:namespace prefix = w ns = "urn:schemas-microsoft-com:office:word" />


0f5b3080-5cfd-45f5-aa43-ba1760a60adb.jpg 




 


当在PC机敲击键盘时,虚拟终端VT2上将显示该字符并向51单片机发出相应的ASCII码,51单片机收到后在其数码管上显示,如下图所示。



98031460-7134-4afb-83e7-b1914f394356.jpg 








 


或可以点击单步、运行到光标处、全速运行等快捷按钮,以及同时观察工程窗口寄存器页面、存储器窗口等,来进行仿真调试。


 


    本人邮箱:txxyc104@163.com,欢迎来信讨论.


 

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
9
关闭 站长推荐上一条 /3 下一条