实验目的:学会用单片机与计算机之间通过串口通讯。
实验模块:核心板;
实验内容:由串口调试助手以16进制向单片机发送一数据,如01,如果单片机接收到数据将会原样返回给计算机,并且显示在串口调试助手的接收框内。硬件电路图:在应用单片机的串口和 PC 进行串行通信时,需要进行两种不同的电平之间的转换,需要应用MAX232芯片将从0V和 5V的TTL电平转换到3V~15V或-3V~-15V的 RS-232C 电平。串口通信的数据传输过程如下:MAX232 的 10 脚 T2IN 接单片机 TXD 端 P3.1,TTL 电平从单片机的 TXD 端发出,经过 MAX232 转换为RS-232 电平后从 MAX232 的 14 脚 T1OUT 发出,再连接到串口座的第 2 脚 TXD,至此计算机端接收到数据。PC 机发送数据时从 PC 机串口座上的第 3 脚 RXD 端
实验代码:
/***************************************************************************************************
功能描述: 接收PC机发来的数据,并向PC机返回接收到的数据,PC机上使用串口调试助手,波特率1200bps,使用方式1.
硬件连接: 用2位杜邦线分别将J9_0与J5_R1及J9_1与J5_D1连接(下载完程序后),用串口线将PC和开发板上的串口1连接。
***************************************************************************************************/
#include "reg51.h" //包含头文件
硬件连接: 用2位杜邦线分别将J9_0与J5_R1及J9_1与J5_D1连接(下载完程序后),用串口线将PC和开发板上的串口1连接。
***************************************************************************************************/
#include "reg51.h" //包含头文件
#define uchar unsigned char
#define uint unsigned int
uchar ch; //用于存放串口接收到的数据
bit read_flag= 0 ; //取数标志位
#define uint unsigned int
uchar ch; //用于存放串口接收到的数据
bit read_flag= 0 ; //取数标志位
//**************************************************************************************************
//初始化串口
//**************************************************************************************************
void init_com( void )
//初始化串口
//**************************************************************************************************
void init_com( void )
{
SCON = 0x50; // 设定通信方式为方式1,允许接收,相当于REN = 1; SM1 = 1;
PCON = 0x00; //SMOD=0,该语句可去掉
IE |= 0x90 ; //打开串口中断, 相当于 EA = 1;ES = 1;
SCON = 0x50; // 设定通信方式为方式1,允许接收,相当于REN = 1; SM1 = 1;
PCON = 0x00; //SMOD=0,该语句可去掉
IE |= 0x90 ; //打开串口中断, 相当于 EA = 1;ES = 1;
//以下4句设置T1
TMOD = 0x20; // 定时器1工作于8位自动重载模式, 用于产生波特率
TH1=0xE6; //定时器0赋初值,TH1=(256 - (12000000 / (32 * 12 * 1200)))=230;
TL1=0xE6; //TL1=(256 - (12000000 / (32 * 12 * 1200)))=230;
TR1 = 1; //启动T1
}
//**************************************************************************************************
//串口中断函数
//**************************************************************************************************
void serial () interrupt 4 using 3
TMOD = 0x20; // 定时器1工作于8位自动重载模式, 用于产生波特率
TH1=0xE6; //定时器0赋初值,TH1=(256 - (12000000 / (32 * 12 * 1200)))=230;
TL1=0xE6; //TL1=(256 - (12000000 / (32 * 12 * 1200)))=230;
TR1 = 1; //启动T1
}
//**************************************************************************************************
//串口中断函数
//**************************************************************************************************
void serial () interrupt 4 using 3
{
if (RI)
if (RI)
{
RI = 0 ; //此步必不可少,因为硬件不能将其置0
ch=SBUF; //从SBUF中取出数据
read_flag= 1 ; //就置位取数标志
}
RI = 0 ; //此步必不可少,因为硬件不能将其置0
ch=SBUF; //从SBUF中取出数据
read_flag= 1 ; //就置位取数标志
}
}
//**************************************************************************************************
//串口发送函数
//**************************************************************************************************
void send_char( unsigned char ch1)
//**************************************************************************************************
//串口发送函数
//**************************************************************************************************
void send_char( unsigned char ch1)
{
SBUF=ch1; //将待发数据放到SBUF
while (TI== 0); //等待TI=1(表示帧发送结束)发送
TI= 0 ; //此步必不可少,因为硬件不能将其置0
SBUF=ch1; //将待发数据放到SBUF
while (TI== 0); //等待TI=1(表示帧发送结束)发送
TI= 0 ; //此步必不可少,因为硬件不能将其置0
}
//**************************************************************************************************
//主函数
//**************************************************************************************************
void main(void)
{
init_com( ) ;
while(1)
{
/*
查询方式实现通信,当系统较小时采取。
使用该方式必须将下面的中断方式屏蔽,
IE = 0x00 ; //关闭所有中断,以防止中断影响
while(RI == 0);
RI = 0;
ch = SBUF; // 从缓冲区中把接收的字符放入c中
SBUF = ch; // 要发送的字符放入缓冲区
while(TI == 0);
TI = 0;
*/
//**************************************************************************************************
//主函数
//**************************************************************************************************
void main(void)
{
init_com( ) ;
while(1)
{
/*
查询方式实现通信,当系统较小时采取。
使用该方式必须将下面的中断方式屏蔽,
IE = 0x00 ; //关闭所有中断,以防止中断影响
while(RI == 0);
RI = 0;
ch = SBUF; // 从缓冲区中把接收的字符放入c中
SBUF = ch; // 要发送的字符放入缓冲区
while(TI == 0);
TI = 0;
*/
//中断方式实现通信 当系统较大时采取
if (read_flag) //如果取数标志已置位,就将读到的数从串口发出
if (read_flag) //如果取数标志已置位,就将读到的数从串口发出
{
read_flag= 0 ; //取数标志清0
send_char(ch); //将读到的数从串口发出
}
}
read_flag= 0 ; //取数标志清0
send_char(ch); //将读到的数从串口发出
}
}
}
来源:oschina
链接:https://my.oschina.net/u/4329429/blog/3274871