MAX232串口通信技术.docx
《MAX232串口通信技术.docx》由会员分享,可在线阅读,更多相关《MAX232串口通信技术.docx(37页珍藏版)》请在冰豆网上搜索。
MAX232串口通信技术
单片机实训(论文)说明书
题目:
基于232的串口通信技术
院(系):
专业:
学生姓名:
学号:
指导教师:
2010年12月26日
摘要
此设计项目是由AT89C51单片机为控制核心基于max232的串口通信技术.系统是由单片机系统、按键控制电路、串口通信模块、1602液晶显示模块模块组成。
它能实现对PC机与单片机的数字与字符串的发送与接收,1602能把要发送或接收的内容出来。
关键词:
单片机;1602液晶显示;字符串的发送和接收
Abstract
Tothedesignwaspickedbyat89c51monolithicintegratedcircuitstocontrolthecoremax232basedontheserialcommunicationtechnology.thesystemismonolithicintegratedcircuitssystems,keycontrolcircuit,serialcommunicationmodulesandlcdmodules,thatwascomposedofmodules.itcanachievethepcandmonolithicintegratedcircuitsfigureswithastringtosendandreceive,wastobesentorreceivedthe.contents.
Keywords:
monolithicintegratedcircuits;lcddisplay;wasastringtosendandreceive
引言
串口是计算机上一种非常通用设备通信的协议。
大多数计算机包含两个RS232的串口。
串口同时也是仪器仪表设备通用的通信协议;很多GPIB兼容的设备也带有RS-232口。
同时,串口通信协议也可以用于获取远程采集设备的数据。
串口通信的概念非常简单,串口按位(bit)发送和接收字节。
尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。
它很简单并且能够实现远距离通信。
比如IEEE488定义并行通行状态时,规定设备线总常不得超过20米,并且任意两个设备间的长度不得超过2米;而对于串口而言,长度可达1200米。
典型地,串口用于ASCII码字符的传输。
通信使用3根线完成:
(1)地线,
(2)发送,(3)接收。
由于串口通信是异步的,端口能够在一根线上发送数据同时在另一根线上接收数据。
其他线用于握手,但是不是必须的。
串口通信最重要的参数是波特率、数据位、停止位和奇偶校验。
对于两个进行通行的端口,这些参数必须匹配。
1串口收发数据概述:
1.1波特率
这是一个衡量通信速度的参数。
它表示每秒钟传送的bit的特表示每秒钟发送300个bit。
当我们提到时钟周期时,我们就是指波特率例如如果协议需要4800波特率,那么时钟是4800Hz。
这意味着串口通信在数据线上的采样率为4800Hz。
通常电话线的波特率为14400,28800和36600。
波特率可以远远大于这些值,但是波特率和距离成反比。
高波特率常常用于放置的很近的仪器间的通信,典型的例子就是GPIB设备的通信。
1.2数据位
准的值是5、7和8位。
如何设置取决于你想传送的信息。
比如,标准的ASCII码是0~127(7位)。
扩展的ASCII码是0~这是衡量通信中实际数据位的参数。
当计算机发送一个信息包,实际的数据不会是8位的,标255(8位)。
如果数据使用简单的文本(标准ASCII码),那么每个数据包使用7位数据。
每个包是指一个字节,包括开始/停止位,数据位和奇偶校验位。
由于实际数据位取决于通信协议的选取,术语“包”指任何通信的情况。
1.3停止位
用于表示单个包的最后一位。
典型的值为1,1.5和2位。
由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。
因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。
适用于停止位的位数越多,不同时钟同步的容忍程度越大,但是数据传输率同时也越慢。
1.4奇偶校验位
在串口通信中一种简单的检错方式。
有四种检错方式:
偶、奇、高和低。
当然没有校验位也是可以的。
对于偶和奇校验的情况,串口会设置校验位(数据位后面的一位),用一个值确保传输的数据有偶个或者奇个逻辑高位。
例如,如果数据是011,那么对于偶校验,校验位为0,保证逻辑高的位数是偶数个。
如果是奇校验,校验位位1,这样就有3个逻辑高位。
高位和低位不真正的检查数据,简单置位逻辑高或者逻辑低校验。
这样使得接收设备能够知道一个位的状态,有机会判断是否有噪声干扰了通信或者是否传输和接收数据是否不同步。
RS-232(ANSI/EIA-232标准)是IBM-PC及其兼容机上的串行连接标准。
可用于许多用途,比如连接鼠标、打印机或者Modem,同时也可以接工业仪器仪表。
用于驱动和连线的改进,实际应用中RS-232的传输长度或者速度常常超过标准的值。
RS-232只限于PC串口和设备间点对点的通信。
RS-232串口通信最远距离是50英尺。
2系统硬件概述
该作品由5大部分组成,分别是单片机系统、按键控制电路、LM298步进电机驱动电路模块、数码管显示速度模块与步进电机。
该系统是以单片机AT89S52为核心来完成的,在硬件电路中采用P0和P2口作为数码管的驱动接口。
单片机的八个输出端P1口同时又用来控制LM298驱动芯片。
2.1主控系统
主控模块采用的是AT89S52单片机,AT89S52是一个8位单片机,片内ROM全部采用FLASHROM技术,与MCS-51系列完全兼容,它能以3V的超低电压工作,晶振时钟最高可达24MHz。
AT89S52是标准的40引脚双列直插式集成电路芯片,有4个八位的并行双向I/O端口,分别记作P0、P1、P2、P3。
第31引脚需要接高电位使单片机选用内部程序存储器;第9引脚是复位引脚,要接一个上电手动复位电路;第40脚为电源端VCC,接+5V电源,第20引脚为接地端VSS,通常在VCC和VSS引脚之间接0.1μF高频滤波电容。
第18、19脚之间接上一个12MHz的晶振为单片机提供时钟信号。
2.2AT89S52单片机简介
·VCC:
电源电压·GND:
地此芯片是一种高性能低功耗的采用CMOS工艺制造的8位微控制器,它提供下列标准特征:
8K字节的程序存储器,256字节的RAM,32条I/O线,2个16位定时器/计数器,一个5中断源两个优先级的中断结构,一个双工的串行口,片上震荡器和时钟电路。
·P0口:
P0口是一组8位漏极开路型双向I/O口,作为输出口用时,每个引脚能驱动8个TTL逻辑门电路。
当对0端口写入1时,可以作为高阻抗输入端使用。
当P0口访问外部程序存储器或数据存储器时,它还可设定成地址数据总线复用的形式。
在这种模式下,P0口具有内部上拉电阻。
·P1口:
P1口是一带有内部上拉电阻的8位双向I/O口。
P1口的输出缓冲能接受或输出4个TTL逻辑门电路。
当对P1口写1时,它们被内部的上拉电阻拉升为高电平,此时可以作为输入端使用。
当作为输入端使用时,P1口因为内部存在上拉电阻,所以当外部被拉低时会输出一个低电流(IIL)。
·P2口:
P2是一带有内部上拉电阻的8位双向的I/O端口。
P2口的输出缓冲能驱
动4个TTL逻辑门电路。
当向P2口写1时,通过内部上拉电阻把端口拉到高电平,此时可以用作输入口。
作为输入口,因为内部存在上拉电阻,某个引脚被外部信号拉低时
会输出电流(IIL)。
P2口在访问外部程序存储器或16位地址的外部数据存储器(例如MOVX@DPTR)时,P2口送出高8位地址数据。
在这种情况下,P2口使用强大的内部上拉电阻功能当输出1时。
P3口:
P3是一带有内部上拉电阻的8位双向的I/O端口。
P3口的输出缓冲能驱动4个TTL逻辑门电路。
当向P3口写1时,通过内部上拉电阻把端口拉到高电平,此时可以用作输入口。
P3口同时具有多种特殊功能,具体如下表1所示:
端口引脚
第二功能
P3.0
RXD(串行输入口)
P3.1
TXD(串行输出口)
P3.2
(外部中断0)
P3.3
(外部中断1)
P3.4
T0(定时器0)
P3.5
T1(定时器1)
P3.6
(外部数据存储器写选通)
P3.7
(外部数据存储器都选通)
3各部分功能介绍
3.151单片机原理图
图1.0
这是51单片机的原理图,其中有4个8位的I/O口,分别是P0,P1,P2,P3。
还有外接晶振的引脚ATAL1,ATAL2,,复位管脚RST,地址锁存管脚AEL/PRNG,。
程序存储器允许输出管脚PSEN。
外部访问程序存储器管脚,EA/VPP。
P3.0,P3.1(RXD,TXD)是串口的输入,输出端。
图1.1
3.2单片机下载口的原理图
1,7,9脚接单片机的P15,P17,P16脚。
5脚接单片机的REST1脚。
2脚接+5伏电源,4,6,7,8脚接地。
下载口可以和下载线连接起到提供+5伏电压的作用,还可以为PC机把程序下载到单片机提供桥梁。
图1.2
3.3单片机外接晶振的电路图
X1,X2接的是单片机的XTAL1,XTAL2管脚,稳定的为单片机提供稳定的震荡周期。
图1.3
3.4这是单片的复位的原理图
这里电阻选用10k,电容选用10NF,单片机是高电平复位。
图1.4
3.5led灯原理图
正端接上拉电阻,负端接依次单片机的P2口,led灯是低电平点亮,高电平灭,
这里用led是为了测试单片机工作是否正常。
图1.5
3.6max232,与串口的连接图
TXD,RXD分别是单片机的串口的发送端与接收端,与232的T2IN,R2OUT相连.
这是max232的一些电气特性:
3.7max232的封装管脚图:
图1.6
图1.7
3.81602液晶显示模块
从左到右1到16的管脚依次是VSS电源地,VDD电源正,V00背光地,RS输入数据或指令,1数据,0指令。
R/W读、写操作选择1:
读;0:
写。
E,输入使能信号,1有效。
DB0~DB7,数据输入端,LEDA,LEDK分别是背光正,背光负,详细情况请看下表。
接口引脚功能
引脚号
符号
状态
功能
1
Vss
电源地
2
Vdd
+5V逻辑电源
3
V0
液晶驱动电源
4
RS
输入
寄存器选择1:
数据;0:
指令
5
R/W
输入
读、写操作选择1:
读;0:
写
6
E
输入
使能信号
7
DB0
三态
数据总线(LSB)
8
DB1
三态
数据总线
9
DB2
三态
数据总线
10
DB3
三态
数据总线
11
DB4
三态
数据总线
12
DB5
三态
数据总线
13
DB6
三态
数据总线
14
DB7
三态
数据总线(MSB)
15
LEDA
输入
背光+5V
16
LEDK
输入
背光地
4程序流程
4.1程序模块流程图
图1-8程序模块流程图
4.21602的显示函数部分
写命令函数→2写数据函数→3清屏函数→4显示字符函数→5显示字符串函数。
具体程序如下:
vWriteCMD(ucharcmd)//写入指令数据到LCD
{
delay(4);
rs=0;
rw=0;
ep=0;
_nop_();
_nop_();
P0=cmd;
_nop_();
_nop_();
ep=1;
delay(4);
ep=0;
}
voidvWriteData(uchardat)
{//写入字符显示数据到LCD
delay(4);
rs=1;
rw=0;
ep=0;
P0=dat;
_nop_();
_nop_();
ep=1;
delay(4);
ep=0;
}
lcd_init()
{
delay
(2);//LCD初始化设定
vWriteCMD(0x38);
delay
(2);
vWriteCMD(0x38);
delay
(2);
vWriteCMD(0x38);//设置两行5x7点阵
delay
(2);
vWriteCMD(0x06);//读写操作画面不动,ac减一
delay
(2);
vWriteCMD(0x08);//关闭显示
delay
(2);
vWriteCMD(0x01);//清除LCD的显示内容
delay
(2);
vWriteCMD(0x0c);//开显示开关
delay
(2);
}
voidvShowOneChar(unsignedcharucChar)//显示一个字符串
{
switch(ucChar)
{
case'':
vWriteData(0x20);break;
case'!
':
vWriteData(0x21);break;
case'"':
vWriteData(0x22);break;
case'#':
vWriteData(0x23);break;
case'$':
vWriteData(0x24);break;
case'%':
vWriteData(0x25);break;
case'&':
vWriteData(0x26);break;
case'>':
vWriteData(0x27);break;
case'(':
vWriteData(0x28);break;
case')':
vWriteData(0x29);break;
case'*':
vWriteData(0x20);break;
case'+':
vWriteData(0x2A);break;
case'-':
vWriteData(0x2D);break;
case'/':
vWriteData(0x2F);break;
case'=':
vWriteData(0x3D);break;
case'<':
vWriteData(0x3E);break;
case'?
':
vWriteData(0x3F);break;
case'.':
vWriteData(0x2E);break;
case':
':
vWriteData(0x3A);break;
case'0':
vWriteData(0x30);break;
case'1':
vWriteData(0x31);break;
case'2':
vWriteData(0x32);break;
case'3':
vWriteData(0x33);break;
case'4':
vWriteData(0x34);break;
case'5':
vWriteData(0x35);break;
case'6':
vWriteData(0x36);break;
case'7':
vWriteData(0x37);break;
case'8':
vWriteData(0x38);break;
case'9':
vWriteData(0x39);break;
case'A':
vWriteData(0x41);break;
case'B':
vWriteData(0x42);break;
case'C':
vWriteData(0x43);break;
case'D':
vWriteData(0x44);break;
case'E':
vWriteData(0x45);break;
case'F':
vWriteData(0x46);break;
case'G':
vWriteData(0x47);break;
case'H':
vWriteData(0x48);break;
case'I':
vWriteData(0x49);break;
case'J':
vWriteData(0x4A);break;
case'K':
vWriteData(0x4B);break;
case'L':
vWriteData(0x4C);break;
case'M':
vWriteData(0x4D);break;
case'N':
vWriteData(0x4E);break;
case'O':
vWriteData(0x4F);break;
case'P':
vWriteData(0x50);break;
case'Q':
vWriteData(0x51);break;
case'R':
vWriteData(0x52);break;
case'S':
vWriteData(0x53);break;
case'T':
vWriteData(0x54);break;
case'U':
vWriteData(0x55);break;
case'V':
vWriteData(0x56);break;
case'W':
vWriteData(0x57);break;
case'X':
vWriteData(0x58);break;
case'Y':
vWriteData(0x59);break;
case'Z':
vWriteData(0x5A);break;
case'a':
vWriteData(0x61);break;
case'b':
vWriteData(0x62);break;
case'c':
vWriteData(0x63);break;
case'd':
vWriteData(0x64);break;
case'e':
vWriteData(0x65);break;
case'f':
vWriteData(0x66);break;
case'g':
vWriteData(0x67);break;
case'h':
vWriteData(0x68);break;
case'i':
vWriteData(0x69);break;
case'j':
vWriteData(0x6A);break;
case'k':
vWriteData(0x6B);break;
case'l':
vWriteData(0x6C);break;
case'm':
vWriteData(0x6D);break;
case'n':
vWriteData(0x6E);break;
case'o':
vWriteData(0x6F);break;
case'p':
vWriteData(0x70);break;
case'q':
vWriteData(0x71);break;
case'r':
vWriteData(0x72);break;
case's':
vWriteData(0x73);break;
case't':
vWriteData(0x74);break;
case'u':
vWriteData(0x75);break;
case'v':
vWriteData(0x76);break;
case'w':
vWriteData(0x77);break;
case'x':
vWriteData(0x78);break;
case'y':
vWriteData(0x79);break;
case'z':
vWriteData(0x7A);break;
default:
break;
}
}
voidvShowChar1line(unsignedchar*num4)//显示一串字符
{
unsignedcharucCount1;
for(ucCount1=0;;ucCount1++)
{
vShowOneChar(num4[ucCount1]);
if(num4[ucCount1+1]=='\0')
break;
};
}
4.3串口收发数据部分:
首先是1发送函数→2发送单个个字符函数→3确定波特率输出函数→4输出数字的函数→5发送数字或字符串并显示函数→6接收数据函数→7接收数据并显示函数。
voidout_put(charnum1)//发送数据函数
{
SBUF=num1;
while(TI==0);//TI的值由硬件置1
TI=0;
}
voidput_char1(unsignedchar*m)//输出字符串
{
while(*m!
='\0')
{
out_put(*m);
m++;
}
}
voidclea()//设定波特率函数
{
RCLK=1;
TCLK=1;
SCON=0X50;//工作方式一
RCAP2H=0Xfe;//波特率1200
RCAP2L=0Xc8;
TH2=0Xfe;
TL2=0Xc8;
EA=1;
TR2=1;
}
voidsend_num(unsignedintnum2)//输出数字函数
{
unsignedchartemp;
unsignedchari=5;
while(num2>=10)
{
temp=num2%10;
buf[i]=temp+0x30;
i--;
num2=num2/10;
}
buf[i]=num2+0x30;
for(;i<=5;i++)
out_put(buf[i]);
out_put(0x0a);
}
voidsend_message()//发送数字和字符串函数
{
put_char1(str1);
send_num(2010);
put_char1(str2);
send_num(12);
put_char1(str3);
send_num(30);
out_put(0x0a);
vWriteCMD(0x83);
vShowChar1line(send1);
vWriteCMD(0xc3);
vShowChar1line(year1);
}
voidinput()//接收数据函数
{
vWriteCMD(0x80);
vShowChar1line(recieve1);
for(num3=0;;num3++)
{
while(RI==0);
data1[num3]=SBUF;
RI=0;