PIC单片机实例9:PC机与单片机串行全双工通信

发布者:liliukan最新更新时间:2016-11-02 来源: eefocus关键字:PIC单片机  PC机  串行  全双工通信 手机看文章 扫描二维码
随时随地手机看文章
1.  实例目的:

本实例完全建立在计算机软件的基础上,利用PROTEUS软件构建一个单片机系统,利用VB编写一个计算机控制软件和单片机系统串行通信,计算机上的控制软件可以发送一个值在0——999之间的数,在单片机系统上显示出来,单片机系统上也可输入一个相同值域的数并在计算机控制软件上显示出来。本实例主要是为了展示虚拟串行通信的仿真。

2.  系统配置

本实例虽然简单,但是要想看到想要的仿真结果,建立虚拟的串口连接是必不可少的。要想仿真串行通信,必须要把单片机系统上的串行口与计算机上的串行口连接,这样他们之间才能传输数据,但由于是仿真,实际没有相连接,所以需要创建一对虚拟串行口并使他们相连,这里我使用的是这个软件Virtual Serial Ports Driver XP 5.1(VSPD XP),打开后的界面如图1所示。在右面“ADD PAIR”按钮的旁边的下拉选项中一个选择“COM3”,一个选择

PIC单片机实例9:PC机与单片机串行全双工通信 - wujieflash - 全民电子普及网

“COM4”,然后点击“ADD PAIR”按钮,这样就完成了虚拟串口“COM3”和“COM4”的连接,完成后如图1所示。简单吧?!

       另外,你还要选择一个串口调试软件作为你的调试软件,因为当你单片机系统弄完以后而计算机上的控制软件还没有编时,没有串口调试软件的话,你就没法知道你单片机系统正确与否。这种软件网上多如牛毛,随便找一个。我的软件为SSCOM32,界面如图2所示。

PIC单片机实例9:PC机与单片机串行全双工通信 - wujieflash - 全民电子普及网

功能与用法这里就不一一介绍了,反正既能接收又能发送,实例需要的功能他都可以调试。

3.单片机系统

单片机硬件:

电路如图3所示。

PIC单片机实例9:PC机与单片机串行全双工通信 - wujieflash - 全民电子普及网

本实例采用的单片机依然是PIC16F877,他含有UASRT模块,有了它才能进行串行通信。显示部分采用3位数码管共阳输出。键盘采用矩阵键盘。这里需要特别说明的是,由于是仿真,没有采用电平转换芯片MAX232将TTL电平转换成RS232的电平,实际这一步是必需的。串行口的设置需要特别注意,由于本实例单片机程序中设置的波特率是9600,8位数据,无奇偶校验,所以串行口也要一样设置,这里由于建立的是“COM3”“COM4”之间的虚拟连接,端口号一定要设置成“COM3”或“COM4”,这是关键!如图4所示。

PIC单片机实例9:PC机与单片机串行全双工通信 - wujieflash - 全民电子普及网

单片机软件:

单片机软件主要由以下几个部分组成:初始化程序,显示程序,键盘输入程序,串行接收程序,串行发送程序。

程序采用C语言,简单明了,经过PICC编译通过。

全部程序如下:

/************************************************************

* 标题:PCtoPIC                                             *

* 用途:用于上位机与单片机之间的通讯(本例为下位机软件)    *

* 时间:2009年1月4日                                      *

* 作者:WUJIEFLASH                                        *

************************************************************/                      

#include

//预定义

#define uch unsigned char

//显示用码表

const uch shu[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x98,0xff};

//变量

int data,temp1,temp2,temp3,temp;

uch flag,keylock;

uch point,buffer[3];      

//初始化

void init()

{

       TRISB=0;

       PORTB=0;

       TRISC=0;

       PORTC=0;

       keylock=1;//初始化键盘按键标志位,用于锁定按键

      

       //USART部件初始化

       SPBRG=0x19;//设置波特率为9600bps

       TXSTA=0x04;//选择异步高速8位数据传输模式

       RCSTA=0x80;//允许串行端口工作

       TRISC=0x80;//设置为高阻态,防止干扰

       TXEN=1;//发送允许

       CREN=1;//接收允许

       PEIE=1; //开放外设中断

       RCIE=1; //开放串行口中断

       ei();    //开放总中断

}

//显示需要的延时

void delay()

{

       int i;

       for(i=0;i<1000;i++);     

}

 

//发送子程序

void send_usart()

