STC32G12K128 单片机简介
STC32G12K128 是一款由宏晶科技 (STC) 生产的32位8051单片机,它的特点是:
- 32位 8051 架构,但速度比传统的8051约快 70倍。
- 1.9V 至 5V 工作电压,更适用于多种供电环境。
- 128K 字节 FLASH,用于存储用户代码。
- 4K字节内部 SRAM (edata),8K字节内部扩展RAM (xdata)。
- 丰富的外接;DMA,RTC,CAN,多路串口,定时器,PWM,ADC,I2C,SPI等
- 所有IO 口都支持中断
- 支持 DMA:支持 SPI,I2C,ADC,UART,LCM 等接口的DMA功能。
本程序使用STC32G12K128具有8K 字节内部扩展RAM (xdata) 来存储 e 常数,精确到小数点后9858位。
e 常数计算公式
![]()
迭代计算 e 的公式
计算数学常数 e 的方法之一是通过迭代公式。我们可以利用两个变量TERMA 和 TERMB 来逐步逼近 e。
初始值
- TERMA(1)=2
- TERMB(1)=1
迭代公式
对于 n=2,3,4,…,3210,我们可以使用以下公式:
- 计算 TERMB:
TERMB(n) = TERMB(n-1) / n
2. 计算 TERMA:
TERMA(n)=TERMA(n−1)+TERMB(n)
最终结果
- 最终的 e 值为:
e=TERMA(3210)
为什么选择 n=3210?
我们选择 n 的最大值为 3210,因为在计算中:
1/3210!≈1.1266×10^-9864
这远远超过了我们所需的小数点后 9858 位的精度,确保了计算的准确性。
STC32G12K128 (8051) 串口设定
计算结束后,单片机把结果用串口1送出PC。设定如下:
单片机串口1 (P3.1是TxD,P3.0是RxD)
PC COM1 设定: 14400 bps, 8, None, 1, None

根据串口通信协议,当没有数据传输时,输出高电平,一个低电平代表起始位 (start bit),紧随8个位的数据 (由低位开始传送),奇偶位 (如有),以及停止位 (stop bit)。
串口1 Mode1的波特率由定时器控制。TMOD (地址 89H) 为定时器/计数器控制寄存器,其功能是设置定时器/计数器的方式。

GATE:0 定时器由软件控制位 TR1或TR0 来控制启动;1时INT1/INT0为高,TR1/TR0为1时才开定时器1/0。
C/T:0 为定时器;1 为计数器 (对T1/T0外部脉冲进行计数) 。
| M1 |
M0 |
工作模式 |
工作模式说明 |
| 0 |
0 |
Mode 0 |
16 位自动重载 TH1/0,TL1/0模式。 |
| 0 |
1 |
Mode 1 |
16 位不自动重载模式。 |
| 1 |
0 |
Mode 2 |
两个8位,TL1/0自动重载TH1/0的重载值。 |
| 1 |
1 |
Mode 3 |
T1停止工作。T0 不可屏蔽中断的16位自动重载模式。 |

波特率产生方式
波特率可由 Timer1或 Timer2 所产生的溢出信号来控制。一般8051 把晶体振荡器的时钟频率 ÷12 获得机器周期频率,例如晶体振荡器 XTAL = 11.0592 MHz, 机器周期频率 = 11.0592 MHz÷12 = 921.6 kHz,串口线路把此机器周期频率 ÷32 再供应给 Timer1,即是 921.6 kHz ÷32 = 28,800 Hz。一般使用 Timer1 的 Mode 2 作为波特率产生器,即是8位自动重载模式。只要把重载值写入 TH1 就会产生波特率。

TL1、TH1 为Timer1定时器/计数器的计数寄存器,其地址为8BH、8DH。不同的TH1重载值产生不同的波特率。例如XTAL = 11.0592 MHz,需要波特率 9600 baud:
TH1=256-(11059200/12/32/9600)=256-3=253=0xFD。
其余波特率可参考下表:

SBUF 寄存器为串口缓冲器,地址为 99H,使用同一个地址的两个寄存器构成的。一个为发送数据用的缓冲器,另一个寄存器为接收数据用的缓冲器。
SCON 为串口控制寄存器,其地址为 98H,其功能是设置串口工作方式与标志。

SM0、SM1控制串口的4种工作方式:
| SM0 |
SM1 |
方式 |
功能说明 |
| 0 |
0 |
Mode 0 |
8位同步移位寄存器方式 (用于扩展IO) |
| 0 |
1 |
Mode 1 |
8位异步收发,波特率可变 (由定时器控制) |
| 1 |
0 |
Mode 2 |
9位异步收发,波特率为 ÷64 或 ÷32 |
| 1 |
1 |
Mode 3 |
9位异步收发,波特率可变 (由定时器控制) |
SM2:用于多处理器通信,通常置 0。
REN: 1 允许串口接收;0 禁止串口接收。
TB8:发送的第9位数据,用于Mode2、Mode3,一般作为奇偶校验位使用。
RB8:接收的第9位数据,用于Mode2、Mode3,一般作为奇偶校验位使用。
TI:发送中断标志位,发送结束时硬件置1,注意TI必须由软件清零。
RI:接收中断标志位,接收结束时硬件置1,注意RI必须由软件清零。
串口初始化子程序
注意:STC32G12K128的工作频率定为 24.000 MHz。
INIT_UART:
MOV SCON, #0x50 ; 串口1 Mode1,波特率由Timer1定时器控制,允许串口接收
MOV TMOD, #0x20 ; Timer1 Mode 2 工作模式,8位自动重载模式
MOV AUXR, #0x40 ; T1x12=1, Timer1 1T mode (FOSC/1 不分频)
MOV TH1, #0xCC
MOV TL1, #0xCC ; TH1=256-(24000000/32/14400)=256-52=204=0xCC
SETB TR1 ; 启动Timer1
RET
送出数据至串口子程序
SEND:
MOV SBUF, A ; 累加器内的字符送到SBUF (发送数据用的缓冲器)
JNB TI,$ ; 等候完成,直到TI = 1
CLR TI ; 软件TI 清零,准备送出下一个字符
RET
STC32G12K128计算e常数主程序
此程序的关键算法是一个16位元除法和一个8位元加法。

最低0.47元/天 解锁文章
3491

被折叠的 条评论
为什么被折叠?



