新学期伊始,不忘助力国产替代初心,手头没有试验箱,先用“擎天柱”带领大一同学,跟随冲哥视频,学用STC AI8051U芯片讲义。 第六节 学用调试仿真接口7段数码管,温习浮点数存储 本节课主要任务是用擎天柱配合烧录工具cdc/hid串口助手,调用7段数码管接口,温习IEEE754标准。 一、准备验证工作。 拷贝上节课代码,连接擎天柱到电脑上,打开烧录工具,鼠标点击菜单“调试仿真接口”找到并鼠标左键点击打开“接口协议及帮助”,再鼠标左键点击“调试仿真接口”菜单“接口协议及帮助”,鼠标左键点击打开“7段数码管接口”,学习功能3和功能4。 二、学用7段数码管接口功能4指令。 在数码管上直接显示所给的段码命令格式: STC工程师封装函数名SEG7_ShowCode,可直接调用,函数只有一个参数,是装载数码管8个段状态值的数组。本节课直接调用,配合擎天柱让虚拟数码管显示流动数字。 1. 定义变量。在task.c文件中定义一个变量和一个数组: u8 NixieTube_index = 0; u8 NixieTube_code[8]; 2. 在task.c文件中定义一个任务回调函数: void Show_NixieTube(void) { NixieTube_code[0] = t_display[NixieTube_index]; if(NixieTube_index + 1 > 9) { NixieTube_code[1] = t_display[NixieTube_index-9]; } else { NixieTube_code[1] = t_display[NixieTube_index+1]; } if(NixieTube_index + 2 > 9) { NixieTube_code[2] = t_display[NixieTube_index-8]; } else { NixieTube_code[2] = t_display[NixieTube_index+2]; } if(NixieTube_index + 3 > 9) { NixieTube_code[3] = t_display[NixieTube_index-7]; } else { NixieTube_code[3] = t_display[NixieTube_index+3]; } if(NixieTube_index + 4 > 9) { NixieTube_code[4] = t_display[NixieTube_index-6]; } else { NixieTube_code[4] = t_display[NixieTube_index+4]; } if(NixieTube_index + 5 > 9) { NixieTube_code[5] = t_display[NixieTube_index-5]; } else { NixieTube_code[5] = t_display[NixieTube_index+5]; } if(NixieTube_index + 6 > 9) { NixieTube_code[6] = t_display[NixieTube_index-4]; } else { NixieTube_code[6] = t_display[NixieTube_index+6]; } if(NixieTube_index + 7 > 9) { NixieTube_code[7] = t_display[NixieTube_index-3]; } else { NixieTube_code[7] = t_display[NixieTube_index+7]; } SEG7_ShowCode(NixieTube_code); if(++NixieTube_index >9) NixieTube_index = 0; } 3. 在task.c文件中TASK_COMPONENTS Task_Comps函数内添加一行任务代码:{0, 5000, 5000, Show_NixieTube} 4. 在task.h文件中申明一下任务回调函数 void Show_NixieTube(void); 5. 编译烧录到擎天柱,打开烧录工具CDC/HID串口助手和虚拟数码管,欣赏流水数字。 三、温习浮点数存储 虚拟数码管功能3使用说明提到了IEEE754格式,有同学问为何3.14159存储数据是40H 49H 0FH D0H 1.单精度浮点数IEEE 754标准存储概述。 单精度浮点数在计算机内存中的表示遵循 IEEE 754标准,使用 32位(4字节) 来表示,这32位被划分为三个部分: A、符号位 (Sign): 最高位(第31位),1位。0表示正数,1表示负数。 B、指数位 (Exponent): 中间8位(第30位到第23位)。为了能表示负指数,引入了偏移码,其实际值 =无符号整数值-127。 C、尾数位 (Fraction/Significand): 最低23位(第22位到第0位)。存储的是小数部分,整数部分的1被隐含,称为“隐含的1”。 2.转换计算 40H 49H 0FH D0H 第一步:用计算器程序员模式将上述十六进制转换为完整的32位二进制: 0100 0000 0100 1001 0000 1111 1101 0000 第二步:划分IEEE 754的三个部分 符号位 S (第31位): 0 (正数) 指数位 Exp (第30-23位): 1000 0000 尾数位 Frac (第22-0位): 1001 0010 0001 1111 1010 000 第三步:计算指数 将指数位Exp: 1000 0000 转换为十进制:128 减去偏移量 127:128 - 127 = 1 实际指数 E = 1 第四步:还原完整的尾数 规范化形式的二进制科学计数法有一个隐含的1,将隐含的1和23位尾数位组合起来,完整的尾数 M =1.10010010000111111010000 第五步:计算十进制数值 计算原理: 数值 = (符号) * (完整尾数M的十进制值) * (2 ^ 指数E) 计算完整尾数 M 的十进制值: 整数部分: 1 = 1 小数部分: 1st digit: 1 * (1/2) = 0.5 2nd digit: 0 * (1/4) = 0 3rd digit: 0 * (1/8) = 0 4th digit: 1 * (1/16) = 0.0625 5th digit: 0 * (1/32) = 0 6th digit: 0 * (1/64) = 0 7th digit: 1 * (1/128) = 0.0078125 8th digit: 0 * (1/256) = 0 9th digit: 0 * (1/512) = 0 10th digit: 0 * (1/1024) = 0 11th digit: 0 * (1/2048) = 0 12th digit: 1 * (1/4096) = 0.000244140625 13th digit: 1 * (1/8192) = 0.0001220703125 14th digit: 1 * (1/16384) = 0.00006103515625 15th digit: 1 * (1/32768) = 0.000030517578125 16th digit: 1 * (1/65536) = 0.0000152587890625 17th digit: 0 * (1/131072) =0.00000762939453125 18th digit: 1 * (1/262144) = 0 19th digit: 1 * (1/524288) =0.0000019073486328125 20th digit: 0 * (1/1048576) = 0 21th digit: 1 * (1/2097152) = 0 22th digit: 0 * (1/4194304) = 0 22th digit: 0 * (1/8388608) = 0 将上述所有值相加 1+0.5+0.0625+0.0078125+0.000244140625+0.0001220703125+0.00006103515625+0.000030517578125+0.0000152587890625+0.00000762939453125+0.0000019073486328125=1.5707950592041015625 1.5707950592041015625×2=3.141590118408203125 同学们好学可赞,不过了解一下即可,没必要花太多时间研究。
|