原先发布在这个博客 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; // 发送标志位清零 } 好吧,全都写到一块了 |
欢迎光临 中科因仑“3+1”工程特种兵精英论坛 (http://bbs.enlern.com/) | Powered by Discuz! X3.4 |