{

       uch i;

       for(i=0;i<3;i++)//每次发3个数据

       {

              if(i==0)TXREG=data/100+0x30;//求得百位

              if(i==1)TXREG=data%100/10+0x30; //求得十位

              if(i==2)TXREG=data%10+0x30; //求得个位

 

              while(1)

              {

                     if(TXIF==1)break;//等待发送完成

              }

       }

}

 

//中断接收子程序

void interrupt receive(void)

{

       if(point<3)//是否已经接收到3个数据

       buffer[point++]=RCREG-48;//没有,继续接收

       else point=0;//是,指针复位

       data=buffer[0]*100+buffer[1]*10+buffer[2];//组合成三位数

}

 

//数码管显示

void display(int dis_data)

{

       int dis_data_ge,dis_data_shi,dis_data_bai;

       dis_data_ge =dis_data%10;//个位

       dis_data_shi=dis_data%100/10;//十位

       dis_data_bai=dis_data/100;    //百位

       if(dis_data==0)//若数据为0,只显示1位

       {

              dis_data_ge=0;

              dis_data_shi=10;

              dis_data_bai=10;

       }

       if(dis_data<10)//若数据小于10,则十位与百位关闭显示

       {

              dis_data_shi=10;

              dis_data_bai=10;

       }

       if(dis_data<100)//若数据小于100,则只显示两位

       {

              dis_data_bai=10;

       }

      

       RC0=0;

       RC1=0;

       RC2=1;

       PORTB=shu[dis_data_ge];//个位送显

       delay();

      

       RC0=0;

       RC2=0;

       RC1=1;

       PORTB=shu[dis_data_shi];//十位送显

       delay();

      

       RC1=0;

       RC2=0;

       RC0=1;

       PORTB=shu[dis_data_bai];//百位送显

       delay();  

}

 

//键盘(线反转法)

void presskey()

{

       uch line,column,key;

       TRISD=0x07;

       PORTD=0xf0;

       column=PORTD & 0x07;//取列码

 

       TRISD=0xf0;

       PORTD=0x0f;

       line=PORTD&0xf0;//取行码

       key=line|column;//合成键值

      

       if(key==0)keylock=0;//保证每次只按一次键

       if(keylock==0)

       {

              if(key!=0)keylock=1;

              switch(key)//查找键值

              {

                     case 0x11:temp=3;flag++;break;

                     case 0x12:temp=2;flag++;break;

                     case 0x14:temp=1;flag++;break;

                     case 0x21:temp=4;flag++;break;

                     case 0x22:temp=5;flag++;break;

                     case 0x24:temp=6;flag++;break;

                     case 0x41:temp=9;flag++;break;

                     case 0x42:temp=8;flag++;break;

                     case 0x44:temp=7;flag++;break;

                     case 0x82:temp=0;flag++;break;

                     case 0x81:flag=4;send_usart();break;//发送

                     case 0x84:flag=0;data=0;break;//清零键

              }

       }

       if(flag==1)//第一次按键

       {

              if(temp==0)flag=0;//若按0,则忽略

              temp1=temp;

              data=temp1;

       }

       if(flag==2)//第二次按键

       {

              temp2=temp;

              data=temp1*10+temp2;//原来的个位变成十位

       }

       if(flag==3)//第三次按键

       {

              temp3=temp;

              data=temp1*100+temp2*10+temp3;//原来的十位变成百位

              flag=4;//屏蔽按键

       }    

}

 

//主程序

main()

{

       init();

       while(1)

       {

              presskey();

              display(data);

       }

}

 

4.  计算机控制软件

上位机软件是用VB编写的,功能很简单,主要有发送和接收两个功能。软件的界面如图5所示。

PIC单片机实例9:PC机与单片机串行全双工通信 - wujieflash - 全民电子普及网

软件主要有2个“TextBox”,3个按钮,和一些文本控件组成。

现把所有程序都贴出来:

Private Sub Cmdquit_Click()

i = MsgBox("您要离开吗?", vbQuestion Or vbYesNo, "温馨提示")

If i = 6 Then

Shell "explorer.exe http://blog.163.com/wujieflash"

End

End If

End Sub

 

Private Sub Cmdsend_Click()

If Len(Text1.Text) = 1 Then MSComm1.Output = "0" + "0" + Text1.Text   '不满3位补足3位再发送

If Len(Text1.Text) = 2 Then MSComm1.Output = "0" + Text1.Text

If Len(Text1.Text) = 3 Then MSComm1.Output = Text1.Text

End Sub

 

