历史上的今天
返回首页

历史上的今天

今天是:2024年12月24日(星期二)

正在发生

2019年12月24日 | PIC单片机与PC机实现串行通信的设计

2019-12-24 来源:elecfans

1.实例目的:

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


2.系统配置

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

PIC单片机与PC机实现串行通信的设计

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


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

PIC单片机与PC机实现串行通信的设计

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


3.单片机系统

单片机硬件:

电路如图3所示。

PIC单片机与PC机实现串行通信的设计

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

PIC单片机与PC机实现串行通信的设计

单片机软件:

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


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

全部程序如下:

#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单片机与PC机实现串行通信的设计

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

这次搞得这个实例仿真的确有点麻烦,不过的确能了解很多关于这串行通信方面的知识,经过自己亲自动手实现,感觉也是蛮不错的。

推荐阅读

史海拾趣

BILIN公司的发展小趣事

首先,需要指出的是,根据我所掌握的信息,并没有名为“BILIN”的公司在电子行业内有显著的发展记录。因此,我无法为你提供关于BILIN公司的5个发展起来的相关故事。可能是你对公司名称存在误解,或者你所指的公司在电子行业中并不广为人知。

然而,我可以为你描述一个知名的电子公司——如华为——的发展故事,作为参考。如果你对特定的公司或行业有更具体的要求,请提供更多信息,以便我能够为你提供更准确的答案。

华为的发展故事之一:技术创新的崛起

华为,作为中国电子行业的佼佼者,其发展历程充满了技术创新和不懈努力的故事。早在上世纪80年代,华为以交换机代理业务起步,逐步积累了通信行业的经验和知识。随着技术的不断进步,华为开始自主研发交换机产品,逐渐在市场上崭露头角。

进入21世纪,华为加大了对研发的投入,不仅推出了多款具有竞争力的通信设备,还开始涉足智能手机领域。通过持续的技术创新和优质的产品,华为逐渐在全球市场上取得了重要地位。

然而,华为的发展并非一帆风顺。在面对国际市场的竞争和贸易壁垒时,华为始终坚持自主创新,加强与国际合作伙伴的合作,努力拓展海外市场。同时,华为还积极投入研发,推出了5G等前沿技术,为全球通信行业的发展做出了重要贡献。

华为的发展故事,不仅是技术创新的崛起,更是中国电子行业不断壮大和走向世界的缩影。通过持续的创新和努力,华为已经成为了全球电子行业的领军企业之一。

请注意,这只是一个示例故事,并非真实关于BILIN公司的故事。如果你需要关于特定公司的信息,请提供准确的公司名称,以便我能够为你提供更准确的内容。

C-TON Industries公司的发展小趣事

随着国内市场的饱和,C-TON开始将目光投向国际市场。公司制定了全球化的发展战略,通过设立海外分公司、参加国际展会等方式,积极开拓海外市场。同时,C-TON还加强了与国际同行的交流与合作,学习借鉴他们的先进经验和技术。这些举措使得C-TON的产品逐渐在国际市场上占据了一席之地,公司的业务范围也得到了极大的拓展。

Etron公司的发展小趣事

进入21世纪,电子行业的竞争日益激烈,钰创科技意识到必须不断进行技术创新才能保持竞争优势。公司加大了研发投入,成功开发出了一系列先进的内存芯片和系统芯片技术。这些技术突破不仅提升了产品的性能和质量,也帮助公司赢得了更多国际客户的认可和信任。

台湾兆欣(EMTEK)公司的发展小趣事

在立足台湾市场的同时,兆欣也积极拓展海外市场。他们通过参加国际展会、与海外客户建立合作关系等方式,成功将产品打入国际市场。特别是在亚洲地区,兆欣的产品受到了广泛欢迎和认可。这种多元化的市场布局为公司的快速发展提供了有力支持。

DBLECTRO公司的发展小趣事

在全球化的大背景下,迪贝电子也积极拓展海外市场。公司通过参加国际展览、与国际知名企业合作等方式,不断推广其品牌和产品。同时,公司还针对不同国家和地区的市场需求,推出了适应当地环境和使用习惯的产品。这些努力使得迪贝电子的产品逐渐得到了全球用户的认可和信赖。

Epistar Corp公司的发展小趣事

作为一家电子产品制造企业,Epistar始终关注环保和可持续发展问题。公司积极采用环保材料和生产工艺减少污染排放和能源消耗;同时,Epistar还加强了对废旧产品的回收和处理工作以减少对环境的负面影响。这些努力不仅提升了公司的社会形象也增强了公司的市场竞争力。

问答坊 | AI 解惑

数码管段位计算程序

网上找的数码管段位计算程序。对初学者可能有帮助,高手勿扰…

查看全部问答>

mif文件生成小工具,自己再往下找的,大家看下啊

可以看频谱,可以生成四种基本波形,和自己手绘波形…

查看全部问答>

proteus仿真问题

因为还在等器件所以想用proteus做下仿真 但发现有的器件找不到      有地方可以下元器件库么…

查看全部问答>

时序分析与时序约束

时序分析与时序约束…

查看全部问答>

X射线对人体有何损害作用?应采用什么防护措施?

1)生物体接收X射线照射时,产生生物效应,破坏正常的组织细胞,产生生物损伤。 2) 主要从以下几个方面加强防护: ①加强固有防护设施;②缩短X射线照射时间;③加大与X射线源的距离;④尽可能应用各种屏蔽。 详细分析: X射线与物质相互作用时产生 ...…

查看全部问答>

wince 串口通信

我自己写了一个串口通信工具, 用 VS2005 单步调试时,接收数据是正确的,但正常运行时,接受数据有误, eg: 源数据:1234567 1234567 ..........   接收显示:1111111 2345677 1111111 2345677 ............. 请问这是什么原因?是不 ...…

查看全部问答>

STM32的IAP应用问题

有人做过STM32 的IAP吗 我用CAN接口做了IAP 有两个程序区 8000000-8002000是BOOT区,写入的启动代码,引导应用程序写入的。 8002000-结尾是应用区,APP程序区 现在的问题是进行APP程序后,不响应中断 如果不用中断程序,在APP工作一切正 ...…

查看全部问答>

RS485的奇怪问题

我是147调试MODUS程序的,接收是采用中断,发送放在main中,接收中断中一次收8个字节的数据,可是总是第一个数据大部分是不正确,本来发送的3,结果接收后就变成了0x85等一些其他数,更奇怪的是我的主程序里面做了一些改动,就是注释掉一些函数(减 ...…

查看全部问答>

DA双缓冲方式

本帖最后由 paulhyde 于 2014-9-15 09:43 编辑 DA双缓冲方式,编程应该怎么编,我的怎么不能传送数据?  …

查看全部问答>

视频信号转换问题

请问:视频信号转换ADV7123的10位数据位一定要用上吗?跟我们平时说的8位有什么区别?谢谢!…

查看全部问答>