zoukankan      html  css  js  c++  java
  • 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);
        }
    }

     


    实验相关寄存器


  • 相关阅读:
    idea添加类注释和方法注释
    蓝桥杯ALGO-1,区间k大数查询
    personalblog
    ul+li水平居中的几种方法
    前端ps部分
    帝国cms-tab
    帝国cms判断某一字段是否为空
    帝国cms建站总结-(分页)
    Js获取验证码倒计时
    前端截取字符串:JS截取字符串之substring、substr和slice详解
  • 原文地址:https://www.cnblogs.com/wjw1014/p/10115052.html
Copyright © 2011-2022 走看看