Private Sub cmdzero_Click()

Text2.Text = ""

Text1.Text = ""

End Sub

 

Private Sub Form_Load()

MSComm1.Settings = "9600,n,8,1"    '设置数据传输率和发送字符格式

MSComm1.CommPort = 4               '设置通讯串口为4

MSComm1.InputLen = 0               '设置或返回一次从接受缓冲器中读取所有字节数

MSComm1.InBufferSize = 512         '设置接收缓冲区512BYTE

MSComm1.InBufferCount = 0

MSComm1.OutBufferSize = 512        '设置发送缓冲区512BYTE

MSComm1.OutBufferCount = 0

MSComm1.RThreshold = 3             '每3个字符到接收缓冲区都触发接收事件

MSComm1.SThreshold = 1

MSComm1.PortOpen = True

End Sub

 

Private Sub Label6_Click()

Shell "explorer.exe http://blog.163.com/wujieflash"  '我博客的超连接,多多捧场

End Sub

 

Private Sub MSComm1_OnComm()

Text2.Text = MSComm1.Input

End Sub

 

Private Sub Text1_KeyPress(KeyAscii As Integer)

If KeyAscii < Asc("0") Or KeyAscii > Asc("9") Then

KeyAscii = 0

MsgBox ("请输入数字字符!")

End If

End Sub

软件是简单了点,但功能却齐全的。

5.  总结

这次搞得这个实例仿真的确有点麻烦,不过的确能了解很多关于这串行通信方面的知识,经过自己亲自动手实现,感觉也是蛮不错的。我想大多和我一样的菜鸟或正在找寻这方面资料的朋友一定会获益非浅的。

关键字:PIC单片机  PC机  串行  全双工通信 引用地址:PIC单片机实例9:PC机与单片机串行全双工通信

上一篇:PIC单片机实例四:温度测量系统的设计与仿真
下一篇:PIC单片机实例八:四种方式24X24点阵显示

推荐阅读最新更新时间:2024-03-16 15:19

