51单片机串口中断实验

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);
    }
}
复制代码

  

 


 

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

复制代码
#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);
    }
}
复制代码

 


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

复制代码
#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);
    }
}
复制代码

 

 


 

实验相关寄存器


 

posted @   叫我+V  阅读(1715)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
点击右上角即可分享
微信分享提示