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++);
      }
    }
  • 相关阅读:
    纹理贴图的模式设置
    vs debug或者release文件夹下的 .exe文件
    subpixel的概念
    点乘
    设置开机时自动开启和关闭的软件
    CF553E Kyoya and Train
    CF960G Bandit Blues
    玩游戏
    「SWTR03」Counting Trees
    CF623E Transforming Sequence
  • 原文地址:https://www.cnblogs.com/wangxuehao/p/7073551.html
Copyright © 2011-2022 走看看