串行口通信实验 单片机实验报告

  • 格式:doc
  • 大小:106.00 KB
  • 文档页数:8

实验六 串行口通信实验

一、实验内容

实验板上有RS-232接口,将该接口与PC机的串口连接,可以实现单片机与PC机的串行通信,进行双向数据传输。本实验要求当PC机向实验板发送的数字在实验板上显示,按实验板键盘输入的数字在PC机上显示,并用串口助手工具软件进行调试。

二、实验目的

掌握单片机串行口工作原理,单片机串行口与PC机的通信工作原理及编程方法。

三、实验原理

51单片机有一个全双工的串行通讯口,所以单片机和电脑之间可以方便地进行串口通信。进行串行通讯信要满足一定的条件,比如电脑的串口是RS232电平(-5~-15V为1,+5~+15V为0),而单片机的串口是TTL电平(大于+2.4V为1,小于- 0.7V为0),两者之间必须有一个电平转换电路实现RS232电平与TTL电平的相互转换。

为了能够在PC机上看到单片机发出的数据,我们必须借助一个Windows软件进行观察,这里我们可以使用免费的串口调试程序SSCOM32或Windows的超级终端。

单片机串行接口有两个控制寄存器:SCON和PCON。串行口工作在方式0时,可通过外接移位寄存器实现串并行转换。在这种方式下,数据为8位,只能从RXD端输入输出,TXD端用于输出移位同步时钟信号,其波特率固定为振荡频率的1/12。由软件置位串行控制寄存器(SCON)的REN位后才能启动,串行接收,在CPU将数据写入SBUF寄存器后,立即启动发送。待8位数据输完后,硬件将SCON寄存器的T1位置1,必须由软件清零。

单片机与PC机通信时,其硬件接口技术主要是电平转换、控制接口设计和远近通信接口的不同处理技术。在DOS操作环境下,要实现单片机与微机的通信,只要直接对微机接口的通信芯片8250进行口地址操作即可。WINDOWS的环境下,由于系统硬件的无关性,不再允许用户直接操作串口地址。如果用户要进行串行通信,可以调用WINDOWS的API应用程序接口函数,但其使用较为复杂,可以使用KEILC的通信控件解决这一问题。

四、实验电路

[参考学习板说明书P27]

五、连线方法

用串口线把单片机通过MAX232电平转换芯片与PC机相连,芯片的R2out和T2in分别与单片机的RXDP3.0和TXDP3.1连接。

六、参考程序

程序一:

/***************************************************************

功能:首先LED显示串口接收的数据,然后将该数据发送给上位机

作者:txl

时间:2009-04

版本:V1.0

***************************************************************/

#include

#define uint unsigned int

#define uchar unsigned char

sbit wei1=P2^0;

sbit wei2=P2^1;

uchar code table[]={0xC0,0xF9,0xA4,0xB0,

0x99,0x92,0x82,0xF8,

0x80,0x90,0x88,0x83,

0xC6,0xA1,0x86,0x8E};//共阳数码管码表

uchar idata buffer[32];

uchar num,l_datatemp,l_data;

//函数声明

void init(void);

void send_char_com(unsigned char ch);

void delay(uint z);

main()

{

uchar l_data1,l_data2;

num=0;

// rxd_num=0;

l_datatemp=0;//用于存储新接收的数据

l_data=0; //用于存储显示的数据

init();

while(1)

{

if(l_data!=l_datatemp) //若接收的数据与原来显示的数据不一致,更新原来显示的数据

{

l_data=l_datatemp;

send_char_com(l_data);

}

l_data1=l_data&0xf0;//取高四位显示

l_data1=l_data1>>4;

wei1=0;

P0=table[l_data1];

delay(5);

wei1=1;

l_data2=l_data&0x0f; //取低四位显示

wei2=0;

P0=table[l_data2];

delay(5);

wei2=1;

}

}

/*-------------------------------------------------------

功能:串口初始化,波特率2400 方式1 8 UART

-------------------------------------------------------*/

void init(void) //串口初始化

{

TMOD = 0x20;

PCON = 0x00;

SCON = 0x50;

TH1 = 0xF3;

TL1 = 0xF3;

TR1=1; //启动定时器/计数器,还与GATE位状态有关

ES=1; //允许串行中断

EA=1; //总中断开

}

//查询方式向串口发送一个字符

void send_char_com(unsigned char ch)

{

SBUF=ch;

while(TI==0);

TI=0; }

/*

//向串口发送一个字符串,strlen为该字符串长度

void send_string_com(unsigned char *str,unsigned int strlen)

{

unsigned int k=0;

do

{

send_char_com(*(str + k));

k++;

} while(k < strlen);

}

*/

//中断方式从串口接收字符

void receive(void) interrupt 4 using 3

{

if(RI)

{

if(TI) //处理发送中断

{

TI=0;

}

RI=0;

l_datatemp=SBUF;

}

}

void delay(uint z)

{

uint x,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--); }

程序二、

#include

#define U8 unsigned char

#define key_port P1

code U8 tab[]={0xa0,0xbb,0x62,0x2a,0x39,0x2c,0x24,0xba,0x20,0x28,0xff};

U8 buf[4]={10,10,10,0};// 显示缓冲区,开机先显示" 0"

U8 cnt=0; // 扫描计数

U8 scn=0x7F; // 送P2口控制LED显示位,最左边LED先亮

U8 rc;

code U8

kcode[]={0xb7,0xbe,0xde,0xee,0xbd,0xdd,0xed,0xbb,0xdb,0xeb,0xd7,0xe7};

//反转码对应键值 0 1 2 3 4 5 6 7 8 9 A

B

void delay_ms(U8 ms)

{ U8 i,j;

for(i=0;i<100;i++)

{ for(j=0;j

}

U8 key(void)

{ U8 a,r;

delay_ms(20); // 延时20毫秒,消除按键抖动

if(key_port == 0xf0) goto rn;

a = key_port;

key_port = a | 0x0f;

delay_ms(20);

a = key_port;

for (r = 0;r <= 11;r++)

{ if(a == kcode[r]) break;};

if(r > 11) r = 0xff;// 0xff表示无效

rn: key_port = 0xf0;

return r;

}

void send(unsigned char c)// 发送一字节数据

{ SBUF = c;

while(TI == 0);// 等待发送完毕

TI = 0;

}

void main(void)

{ EA = 1; // 允许中断

TMOD = 0x21;// 定时器0方式1,定时器1方式2(作波特率发生器用)

ET0 = 1; // 允许定时器0中断

TH0 = 0xEE; // 晶振11.0592MHz,5mS

TL0 = 0;

PCON= 0; // 波特率不倍增

SCON= 0x50; // 串口工作方式1,REN=1(允许接收)

TH1 = 0xFD; // (11.0592MHz晶振,9600B/S)

TL1 = 0xFD;