STC32G12K128计算e常数精确到小数点后9858位的汇编程序

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,我们可以使用以下公式:

  1. 计算 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位元加法。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值