zoukankan      html  css  js  c++  java
  • 51串口通信

    /*
    *单片机接收主机的数据,然后将数据传送到P2口,
    *当按下K1=P1.4 时, 单片机发送字符串 给主机 
    */ 
    #include <reg51.h>
    #include <intrins.h>
    
    unsigned char key_s, key_v, tmp;
    char code str1[] = "123 ";
    char code str2[] = "abc ";
    char code str3[] = "666 ";
    void send_str();
    bit scan_key();
    void proc_key();
    void delayms(unsigned char ms);
    void send_char(unsigned char txd);
    sbit K1 = P1^4;
    
    main()
    {
      SCON=0X50;  //设置为工作方式1
      TMOD=0X20;  //设置计数器工作方式2
      PCON=0X80;  //波特率加倍
      TH1=0XF3; //计数器初始值设置,注意波特率是4800的
      TL1=0XF3;
      TR1 = 1; //启动定时器1
      IE = 0x0; //禁止任何中断
      while(1)
      {
        if(scan_key()) // 扫描按键
        {
          delayms(10); // 延时去抖动
          if(scan_key()) // 再次扫描
          {
            key_v = key_s; // 保存键值
            proc_key(); // 键处理
          }
        }
        if(RI) // 是否有数据到来
        {
          RI = 0;
          tmp = SBUF; // 暂存接收到的数据
          P2 = tmp; // 数据传送到P0口
          send_char(tmp); // 回传接收到的数据
        } 
      }
    }
    
    bit scan_key()
    {
      key_s = 0x00;
      key_s |= K1;
      return(key_s ^ key_v);
    }
    
    void proc_key()
    {
      if((key_v & 0x01) == 0)
      { // K1按下
        send_str(); // 传送字串"welcome!...
      }
    }
    
    void send_char(unsigned char txd)
    {
      SBUF = txd;
      while(!TI); // 等特数据传送
      TI = 0; // 清除数据传送标志
    }
    
    void send_str()
    {
      unsigned char i = 0;
      while(str1[i] != '')
      {
        SBUF = str1[i];
        while(!TI); // 等特数据传送
        TI = 0; // 清除数据传送标志
        i++; // 下一个字符
      }
      i = 0;
      while(str2[i] != '')
      {
        SBUF = str2[i];
        while(!TI); // 等特数据传送
        TI = 0; // 清除数据传送标志
        i++; // 下一个字符
      }
      i = 0;
      while(str3[i] != '')
      {
        SBUF = str3[i];
        while(!TI); // 等特数据传送
        TI = 0; // 清除数据传送标志
        i++; // 下一个字符
      }
    }
    
    void delayms(unsigned char ms)
    { 
      unsigned char i;
      while(ms--)
      {
        for(i = 0; i < 120; i++);
      }
    }
  • 相关阅读:
    8.10
    今日头条笔试题 1~n的每个数,按字典序排完序后,第m个数是什么?
    Gym 100500B Conference Room(最小表示法,哈希)
    CodeForces 438D The Child and Sequence(线段树)
    UVALIVE 6905 Two Yachts(最小费用最大流)
    Gym Conference Room (最小表示法,哈希)
    hdu 2389 Rain on your Parade(二分图HK算法)
    Codeforces Fox And Dinner(最大流)
    zoj 3367 Counterfeit Money(dp)
    ZOJ3370. Radio Waves(2-sat)
  • 原文地址:https://www.cnblogs.com/wangxuehao/p/7073551.html
Copyright © 2011-2022 走看看