1. 实例意图:
本实例彻底树立在核算机软件的基础上,运用PROTEUS软件构建一个单片机体系,运用VB编写一个核算机操控软件和单片机体系串行通讯,核算机上的操控软件能够发送一个值在0——999之间的数,在单片机体系上显现出来,单片机体系上也可输入一个相同值域的数并在核算机操控软件上显现出来。本实例首要是为了展现虚拟串行通讯的仿真。
2. 体系配置
本实例尽管简略,可是要想看到想要的仿真成果,树立虚拟的串口衔接是必不可少的。要想仿真串行通讯,有必要要把单片机体系上的串行口与核算机上的串行口衔接,这样他们之间才干传输数据,但由所以仿真,实践没有相衔接,所以需求创立一对虚拟串行口并使他们相连,这儿我运用的是这个软件Virtual Serial Ports Driver XP 5.1(VSPD XP),翻开后的界面如图1所示。在右面“ADD PAIR”按钮的周围的下拉选项中一个挑选“COM3”,一个挑选
“COM4”,然后点击“ADD PAIR”按钮,这样就完结了虚拟串口“COM3”和“COM4”的衔接,完结后如图1所示。简略吧?!
别的,你还要挑选一个串口调试软件作为你的调试软件,因为当你单片机体系弄完今后而核算机上的操控软件还没有编时,没有串口调试软件的话,你就无法知道你单片机体系正确与否。这种软件网上数不胜数,随意找一个。我的软件为SSCOM32,界面如图2所示。
功用与用法这儿就不逐个介绍了,横竖既能接纳又能发送,实例需求的功用他都能够调试。
3.单片机体系
单片机硬件:
电路如图3所示。
本实例选用的单片机依然是PIC16F877,他含有UASRT模块,有了它才干进行串行通讯。显现部分选用3位数码管共阳输出。键盘选用矩阵键盘。这儿需求特别阐明的是,由所以仿真,没有选用电平转化芯片MAX232将TTL电平转化成RS232的电平,实践这一步是必需的。串行口的设置需求特别注意,因为本实例单片机程序中设置的波特率是9600,8位数据,无奇偶校验,所以串行口也要相同设置,这儿因为树立的是“COM3”“COM4”之间的虚拟衔接,端口号一定要设置成“COM3”或“COM4”,这是要害!如图4所示。
单片机软件:
单片机软件首要由以下几个部分组成:初始化程序,显现程序,键盘输入程序,串行接纳程序,串行发送程序。
程序选用C言语,简略明了,通过PICC编译通过。
悉数程序如下:
/************************************************************
* 标题:PCtoP%&&&&&% *
* 用处:用于上位机与单片机之间的通讯(本例为下位机软件) *
* 时刻: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)//第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所示。
软件首要有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. 总结
这次搞得这个实例仿真确实有点费事,不过确实能了解许多关于这串行通讯方面的常识,通过自己亲自动手完成,感觉也是蛮不错的。我想大多和我相同的菜鸟或正在找寻这方面材料的朋友一定会获益非浅的。