原先发布在这个博客
http://hi.baidu.com/%B5%FB%CF%FE%C3%CE/blog/item/7f956f07feb898c07a89476b.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; // 发送标志位清零
}
好吧,全都写到一块了
如果用在主风机上,我只想说,如果风机停转超过半小时,那么就会被定性为重大事故,这个矿估计至少是要停产整顿了。
没有其他意思,只是建议楼主多看看实际,我也曾经如此天真。
另,发送数据时最好关串口中断。
一周热门 更多>