网控串行输入/输出接口选择
采用最新计算机技术来改进企业生产管理时,不可忽视的是需要在设备之间提供低电平控制和检测的可靠的通信功能。这些设备的接口通常是串行接口,往往需要选择一个适当的输入/输出卡(I/O)用来扩展所选择的计算机系统。 选择I/O扩展卡应事前考虑好,因为这样做对于任何数据的获取和系统的控制都是至关重要的。在对多个硬件和软件进行比较的前提下再选择何种主流串行I/O。特别要加以注意的是,正确地选择电气接口、电路保护、串行缓冲口容量,以及软件驱动程序可根本上决定设计的成功与否。 电气接口的选择 目前应用最广泛的通信标准是RS-232,通常用于数据速率不超过20kb/s、传输距离不超过15m的场合,实际最高数据速率可能随着包括电缆长度和环境电气噪
[嵌入式]
SPI串行总线协议
一、SPI接口简介 SPI(Serial Peripheral interface--串行外设接口)总线系统是一种同步串行外设接口,它可以使MCU与各种外围设备以串行方式进行通信以交换信息。该接口一般使用4条线:串行时钟线(SCLK)、主机输入/从机输出线(MISO)、主机输出/从机输入线(MOSI)和从机选择线SS。 SPI是一个环形总线结构,由SS(CS)、SCK、SDI、SDO构成,其时序比较简单,主要是在SCK的控制下,两个双向移位寄存器进行数据交换。 主要概括为: 上升沿发送、下降沿接受,高位在前、低位在后; 上升沿到来时,SDO电平将被送到从设备的寄存器中;下降沿到来时,SDI电平将被接收到主设备的
[单片机]
SPI<font color='red'>串行</font>总线协议
PIC单片机位域结构的应用解析
在写程序中遇到要用标志位的情况,以为可以和keil51一样进行位定义,虽知道一直报错,后来才知道MC18编译器是不支持位定义的(PICC18编译器倒是支持的)下面给出一种解决办法—》位域结构体。 有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位。例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可。为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。所谓“位域”是把一个字节中的二进位划分为几个不同的区域,并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。 这样就可以把几个不同的对象用一个字节的二进制位域来表示。一、位域的定义和位域变量的说明
[单片机]
<font color='red'>PIC单片机</font>位域结构的应用解析
51单片机之IO口扩展——74HC595芯片串行转并行实验
我们都知道通信从大的方面有两种:串行和并行。串行的最大优点是占用总线少,但是传输速率低;并行恰恰相反,占用总线多,传输速率高。市面上有很多这样的芯片,有串入并出的(通俗讲就是 一个一个进,最后一块出来),有并入串出的(相对前者而言)。具体用哪种类型要根据我们得实际情况。比如利用单片机显示数码管单纯的显示一个数码管如果仅仅是为了显示 那么动用单片机一个端口(如P0或P1/P2/P3)那没有什么,当然这里我说的数码管是8段的(如果利用BCD类型 16进制数码管那么只需四个即可)就拿51类型的单片机来说,总共32个I/O口,一般如果不是做太大的工程是完全够用的,但有些时候你会恨单片机怎么不多长几条“腿”,怎么省还是不够用。这个时候就需要
[单片机]
51单片机之IO口扩展——74HC595芯片<font color='red'>串行</font>转并行实验
STM32CubeMX系列教程10:串行外设接口SPI(一)
1.SPI简介 SPI(Serial Peripheral Interface),串行外围设备接口,一种高速的,全双工,同步的通信总线。芯片的管脚上只占用四根线。 MISO: 主器件数据输出,从器件数据输入。 MOSI:主器件数据输入,从器件数据输出。 SCK: 时钟信号,由主设备控制发出。 NSS(CS): 从设备选择信号,由主设备控制。当NSS为低电平则选中从器件。 如下为主器件与多个从器件通信,其中SCK,MOSI,MISO是接在一起的,NSS分别接到不同的IO管脚控制。主器件要和从器件通信就先拉低对应从器件的NSS管脚使能。默认状态IO1,IO2,IO3全为高电平,当主器件和从器件1通信时,拉低IO1管脚使能从
[单片机]
STM32CubeMX系列教程10:<font color='red'>串行</font>外设接口SPI(一)
89C51单片机I/O口模拟串行通信实现方法
目前普遍采用的MCS51 和P IC 系列单片机通常只有一个(或没有)UART异步串行 通信 接口,在应用系统中若需要多个串行接口(例如在多机通信系统中,主机既要和从机通信又要和终端通信)的情况下,通常的方法是扩展一片8251 或 8250 通用同步/异步接收发送 芯片 (USART),需额外占用单片机I/O 资源。本文介绍一种用单片机普通I/O 口实现串行通信的方法,可在单片机的最小应用系统中实现与两个以上串行接口设备的多机通信。   1.串行接口的基本通信方式 串行接口的有异步和同步两种基本通信方式。异步通信采用用异步传送格式,如图1 所示。数据发送和接收均将起始位和停止位作为开始和结束的标志。在异步通信中,起始位占用
[单片机]
89C51单片机I/O口模拟<font color='red'>串行</font><font color='red'>通信</font>实现方法
PIC单片机晶体选择
对于一个高可靠性的系统设计,晶体的选择非常重要。在振荡回路中,晶体既不能过激励(容易振到高次谐波上)也不能欠激励(不容易起振)。尤其在设计带有睡眠唤醒(往往用低电压以求低功耗)的系统中,若还是随手拿一颗晶体就用,你的系统可能会出问题。 这是因为低供电电压使提供给晶体的激励功率减少,造成晶体起振很慢或根本就不能起振。这一现象在上电复位时并不特别明显,原因时上电时电路有足够的扰动,很容易建立振荡。在睡眠唤醒时,电路的扰动要比上电时小得多得多,起振变得很不容易。 有人评价:PIC单片机对晶体的要求怎么这么高,用51好象从来就没有这么麻烦,手里抓到什么就用什么,也不见有问题呀?且慢,这样比较前提并不一样,同样在睡眠时,有谁见过51
[单片机]
一种高性能便携式PIC单片机湿度检测仪的研制
    摘 要: 介绍了一种高性能便携式PIC单片机湿度检测仪的研制,详细阐明了有关的工作原理和关键技术。本测试仪充分应用PIC单片机自身的软硬件资源,具有智能化,小型便携、可编程等优点,在农业、水文系统、环境监测、气象等许多领域具有广泛的应用。     关键词: PIC单片机 湿度测试仪 土壤含水量     适时准确地测量周围环境的湿度和土壤含水量在国民经济发展的许多领域中具有广泛的应用,如在农业上为了科学地对土壤进行管理,需要经常测试土壤含水量;在水利工程中,如水文站、堤坝上也需经常测试土壤含水量,此外,土壤湿度测量在环保、气象、国防施工中更是不可缺少的测量项目。如何使这种繁琐的测量以及相关数据处理实现
[应用]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved