欢迎来到天天文库
浏览记录
ID:11156484
大小:33.00 KB
页数:4页
时间:2018-07-10
《单片机浮点数的显示编程》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、单片机浮点数的显示编程标题:单片机浮点数的显示编程2007-10-0411:26:16单片机浮点数的显示编程经常接到读者的来信来电,谈到学习单片机编程已有一定进步,可以进行定点数的显示。但这些读者对如何进行浮点数显示却一筹未展,毫无头绪。而工业自动化控制中会牵涉到大量的浮点数运算与显示,这里笔者根据一简单的实例来详细介绍一下浮点数的C语言显示设计。更多的C语言学习内容可上www.hlelectron.com查看。电路构成假设显示为5位数码管,其电路见图1(作者注:使用Protel99se打开)。
2、其中最高位数码管作符号显示,其余的4位数码管进行浮点数显示。图1软件设计流程图2为主程序及定时器0中断程序的状态流程。主程序在上电时进行初始化,包括设置定时器初值及开中断等。无限循环过程中,不断调用取样子函数获取待显的浮点数,并将浮点数转为整数。浮点数转为整数的处理过程如下:首先判断取样获取的浮点数的正、负,若小于0,则符号位标志fu_hao清0,否则置1。下来,取浮点数的绝对值。再下来,判断浮点数的大小,若浮点数大于等于0而小于10,小数点标志point置0;若浮点数大于等于10而小于100,
3、小数点标志point置1;若浮点数大于等于100而小于1000,小数点标志point置2;若浮点数大于等于1000而小于10000,小数点标志point置3。需说明的是:由于显示数值的数码管为4位,因此假设取样获得的浮点数范围从0.000~9999。T0定时中断程序,用于刷新浮点数的显示,它会根据小数点标志point的变化,自动点亮某位数码管的小数点。并且T0定时中断程序还会根据符号位标志fu_hao,熄灭最高位数码管或显示“-”。图2程序实例详解#include//51单片机
4、头文件#include//调用绝对值计算库函数必需的头文件#defineucharunsignedchar//变量类型的宏定义#defineuintunsignedintucharcodeDIS_SEG7[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//0~9的数码管段码ucharcodeDIS_BIT[5]={0xfe,0xfd,0xfb,0xf7,0xef};//5位数码管位码//==============
5、==========floatx=-2000;//定义取样获取的浮点数(作演示时初始化为-2000)uintdisp_val;//无符号整型变量作显示缓冲ucharpoint;//无符号字符型变量作小数点标志pointbitfu_hao;//位变量作符号标志fu_haofloatsampling(void);//函数声明//************************voiddelay(uintk)//定义延时子函数{uintdatai,j;for(i=0;i6、j<60;j++){;}}}//***************************voidtime0(void)interrupt1//T0定时中断服务程序{staticuchardis_cnt;TH0=-(2000/256);TL0=-(2000%256);if(++dis_cnt>4)dis_cnt=0;//扫描5位数码管的计数值switch(dis_cnt){case4:if(fu_hao==0)P0=0x40;//如果符号标志fu_hao为0,//则最高位(万)位数码管显示“-”。e7、lseP0=0x00;//否则熄灭最高位(万)位数码管。P2=DIS_BIT[4];break;//选中万位数码管。//**********************************case3:if(point==0)P0=DIS_SEG7[disp_val/1000]8、0x80;//如果小数点//标志point为0,则千位数码管显示且同时点亮小数点。elseP0=DIS_SEG7[disp_val/1000];//否则仅千位数码管显示。P2=DIS_BIT[3];break;//选中千位9、数码管。//**********************************case2:if(point==1)P0=DIS_SEG7[(disp_val%1000)/100]10、0x80;//如果小数点标志point为1,则百位数码管显示且同时点亮小数点。elseP0=DIS_SEG7[(disp_val%1000)/100];//否则仅百位数码管//显示。P2=DIS_BIT[2];break;//选中百位数码管。//**********************************ca
6、j<60;j++){;}}}//***************************voidtime0(void)interrupt1//T0定时中断服务程序{staticuchardis_cnt;TH0=-(2000/256);TL0=-(2000%256);if(++dis_cnt>4)dis_cnt=0;//扫描5位数码管的计数值switch(dis_cnt){case4:if(fu_hao==0)P0=0x40;//如果符号标志fu_hao为0,//则最高位(万)位数码管显示“-”。e
7、lseP0=0x00;//否则熄灭最高位(万)位数码管。P2=DIS_BIT[4];break;//选中万位数码管。//**********************************case3:if(point==0)P0=DIS_SEG7[disp_val/1000]
8、0x80;//如果小数点//标志point为0,则千位数码管显示且同时点亮小数点。elseP0=DIS_SEG7[disp_val/1000];//否则仅千位数码管显示。P2=DIS_BIT[3];break;//选中千位
9、数码管。//**********************************case2:if(point==1)P0=DIS_SEG7[(disp_val%1000)/100]
10、0x80;//如果小数点标志point为1,则百位数码管显示且同时点亮小数点。elseP0=DIS_SEG7[(disp_val%1000)/100];//否则仅百位数码管//显示。P2=DIS_BIT[2];break;//选中百位数码管。//**********************************ca
此文档下载收益归作者所有