51单片机串口中断实验


 串口向外部发送“齐鲁工业大学”六个字,一个汉字占用两个字节,六个字占用12个字节。

#include <reg51.h>

unsigned char s[] = "齐鲁工业大学";


// 延时函数
void Delay10ms(unsigned int c)
{
unsigned char a, b;

//--c已经在传递过来的时候已经赋值了,所以在for语句第一句就不用赋值了--//
for (;c>0;c--)
{
for (b=38;b>0;b--)
{
for (a=130;a>0;a--);
}
}
}


// 初始化串口中断
void UsartInit()
{
EA=0; //总中断关闭
SCON = 0x50; // 控制寄存器
PCON = 0x80; // 记住就行,0x80
TMOD = 0x20; // TMOD设置定时计数器的工作方式和功能 ,采用定时器1,工作方式2
TH1 = 0xF3; // 设置高八位
TL1 = 0xF3; // 设置低八位
TR1=1; // 使定时器1开始工作
ES=1; // 开启串口中断
EA=1; // 开启总中断权限
}

// 主函数
void main()
{
// 初始化
UsartInit();
while(1)
{ unsigned int i;
// 发送数组数据
for(i=0;i<12;i++)
{
// 将SBUF中的数据发送出去
SBUF = s[i];
// 如果发送完成,TI自动置1
while(!TI);
// 发送完成,软件置0
TI=0;
}
//延时
Delay10ms(10);
}
}

  51单片机串口中断实验_串口

 


 

 优化之前代码,封装发送方法。

#include <reg51.h>
#include <stdio.h>

unsigned char s[] = "齐鲁工业大学";


// 延时函数
void Delay10ms(unsigned int c)
{
unsigned char a, b;

//--c已经在传递过来的时候已经赋值了,所以在for语句第一句就不用赋值了--//
for (;c>0;c--)
{
for (b=38;b>0;b--)
{
for (a=130;a>0;a--);
}
}
}


// 初始化串口中断
void UartInit()
{
EA=0; //总中断关闭
SCON = 0x50; // 控制寄存器
PCON = 0x80; // 记住就行,0x80
TMOD = 0x20; // TMOD设置定时计数器的工作方式和功能 ,采用定时器1,工作方式2
TH1 = 0xF3; // 设置高八位
TL1 = 0xF3; // 设置低八位
TR1=1; // 使定时器1开始工作
ES=1; // 开启串口中断
EA=1; // 开启总中断权限
}

// 封装发送方法
void UartSend(char *Data,char len)
{
unsigned int i;
// 发送数组数据
for(i=0;i<len;i++)
{
// 将SBUF中的数据发送出去
SBUF = *Data++;
// 如果发送完成,TI自动置1
while(!TI);
// 发送完成,软件置0
TI=0;
}
//延时
Delay10ms(10);
}

// 主函数
void main()
{
// 初始化
UartInit();
while(1)
{
// 调用封装的发送函数
UartSend(s,12);
}
}

51单片机串口中断实验_赋值_02

 


 串口接收消息,然后将消息从串口发送出去

#include <reg51.h>
#include <stdio.h>

unsigned char s[] = "齐鲁工业大学";


// 延时函数
void Delay10ms(unsigned int c)
{
unsigned char a, b;

//--c已经在传递过来的时候已经赋值了,所以在for语句第一句就不用赋值了--//
for (;c>0;c--)
{
for (b=38;b>0;b--)
{
for (a=130;a>0;a--);
}
}
}


// 初始化串口中断
void UartInit()
{
EA=0; //总中断关闭
SCON = 0x50; // 控制寄存器
PCON = 0x80; // 记住就行,0x80
TMOD = 0x20; // TMOD设置定时计数器的工作方式和功能 ,采用定时器1,工作方式2
TH1 = 0xF3; // 设置高八位
TL1 = 0xF3; // 设置低八位
TR1=1; // 使定时器1开始工作
ES=1; // 开启串口中断
EA=1; // 开启总中断权限
}

// 封装发送方法
void UartSend(char *Data,char len)
{
unsigned int i;
// 发送数组数据
for(i=0;i<len;i++)
{
// 将SBUF中的数据发送出去
SBUF = *Data++;
// 如果发送完成,TI自动置1
while(!TI);
// 发送完成,软件置0
TI=0;
}
//延时
Delay10ms(10);
}


// 接收,串口中断
void Uart() interrupt 4
{
unsigned char rev;
rev = SBUF;
RI=0; // 接收中断标志位置0;
SBUF = rev;
while(!TI);
TI = 0; // 发送中断标志位置0;
}

// 主函数
void main()
{
// 初始化
UartInit();
while(1)
{
// 调用封装的发送函数
// UartSend(s,12);
}
}

 51单片机串口中断实验_串口_03

 


 

实验相关寄存器

51单片机串口中断实验_初始化_04

51单片机串口中断实验_赋值_05

51单片机串口中断实验_串口_06


 

【版权声明】本博文著作权归作者所有,任何形式的转载都请联系作者获取授权并注明出处!

【重要说明】本文为本人的学习记录,论点和观点仅代表个人而不代表当时技术的真理,目的是自我学习和有幸成为可以向他人分享的经验,因此有错误会虚心接受改正,但不代表此刻博文无误!

【Gitee地址】秦浩铖:​​https://gitee.com/wjw1014​