暴力讲解STC定时器和串口TH、TL值计算

  • STC定时器TH、TL值,基于16位自动重装、12T模式!
TH0 = (65536 - FOSC/x_us/12) / 256;
TL0 = (65536 - FOSC/x_us/12) % 256;

12T模式下, FOSC/12,每分钟的计数次数,

FOSC/12/x_us,x_us时间内的计数次数(FOSC/12/1000,1ms的计数次数),

那么就得到了1ms需要计数n次,2^16-n,

定时了1ms!

=========================================================================

=========================================================================

  • STC串口TH、TL值,基于8位自动重装、12T模式!
	TH1 = ((256 - (FOSC / 32/ 12) / BaudRate));
	TL1 = ((256 - (FOSC / 32/ 12) / BaudRate));

12T模式下, FOSC/12,每分钟的计数次数,

FOSC/12/32,SMOD=0波特率不加倍,物理意义:每分钟计数(FOSC/12/16,SMOD=1波特率倍速)

BaudRate为每分钟需要发送的码元数,

(FOSC/12/32)/BaudRate,规定波特率下,每个码元需要的计数次数,

2^8-(FOSC/12/32)/BaudRate,得到了初值。


为什么串口通讯的晶振频率要为11.0592MHz,才没有误差,因为波特率9600的制约!!

好的,我可以为您提供一些关于STC89C52RC定时器1和串口通信的基本信息。 STC89C52RC是一款基于8051内核的单片机芯片,它具有多种外设,包括定时器串口通信模块。其中,定时器1是一个16位定时器,可以用于计时和产生中断。串口通信模块可以用于与其他设备进行通信。 要实现STC89C52RC的定时器1串口通信,您需要进行以下步骤: 1. 设置定时器1的工作模式和计时器,以达到您需要的计时效果。 2. 配置串口通信模块的波特率、数据位、停止位等参数,使其与要通信的设备相匹配。 3. 在程序中编写定时器1的中断服务函数,在中断函数中实现串口通信的数据发送和接收操作。 以下是简单的代码示例,仅供参考: ```c #include <stc89c52.h> // 定义波特率常量 #define BAUDRATE 115200 // 定义计时器初 #define TIMER_INIT 65536 - (FOSC / 4 / BAUDRATE) void init_timer1() { // 设置定时器1为16位定时器 TMOD |= 0x10; // 设置定时器1工作模式为定时器模式 TMOD &= 0xef; // 设置计时器初 TH1 = TIMER_INIT / 256; TL1 = TIMER_INIT % 256; // 启动定时器1 TR1 = 1; } void init_serial() { // 设置波特率 PCON &= 0x7f; SCON = 0x50; TH1 = 0xfd; TL1 = 0xfd; // 启动串口 TR1 = 1; ES = 1; } void main() { init_timer1(); init_serial(); EA = 1; while(1); } void serial_isr() interrupt 4 { if (TI) { // 发送数据 TI = 0; } if (RI) { // 接收数据 RI = 0; } } ``` 当然,这只是一个简单的示例代码,具体的实现还需要根据实际需求进行调整和完善。同时,还需要注意一些细节问题,比如时钟频率、中断优先级、数据缓存等等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值