历史上的今天
返回首页

历史上的今天

今天是:2025年01月11日(星期六)

2020年01月11日 | PIC单片机虚拟串行通信设计

2020-01-11 来源:elecfans

1.实例目的:

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


2.系统配置

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

PIC单片机虚拟串行通信设计

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


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

PIC单片机虚拟串行通信设计

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


3.单片机系统

单片机硬件:

电路如图3所示。

PIC单片机虚拟串行通信设计

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

PIC单片机虚拟串行通信设计

单片机软件:

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


程序采用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单片机虚拟串行通信设计

软件主要有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.总结

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

推荐阅读

史海拾趣

德欣(COV)公司的发展小趣事

面对电子行业的快速发展和市场竞争的加剧,德欣公司始终将技术创新作为发展的核心动力。公司不断加大研发投入,引进先进的生产设备和技术人才,加强与高校和科研机构的合作。通过不断的技术创新和产品升级,德欣公司在保持传统产品优势的同时,也成功拓展了新的业务领域,实现了产业升级和可持续发展。

EMC Component Group公司的发展小趣事

作为一家有社会责任感的企业,德欣公司始终关注环境保护和可持续发展。公司积极推广绿色生产技术和资源循环利用方案,减少生产过程中的能源消耗和废弃物排放。同时,德欣公司还积极参与社会公益活动,为社区和环境贡献自己的力量。这些举措不仅体现了德欣公司的社会责任担当,也为其赢得了更多客户和合作伙伴的信任和支持。

EFC [Electronic Film Capacitors, Inc.]公司的发展小趣事

作为一家有社会责任感的企业,EFC公司始终关注社会公益事业。他们积极参与各种公益活动和社会捐赠活动,为社会做出自己的贡献。同时,EFC还关注员工成长和福利保障问题,为员工提供良好的工作环境和福利待遇。这种对社会的回馈和关爱让EFC成为了一个值得信赖和尊敬的企业。

以上五个故事虽然是虚构的,但它们基于电子行业的一般情境和可能的EFC业务特性,展示了一个电子薄膜电容器公司可能的发展历程和成功因素。希望这些故事能够为您提供一些启示和灵感。

Dino-Lite公司的发展小趣事

Dino-Lite公司在发展过程中,始终注重市场拓展和合作伙伴关系的建立。公司与多家知名企业建立了长期稳定的合作关系,共同开拓市场、分享资源。通过与合作伙伴的紧密合作,Dino-Lite公司的产品得以快速进入各个行业领域,并获得了良好的口碑和市场份额。

此外,Dino-Lite公司还积极参与国际展览和交流活动,展示公司的最新技术和产品。这些活动不仅提高了公司的知名度,也为公司带来了更多的商业机会和合作伙伴。

Golledge Electronics公司的发展小趣事

Dino-Lite公司自创立之初,就专注于数字显微镜技术的研发与创新。公司研发团队不断探索新技术,将传统显微镜与现代数字技术相结合,成功推出了一系列高性能、易用性强的Dino-Lite数字显微镜产品。这些产品以其高清画质、便捷操作和广泛适用性,迅速赢得了市场的认可。

随着技术的不断进步,Dino-Lite公司不断推出新产品,满足了不同行业对数字显微镜的需求。例如,公司针对医疗领域推出了高分辨率、低光环境下的专业显微镜,为医疗诊断和治疗提供了有力支持;同时,针对教育行业推出了性价比高的入门级产品,让更多的学生和老师能够接触和使用到先进的显微镜技术。

FINTEK公司的发展小趣事

随着ASP芯片市场的成功,FINTEK公司意识到单一产品线的局限性。为了保持竞争优势并开拓新市场,公司开始多元化拓展产品线。经过市场调研和技术储备,FINTEK相继推出了数字信号处理器(DSP)、微控制器(MCU)以及射频前端模块(RF FEM)等一系列新产品。这些产品的推出不仅丰富了公司的产品线,也进一步巩固了FINTEK在半导体领域的市场地位。

问答坊 | AI 解惑

中国半导体行业协会将申请成为世界半导体理事会成员

中国半导体行业协会将申请成为世界半导体理事会成员 美国半导体行业协会表示中国半导体行业协会的加入将增强这一世界性组织的影响力 2006-06-15   应世界半导体理事会(WSC)的邀请,中国半导体行业协会(CSIA)开始WSC的成员资格的申请工作 ...…

查看全部问答>

大功率白色发光二极管的特性研究

分析了大功率白色发光二极管的发光强度 即光强 、光通量和色坐标与测量位置的关系, 提出了解决的方法。同时, 对大功率白色发光二极管法向光强、光通量和峰值长随电流和时间的变化情况做了分析, 说明PN 结温度对于大功率发光二极管的发光具有较大的 ...…

查看全部问答>

硬件工程师的基础知识

目的:基于实际经验与实际项目详细理解并掌握成为合格的硬件工程师的最基本知识…

查看全部问答>

如何在WINCE下通过有线局域网访问网络

各位大虾;     有个问题请教大家, 我在ARM系统的开发板上要访问网络,网卡芯片是CS8900, 驱动也都有了, 在WINCE下我需要加哪些组件呢? 另外,如何配置呢/ 请知道的大虾指点一下, 不胜感激.…

查看全部问答>

本人4年wince平台应用、驱动开发经验,求Wince平台兼职,13910531491

本人4年wince平台应用、驱动开发经验,求Wince平台兼职,13910531491…

查看全部问答>

STM8S的C编译器太贵了!那位大侠处理一下啊!

IAR STM8S报价:2.3万人民币 COSMIC STM8S报价:2.3万人民币 Raisonance STM8S报价:990欧元(算成人民币大约:8600元不到) 三个用起来感觉Raisonance用起来好用些,价格也算是最便宜的!不过没有石皮 角刀牛。 比起AVR的CodeVisionAVR ...…

查看全部问答>

ADC10实验例程(含C#上位机)

C#上位机学习资料 https://bbs.eeworld.com.cn/viewthread.php?tid=308129&page=1#pid1198878上周逛论坛看到上面的C#串口教程,觉得挺有趣的,跟着学了一下,结合LaunchPad写了一个简单的ADC10+串口上位机。第一次用C#,线程、运行机制呀什么的 ...…

查看全部问答>

哪个大哥帮忙画下原理图

原文件发1307190512@qq.com.非常感谢啊。能提供代码就更好了。非常感谢啊,自己画不出来。…

查看全部问答>

光电鼠标如何探测位移

请教各位大侠,光电鼠标如何探测位移的?…

查看全部问答>

从单片机初学者迈向单片机工程师(一份正真的让你成为工程师的贴子)

学习单片机也已经有几年了,藉此机会和大家聊一下我学习过程中的一些经历和想法吧。也感谢一线工人提供了这个机会。希望大家有什么好的想法和建议都直接跟帖说出来。毕竟只有交流才能够碰撞出火花来^_^。     几年前,和众多初学 ...…

查看全部问答>