查看: 1614|回复: 0
打印 上一主题 下一主题

发布一个用串口来控制煤矿风机的小程序

[复制链接]
跳转到指定楼层
沙发
发表于 2016-4-22 23:05:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
原先发布在这个博客
http://hi.baidu.com/%B5%FB%CF%FE ... b898c07a89476b.html
一个很简单的程序,主要实现:
用串口调试助手工具,发送“!a1”,只有LED灯P1.1亮,并返回“!a1ok”,并且发送“!b1”,p1.1灯灭,返回“!b1ok";以此类推,发送“!a2”,只有LED灯p1.2亮,并返回“!a2ok”,并且发送“!b2”,p1.2亮灭,返回“!b2ok")

// by蝶晓梦,串行通信演示
// 2010-7-10 2:06:26 调试通过
#include <REG52.H>
#include <math.h>//数学库

unsigned char power2(unsigned char x) // 计算2的x次幂
{
  return((unsigned char)exp(x * log(2)));
}

void main(void) {

  SCON = 0x50; // 模式 1, 8-bit UART, 使能接收
  TMOD |= 0x20; // timer 1, mode 2, 8-bit reload
  TH1 = 0xF3; // 2400 波特率 @ 12MHz
  TL1 = 0xF3; // 如果不用12MHz改用11.0592MHz删除这行,TH1    = 0xFD;
  TR1 = 1; // timer 1启动
  EA = 1; // 打开总中断
  ES = 1; // 打开串口中断

  while (1) // 主循环
  {
    P1 &= 0xFE; // P1.0低电平亮灯
  }
}

void UART_SER(void)interrupt 4 // 串行中断服务程序
{
  static unsigned char Cache[2], i = 0; // 定义缓存
  unsigned char Temp; // 定义临时变量

  if (RI) // 判断是接收中断产生
  {
    RI = 0; // 标志位清零
    Temp = SBUF; // 读入缓冲区的值
    if (Temp != '!') {
      Cache = Temp;
      i++;
      if (i > 1) {
        if ((Cache[0] == 'a') || (Cache[0] == 'b')) {
          if (Cache[0] == 'a')
            P1 &= 0xFF - power2(Cache[1] - '0');
          else
            P1 |= power2(Cache[1] - '0');

          SBUF = '!'; // 发回电脑端
          while (!TI); // 等待数据传完
          TI = 0; // 发送标志位清零
          SBUF = Cache[0]; // 发回电脑端
          while (!TI); // 等待数据传完
          TI = 0; // 发送标志位清零
          SBUF = Cache[1]; // 发回电脑端
          while (!TI); // 等待数据传完
          TI = 0; // 发送标志位清零
          SBUF = 'O'; // 发回电脑端
          while (!TI); // 等待数据传完
          TI = 0; // 发送标志位清零
          SBUF = 'K'; // 发回电脑端
          while (!TI); // 等待数据传完
          TI = 0; // 发送标志位清零
        }

        i = 0;

      }
    }
    else
      i = 0;
    if (i > 1)
      i = 0;

  }
  if (TI)
    TI = 0; // 发送标志位清零
}





好吧,全都写到一块了

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入中科因仑

本版积分规则

快速回复 返回顶部 返回列表