zoukankan      html  css  js  c++  java
  • 51单片机和PC串口异步通信(续)

    上一篇文章主要罗列了一些编写串口通信必要的知识点。在具体的编程中,还有很多要注意的地方。

    下面的程序的主要功能为:通过串口调试助手向51单片机发送一个字母,单片机接收后,在数码管上显示这个字母,并将这个字母反向显示到串口调试助手的界面里。

    51单片机的头文件中已经定义了串口缓冲区等一系列特殊功能寄存器,打开头文件就可以找到下面这样的定义:

    sfr SCON  = 0x98;
    sfr SBUF  = 0x99;

    等等。

    首先新建立一个头文件,将程序中要用到的变量和函数声明写进去:

    #include <reg52.h>
    #include <ctype.h>
    
    #define uchar   unsigned char
    
    sbit dula=P2^6;
    sbit wela=P2^7;
    
    //从计算机发送给单片机的字母
    uchar letter;
    
    //table数组中存储数码管显示0~F对应的编码
    //这里只用A~F即可
    uchar code   table[]={
    0x3f,0x06,0x5b,0x4f,
    0x66,0x6d,0x7d,0x07,
    0x7f,0x6f,0x77,0x7c,
    0x39,0x5e,0x79,0x71};
    
    void Inital();
    void Display(uchar mydata);
    void Putchar(uchar mydata);
    void ShortDelay();
    


    包含头文件<ctype.h>的主要目的为利用库函数toupper(),可以讲读入的字母均转换成大写,便于调用Display函数在数码管上显示。

    主函数很简单,首先初始化,然后便进入永远为真的循环中,等待中断的发生,并处理。

    void main()
    {
      Inital();  //初始化
      while(1)  
      {
      }
    }


    初始化函数用于开启中断,设置计时器,串口通信的工作方式,变量初始化的工作:

    void Inital()
    {
      //变量清零
      letter=0;
      wela=0;
      dula=0;
     
      //波特率设置为9600
      SCON=0x50;
      TMOD=0x20;
      TH1=0xfd;
      TL1=0xfd;
      TR1=1;
     
      //开串口中断
      EA=1;
      ES=1;
    }


    中断服务函数在中断发生时由CPU调用,在其内部又调用了 Display,Putchar函数用于在数码管显示字母,和在电脑上回显输入的字母。

    //中断服务函数
    void ser() interrupt 4
    {
      //如果读完数据
      if(RI==1)
      {
        RI=0;   //软件清零
        letter=SBUF;   //从单片机Receive缓冲区内读入数据
        Putchar(letter);   //在电脑上回显letter
        Display(letter);    //在数码管上显示对应的字母
      }
    }

    Display函数用到的只是在前面有关数码管的文章中已有涉及,直接贴出代码:

     

    void Display(uchar mydata)  
    {
      uchar BigLetter;  
      BigLetter=toupper(mydata);    //先将读入字母均转换为大写,以便统一处理
      
      //位选数码管
      wela=1;
      P0=0xfb;
      wela=0;
      
      P0=0xff;
      
      //段选
      //BigLetter-'A'+10索引为该字母在table中的下标
      dula=1;
      P0=table[BigLetter-'A'+10];
      dula=0;
      ShortDelay();
    }
     
    void ShortDelay()
    {
      uchar a=100;
      while(a--);
    }


    向计算机发送信息的Putchar函数

    void Putchar(uchar mydata)
    {
      SBUF=mydata;        //单片机的Transfer缓冲区内写入数据
      while(!TI)   ;      //发送是否结束
      TI=0;               //发送结束后软件清零
    }


    如此这样,利用串口调试助手就可以向单片机发送字母,在数码管显示此字母,并能够在软件界面上显示刚刚发送出去的字母内容了。

    
    



     

  • 相关阅读:
    leetcode Move Zeroes
    leetcode Same Tree
    leetcode range sum query
    leetcode Invert Binary Tree
    leetcode【sql】 Delete Duplicate Emails
    mac编译PHP报错 configure: error: Please reinstall the libcurl distribution
    Linux添加系统环境变量的两种方法
    Mysql获取去重后的总数
    MySQL查询order by相减select相减的Sql语句
    修改maven本地仓库路径
  • 原文地址:https://www.cnblogs.com/xmfbit/p/2985794.html
Copyright © 2011-2022 走看看