求单片机控制器和PC上位机的接口和通讯协议

本人想做一个单片机控制的大门开关系统,单片机还需要接PC机,单片机控制器输入信号随意,磁卡射频卡都可以,但是请问下单片机和PC上位机连接最好用什么接口、什么样的通讯协议越... 本人想做一个单片机控制的大门开关系统,单片机还需要接PC机,单片机控制器输入信号随意,磁卡射频卡都可以,但是请问下单片机和PC上位机连接最好用什么接口、什么样的通讯协议越详细越好,好的可以加分
现在我要接两台读卡器,接两个门,当然也都接上PC,设备之间最远距离确定为15米左右,是不是RS232就不行了,而且接两台设备的话接口是不是不够,如果以后还需要扩展好花选什么样接口好,最佳答案再加50分
展开
 我来答
嘲讽帅哥
推荐于2016-02-06 · TA获得超过1186个赞
知道小有建树答主
回答量:113
采纳率:0%
帮助的人:188万
展开全部
其实用什么通讯都是可以的,因为接到单片机的管脚都是一样的
鉴于需要带屏蔽层,抗干扰,控制元件与PC距离远,我建议用485通讯线,成本较低,通讯模块选用MAX485,单片机不需要什么协议,自己想怎么写就怎么写,下面我演示一下上面朋友需要的功能如何实现
#include <reg51.h> //选用晶振11.0592MHz
void open();
void dalay10us()
{
unsigned i;
for(i=10;i>0;i--);
}

main()
{
EA=1;
TMOD=0x20; //定时器T1方式为2
TH1=0xfa; //波特率设定为9600
TL1=0xfa;
ES=1; //串口通讯允许开
SCON=0xf0; //串口方式为3,SM2=1,REN=1允许接受
PCON=0x80; //SMOD=1
TR1=1;
while(1); //等待
}

void open()
{
P1=1; //给P1.0口输出一个宽度为10us的脉冲,控制开门
dalay10us();
P1=0;
}
void counter4(void) interrupt 4 //串口中断
{
while(RI==0); //等待接受完毕
if(SBUF>0&&SBUF<=5) //判断感应接受的是不是在1到5内,这里可以自己设置范围
open(); //如果是的话,启动开门动作
RI=0; //如果不是,就不动作,结束中断
}
最后说明一下,硬件部分需要一个确认工具,报给单片机,如果在这范围内,单片机会由P1.0口输出一个1us宽度的脉冲,需要一个接受元件确认,后开门,我只是提供一个思路和方法,朋友们可以在这这模版基础上添加需要的功能
追问
我现在添加了的补充问题,求助!谢谢!
追答
其实你用232和485最终所接单片机的接口都是一样的,所以,你用485线和232线,都是可以的,只是可能考虑到485线只有2条线,可以带屏蔽,估计成本会比232低一点,其实才15米长度,那喜欢用什么线都是可以的,不影响
要接两台读卡器,那就有2个单片机是分开控制2个门的话,只要在发送数据的时候,首先发的是自己的地址编号,让PC做个分辨,就可以了,如:
我设置A门发送的第一个数据是A地址,第二个数据才是真正的卡地址,PC所做的接受处理是,第一个数据保存在一个单元,先判断第二个数据是否是合法的,合法,也是先发送A地址,后发送指令开门,这样两个门就不会互相干扰了
lgyytu0
2011-08-08
知道答主
回答量:10
采纳率:0%
帮助的人:4.3万
展开全部
看起来你的系统不是很复杂,建议你使用RS232接口,这个是最基本串行协议。程序也十分简单。硬件也十分简单
#include<reg52.h>
#include<serial.c>

#define uchar unsigned char
#define uint unsigned int
unsigned char receive;
unsigned char serial_flag=0;

/*********************初始化******************************/
void serinit()
{
SM0=0;
SM1=1;
REN=1;

TMOD |=0x20;
TH1=0xFD;
ES=1;
EA=1;
TR1=1;
}
/*****************传送数据****************************/
void serisend(unsigned char seri_dat[],unsigned char lenth)
{
unsigned char i=0;
ES=0;
serial_flag=0;
while(i<lenth)
{
SBUF=seri_dat[i]; //发送一字节数据
while(TI==0);//等待发送
TI=0; //退出发送中断
i++;
}
ES=1;
}
void main( void )
{
uchar lenth=0,i=0;
uchar seritab[]={"good car is very good"};

serinit();

while(seritab[i++]!='\0')
lenth++;

while(1)
{
if(serial_flag==1)
serisend(seritab,lenth);
}
}

/****************************串行中断********************/
void serial()interrupt 4 using 3
{
receive=SBUF; //接收一字节数据
if(RI==1) //测试用
serial_flag=1;
RI=0; //退出接收中断
}

/**************************************************
调用函数说明
1、定义接收变量receive
2、定义初始化函数serinit()、发送函数serisend(unsigned char dat[],unsigned char lenth)、
及中断处理函数serial()interrupt 4
3、调用语句:
serinit();
while(seritab[i++]!='\0')
lenth++;
serisend(seritab,lenth);
***************************************************/
追问
我现在添加了的补充问题,求助!谢谢!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
ChengYWT
2011-08-01
知道答主
回答量:6
采纳率:0%
帮助的人:1万
展开全部
你可以利用MAX485芯片与PC进行串口通信,通信协议你可以采取:1个起始位、1个数据字节位、然后是你想发送的数据位,1位和校验位,最后是1位末尾位。例如:55、5、1、1、1、1、1、10、aa.
追问
我现在添加了的补充问题,求助!谢谢!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
ypwunuaa
2011-07-31 · TA获得超过140个赞
知道答主
回答量:42
采纳率:0%
帮助的人:45.4万
展开全部
“要看PC和单片机之间的距离和你项目的成本问题”对头!
个人感觉232串口最简单。
更多追问追答
追问
距离不超过20米,成本尽量是小成本,而且难度也不要太高
追答
那是可以用的
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
绷带达人
2011-08-15
知道答主
回答量:31
采纳率:0%
帮助的人:16.7万
展开全部
485嘛,协议,可以自己设计一个就好啊,这种控制,传输也不复杂,要求也不高的,你只要约定一下控制字,数据,校验什么的,就可以了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 3条折叠回答
收起 更多回答(5)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式