① 单片机与pc机之间进行通信用同步方式和用异步方式有什么区别
异步通信(UART)指两个互不同步的设备通过计时机制或其他技术进行数据传输。异步通信中两个字符之间的时间间隔是不固定的,而在一个字符内各位的时间间隔是固定的。基本上,发送方可以随时传输数据,而接收方必须在信息到达时准备好接收。相反,同步传输是一个精确同步的位流,其中字符的起始是由计时机制来定位的。
异步通信中,数据通常以字符或者字节为单位组成字符帧传送。字符帧由发送端逐帧发送,通过传输线被接收设备逐帧接收。发送端和接收端可以由各自的时钟来控制数据的发送和接收,这两个时钟源彼此独立,互不同步。
通信协议(通信规程):使用异步串口传送一个字符的信息时,对资料格式有如下约定:规定有空闲位、起始位、资料位、奇偶校验位、停止位。
同步通信(SPI)是一种比特同步通信技术,要求发收双方具有同频同相的同步时钟信号,只需在传送报文的最前面附加特定的同步字符,使发收双方建立同步,此后便在同步时钟的控制下逐位发送/接收。
没有数据发送时,传输线处于MARK状态。为了表示数据传输的开始,发送方先发送一个或两个特殊字符,该字符称为同步字符。当发送方和接收方达到同步后,就可以一个字符接一个字符地发送一大块数据,而不再需要用起始位和停止位了,这样可以明显地提高数据的传输速率。
采用同步方式传送数据时,在发送过程中,收发双方还必须用一个时钟进行协调,用于确定串行传输中每一位的位置。接收数据时,接收方可利用同步字符使内部时钟与发送方保持同步,然后将同步字符后面的数据逐位移入,并转换成并行格式,供CPU读取,直至收到结束符为止。
采用同步通信时,将许多字符组成一个信息组,每组信息(通常称为帧)的开始要加上同步字符,在没有信息要传输时,要填上空字符,因为同步传输不允许有间隙。收发双方不停地发送和接收连续的同步比特流。
不知道你理解了没有,欢迎追问~
同步通信是把所传送的数据以多个字节(100字节以上)为单位,在其前后添加标志。|同步字符|信息组|错误校验| 同步字符一般为1~2个,错误校验一般为CRC冗余校验。
② 关于51单片机串口异步通信的问题
发送时是自己主动的,当然可以不用中断方式,使用查询法。
接收时自己是被动的,你不知道什么时候会发来数据,所以采用中断方式,没有中断的时候运行其他的程序段。
查询法是不断地查询是否有数据接受到或数据是否发送完成。
中断法是指当接收到数据或发送数据后进入中断子程序,子程序完成后再返回执行原来被中断的程序。
③ 两个单片机之间的简单异步串行通信
因为你是用查询方式进行通信的,而程序没有中没有设置两机通信的联络信号,即接受机接收到的第一位数据不一定是发送机发送的第一位数据,而有可能是第二、第三位数据,这样接受到的八位数据就可能是发送机发送多次数据中截取的八位数据,又因两机延时时间不同,因此接受到的第一位数据不可能固定不变的。
所以就会出现你说的现象。如果采用的是查询方式进行串行通信,两机之间需要建立握手信号,告知接受机发送机开始发送地位数据,接受机才开始接受数据。
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
void uart_init()
{
TMOD=0x20;
TH1=0xFD;
TL1=0xFD;
PCON=0x00;
TR1=1;
SCON=0x50;
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=125;y>0;y--);
}
void main()
{
uart_init();
do
{
SBUF=0x01;
while(TI==0);
TI=0;
while(RI==0);
REN=0;
}
while(SBUF!=0x02) ;
while(1)
{
SBUF=0x07;
while(TI==0);
TI=0;
delay(500) ;
SBUF=0x00;
while(TI==0);
TI=0;
delay(500) ;
}
}
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
void uart_init()
{
TMOD=0x20;
TH1=0xFD;
TL1=0xFD;
PCON=0x00;
TR1=1;
SM0=0; //串口方式1
SM1=1;
REN=1;
}
void main()
{
uart_init();
do
{
SBUF=0x02;
while(TI==0);
TI=0;
while(RI==0);
RI=0;
P2=SBUF;
}
while(P2!=0x01);
while(1)
{
while(RI==0);
P1=SBUF;
RI=0;
}
}
④ mcs-51单片机的串行通信中异步通讯方式和同步通讯方式的异步和同步怎样理解
同步串行通信进行数据传输时,发送和接收双方要保持完全的同步,也就是双方的速率要相等,因此要使用同一时钟
异步通信中,在每一帧的数据前后放上了控制字符,双方的时钟可以彼此独立
⑤ 怎么用单片机操作三相异步电动机
1.知道怎么改变单片机输出引脚的高低电平吗?
2.知道怎么控制三相异步电动机吗?
3.单片机是+5V(或更低)输出电平,电动机是220AC电压,不能直接控制,需要加中间继电器做电平转换。
4.控制电动机有几个接触器,就需要有多少个单片机输出IO口。
5.每一路都需要加中间继电器。
挺简单的嘛。
⑥ 单片机同步串行数据与异步串行数据的区别
一般来说异步串行每个信息单元之间有控制信号,发送和接收端分别用近似的时钟工作,标准设备就是串口。同步串行一般会有一个时钟信号,收发端均以该时钟信号为收发时钟,该信号一般由发送端产生,每个信息单元之间不再有起始,终于控制。
iic也算是同步串行设备。
⑦ 单片机异步通讯怎样实现啊1+8+1+1开始位加数据位加验证加结束!1代表的是8位还是1位啊
异步通信就是USART通讯,用串口实现;
1+8+1+1的意思是1位开始位,8位数据位,1位校验位,1位停止位;
1代表的1位;
标准的异步串口通讯会自己判断,一边低电平为开始位,高电平为结束位;
⑧ 什么单片机异步非归零
所有任务可以分成两种,一种是同步任务(synchronous),另一种是异步任务(asynchronous)。
同步任务指的是,在主线程上排队执行的任务,只有前一个任务执行完毕,才能执行后一个任务;
异步任务指的是,不进入主线程、而进入"任务队列"(task queue)的任务,只有等主线程任务执行完毕,"任务队列"开始通知主线程,请求执行任务,该任务才会进入主线程执行。
具体来说,异步运行机制如下:
(1)所有同步任务都在主线程上执行,形成一个执行栈(execution context stack)。
(2)主线程之外,还存在一个"任务队列"(task queue)。只要异步任务有了运行结果,就在"任务队列"之中放置一个事件。
(3)一旦"执行栈"中的所有同步任务执行完毕,系统就会读取"任务队列",看看里面有哪些事件。那些对应的异步任务,于是结束等待状态,进入执行栈,开始执行。
(4)主线程不断重复上面的第三步。
⑨ 51单片机异步串行通信的帧结构由哪些部分组成。
中央处理器、程序存储器、数据存储器。
51子系列单片机由CPU、数据存储器RAM、程序存储器ROM、特殊功能寄存器、4个I/O口、串行口、定时器/计数器、中断系统等八个功能部件组成。
⑩ 单片机多机串行异步通信
//===================================================================== // 多机通讯从机1程序 //cong1.c //writer:谷雨 2008年3月22日于EDA实验室 //注: //===================================================================== #include<reg52.h> #define addr 0x31 //从机1地址 unsigned char receive; unsigned char xx[ ]={"1234567890"}; void Uart_Init(void) { TMOD = 0x20; //定时器T1使用工作方式2 TH1 = 0XF3; TL1 = 0XF3; PCON = 0x00; //SMOD=1; SCON = 0xf0; //工作方式3,9位数据位,波特率9600bit/s,允许接收 TR1 = 1; //开始计时 EA = 1; //中断允许 ES = 1; //串行中断允许 } void Serial_INT() interrupt 4 { if(!RI) return; RI=0; if(RB8==1) { if(SBUF==addr) SM2=0; else SM2=1; } if(RB8==0) receive=SBUF; } void SendOneByte(unsigned char c) { TB8=0; SBUF = c; while(!TI); TI = 0; } void SendListChar(unsigned char *DData,unsigned char Ef) { unsigned char L=0; if(Ef!=0) { for( ;L<Ef;L++) //显示有效长度 SendOneByte(DData[L]); //发送单个字符 }else while (DData[L]!='\0') //发送至字串结束 { SendOneByte(DData[L]); //发送单个字符 L++; //下一个字符 } } void main() { Uart_Init(); while(1) { switch(receive) { case 0xff: break; case 0x01: //在此可以写入要完成的动作,最多可完成256个动作 SendListChar(xx,0); break; case 0x02: break; case 0x33: P1=!P1; //为方便其间,赋值给P1口,测P1口电平来检测该程序 break; default: break; } receive=0xff; } } //===================================================================== // 多机通讯主机程序 //zhuji.c //writer:谷雨 2008年3月22日于EDA实验室 //注:主机先发送地址,接收到应答后,再发送数据 //===================================================================== #include<reg52.h> #define addr1 0x31 //从机1地址 #define addr2 0x32 //从机2地址 unsigned char xx[10]; unsigned char p = 0; void delay_1ms(unsigned int i) { unsigned char j; while ((i--)!=0) {for (j=0;j<125;j++);} } void Uart_Init(void) { TMOD = 0x20; //定时器T1使用工作方式2 TH1 = 0XF3; TL1 = 0XF3; PCON = 0x00; //SMOD=1; SCON = 0xf0; //工作方式3,9位数据位,波特率9600bit/s,允许接收 SM2 = 0; TR1 = 1; //开始计时 EA = 1; //中断允许 ES = 1; //串行中断允许 } void Serial_INT() interrupt 4 { if(!RI) return; ES = 0; RI = 0; xx[p] = SBUF; p++; ES = 1; } void send_addr(unsigned char addr) //发送地址 { p = 0; TB8 = 1; //发送地址帧 SBUF=addr; //发送地址 while(!TI); //等待发送完毕 TI=0; //软件复位TI } void send_data(unsigned char ddata) //发送数据 { TB8=0; //发送数据帧 SBUF=ddata; //发送数据 while(!TI); TI=0; //软件复位TI } void main() { Uart_Init(); delay_1ms(2000); while(1) { send_addr(addr1); //向从机1发地址 send_data(0x33); send_data(0x01); delay_1ms(500); if(xx[9]=='0') P1=0xaa; delay_1ms(500); send_addr(addr2); //向从机2发地址 send_data(0x33); send_data(0x01); delay_1ms(500); if(xx[9]=='9') P1=0x55; delay_1ms(500); } // while(1); }