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就介绍完了,您有什么想法可以联系小编。

  • UC3846控制芯片工作原理控制图 逆变焊机原理与用途
  • 数字万用表电阻档测试二极管正反向没有阻值(使用万用表测量二极管的正向电阻,为什么各档)
  • 学单片机需要学数电模电吗(学单片机要先学数电模电吗)
  • 电工怎么选择适合自己用的万用表(电工初学者买什么样的万用表好)
  • 单片机需要同时运行多个任务怎么办(单片机怎么同时执行多个任务)
  • 电机保护的方案取决于负载的机械特性
  • 绝缘电阻表正负搭接不复零位是怎么回事
  • 短路怎么用万用表查