E2Write(str, 0x20, sizeof(str)); //保存字符串 1,起始地址为 0x20
break;
case 1:
buf[len] = ‘’; //为接收到的字符串添加结束符
TrimString16(str, buf+cmdLen[1]); //整理成 16 字节固定长度字符串
LcdShowStr(0, 1, str); //显示字符串 1
E2Write(str, 0x40, sizeof(str)); //保存字符串 2,起始地址为 0x40
break;
default: //未找到相符命令时,给上机发送“错误命令”的提示
UartWrite(“bad command.rn”, sizeof(“bad command.rn”)-1);
return;
}
buf[len++] = ‘r’; //有效命令被执行后,在原命令帧之后添加
buf[len++] = ‘n’; //回车换行符后返回给上位机,表示已执行
UartWrite(buf, len);
}
/* 配置并启动 T0,ms-T0 定时时间 */
void ConfigTimer0(unsigned int ms){
unsigned long tmp; //临时变量
tmp = 11059200 / 12; //定时器计数频率
tmp = (tmp * ms) / 1000; //计算所需的计数值
tmp = 65536 - tmp; //计算定时器重载值
tmp = tmp + 33; //补偿中断响应延时造成的误差
T0RH = (unsigned char)(tmp》》8); //定时器重载值拆分为高低字节
T0RL = (unsigned char)tmp;
TMOD &= 0xF0; //清零 T0 的控制位
TMOD |= 0x01; //配置 T0 为模式 1
TH0 = T0RH; //加载 T0 重载值
TL0 = T0RL;
ET0 = 1; //使能 T0 中断
TR0 = 1; //启动 T0
}
/* T0 中断服务函数,执行串口接收监控和蜂鸣器驱动 */
void InterruptTimer0() interrupt 1{
TH0 = T0RH; //重新加载重载值
TL0 = T0RL;
UartRxMonitor(1); //串口接收监控
}
我们在学习 UART 通信的时候,刚开始也是用的IO口去模拟UART通信过程,最终实现和电脑的通信,而后因为 STC89C52 内部具备 UART 硬件通信模块,所以我们直接可以通过配置寄存器就可以很轻松的实现单片机的 UART 通信。同样的道理,这个 I2C 通信,如果单片机内部有硬件模块的话,单片机可以直接自动实现 I2C 通信了,就不需要我们再进行 IO口模拟起始、模拟发送、模拟结束,配置好寄存器,单片机就会把这些工作全部做了。
不过我们的STC89C52单片机内部不具备I2C的硬件模块,所以我们使用STC89C52进行I2C通信的话必须用IO口来模拟。使用IO口模拟I2C实际上更有利于我们彻底理解透彻I2C通信的实质。当然了,通过学习IO口模拟通信,今后如果遇到内部带 I2C 模块的单片机,也应该很轻松的搞定,使用内部的硬件模块,可以提高程序的执行效率。
来源;21ic
关于控制,MCU就介绍完了,您有什么想法可以联系小编。