51单片机是对所有兼容Intel 8031指令系统的单片机的统称。该系列单片机的始祖是Intel的8004单片机,后来随着Flash rom技术的发展,8004单片机取得了长足的进展,成为应用最广泛的8位单片机之一,其代表型号是ATMEL公司的AT89系列,它广泛应用于工业测控系统之中。很多公司都有51系列的兼容机型推出,今后很长的一段时间内将占有大量市场。51单片机是基础入门的一个单片机,还是应用最广泛的一种。需要注意的是51系列的单片机一般不具备自编程能力。
同样的一段程序,在各个单片机厂家的硬件上运行的结果都是一样的,如ATMEL的89C51(已经停产)、89S51, PHILIPS,和WINBOND等,我们常说的已经停产的89C51指的是ATMEL公司的 AT89C51单片机,同时是在原基础上增强了许多特性,如时钟,更优秀的是由Flash(程序存储器的内容至少可以改写1000次)存储器取代了原来的ROM(一次性写入),AT89C51的性能相对于8051已经算是非常优越的了。
不过在市场化方面,89C51受到了PIC单片机阵营的挑战,89C51最致命的缺陷在于不支持ISP(在线更新程序)功能,必须加上ISP功能等新功能才能更好延续MCS-51的传奇。89S51就是在这样的背景下取代89C51的,89S51已经成为了实际应用市场上新的宠儿,作为市场占有率第一的Atmel公司已经停产AT89C51,将用AT89S51代替。89S51在工艺上进行了改进,89S51采用0.35新工艺,成本降低,而且将功能提升,增加了竞争力。89SXX可以向下兼容89CXX等51系列芯片。同时,Atmel不再接受89CXX的定单,大家在市场上见到的89C51实际都是Atmel前期生产的巨量库存而以。如果市场需要,Atmel当然也可以再恢复生产AT89C51。
uart通信协议UART(UniversalAsynchronousReceiver/Transmitter)即通用异步收发传输器,工作于数据链路层(协议层之一)。包含了RS-232、RS-422、RS-485串口通信和红外(IrDA)等等。UART协议作为一种低速通信协议,广泛应用于通信领域等各种场合。UART基本可分为并口通信及串口通信两种。
异步串口通信协议,工作原理是将传输数据的每个字符以串行方式一位接一位的传输。图1给出了其工作模式:
其中每一位(bit)的意义如下:
起始位:先发出一个逻辑“0”的信号,表示传输字符的开始。数据位:紧跟起始位之后。数据位的个数可以是4、5、6、7、8等,构成一个字符。通常采用ASCII码。从最低位开始传送,靠时钟来定位。
奇偶校验位:数据位加上这一位后(跟在数据位尾部),使得“1”的位数应为偶数(偶校验)或奇数(奇校验),以此来校验数据传送的正确性。
停止位:它是一个字符数据的结束标志。可以是1位、1.5位、2位的高电平(逻辑“1”)。
空闲位:处于逻辑“1”状态,表示当前线路上没有数据的传送。波特率:是衡量数据传输速率的指针。表示为每秒钟传送的二进制位数(bit数)。例如资料传送速率为120字符/秒,而每一个字符为10位,则其传送的波特率为10×120=1200字符/秒=1200波特。
软件UART控制:在嵌入式系统或者计算机中,并非直接对串口直接进行 *** 作,而是通过SCI(串行通讯接口)模块对其进行控制。(注:“SCI”首先由Motorola微串口微控制器而得名,SCI另一种说法是“UART控制器”)常用的许多芯片中都包含了SCI,例如ARM的S3C2410X芯片内嵌了3个串行接口控制器,而Nios等软核芯片则可以用选用UART(RS232)的IP对UART进行控制。PC机则常用16650UART、16750UART等控制串口。
如果实现软件 *** 作UART时,在UART检查端口管脚的串行活动时,需要占用大量时间,让应用程序停滞,这会使得软件UART没有意义。但情况并非如此,来看一下标准的10位异步串行协议(包含一个起始位,一个停止位和8个数据位)收发一个字符时的情况(如图2所示)。
数字系统方面,我们可以用一对状态机来表征软件UART的行为,一个状态机用于发送字符,另一个用于接收字符。对一个全双工的UART而言,这两个状态机是并行运行的,需要两个独立的定时器中断。这两个状态机都有主动和被动两种模式。发送状态机在收到一个需发送的字符时跳出空闲状态,在结束位发送之后回到空闲状态。接收状态机在检测到接收线上的一个下降沿时跳出空闲状态。在检测到这个初始的低电平状态之后(该状态指示起始位已经开始),开始对位时隙进行递减计数,同时按要求采样信号线上的每个信号位,包括停止位。
为了避免不必要地占用主应用过多的时间,
UART状态机应该由一些周期性的基于定时器的中断来激活。接收线上初始下降沿的检测需要利用一个边沿触发的外部中断单独处理。如果一个状态机的定时器被设置为每个bit周期发出一个中断请求,那么该状态机在每次中断被触发时能够执行任何需要的 *** 作(而且如果需要,还能进入到下一个状态)。用于实现状态机的代码应尽可能优化,因为只要软件UART处于活动状态,这些代码就会在后台连续运行。
51单片机uart通信协议*************************************************/
#define uchar unsigned char
#define uint unsigned int
bit RXAAOK; //接收到0XAA开头标志
bit RXFRMOK; //接收一帧完整数据标
//接收中断中如果是完整一条数据置位,主函数中
//处理完毕清零
uchar RXBUF[32]; //接收缓存
uchar RX_P; //数据个数
void UARTO_ISR() interrupt 4 //接收中断,不同处理器可能是不同的函数声明
{
uchar i; //用处提取接收缓冲器的字符
if(RI)
{ i=SBUF; //提取字符
RI=0;
if(RXFRMOK==0) //判断是否接收到起始字符0XAA
{ if(RXAAOK) //如果接收到0XAA,继续接收后面的字符
{ RXBUF[RX_P]=i; //字符存入数组
if((RX_P》3)&&(RXBUF[RX_P-3]==0xcc)
&&(RXBUF[RX_P-2]==0x33)&&(RXBUF[RX_P-1]==0xc3)
&&(RXBUF[RX_P]==0x3c) ) //判断是是否接收完毕一帧数据
{ RXFRMOK=1; //如果接收完成,置位RXFRMOK;
RXAAOK=0; //清零开始标志位RXAAOK
}
RX_P++; //接收计数器加一
}
if(!RXAAOK&&(i==0xaa))
{RXAAOK=1;
RX_P=0;
}
}
}
}
void main() //主程序
{
while(1)
{
if(RXFRMOK)
{
if(RXBUF[0]==0X78)
{//加入自己的处理函数即可
}
if(RXBUF[0]==0X7C)
{//加入自己的处理函数即可
}
RXBUFMOK=0; //处理完毕,清除消息
}
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)