单片机显示小数

nmn9dn 2009-07-14 05:18:32
我想在数码管上显示整数和小数部后三位,那们大侠帮我改下程序啊,先谢了
#include<reg52.h>
#define uchar unsigned char
#define static unsigned long int
sbit bb=P3^2; //外部中断位声明
sbit cc=P3^3;
static count,shiwan,wan,qian,bai,shi,ge;
static disnum,ad;
float ab,ac;
uchar code tabledu[]={ //数组变量
0x28,0x7e,0xa2,0x62,
0x74,0x61,0x21,0x7a,
0x20,0x60};
display(uchar,uchar,uchar,uchar,uchar,uchar);
delay(char) ;
void abc();
void main ()
{
count=0;
EA=1; //总中断开
EX0=1; //外部中断0开
IT0=1; //下降沿触发
TMOD=0xf0;
TR1=1;
while(1)
{
if(ac>=1000000) //计数值到一百万后清0
ac=0;
display(shiwan,wan,qian,bai,shi,ge) ; //显示程序
shiwan=ac/100000;
wan=(ac-(shiwan*100000))/10000;
qian=(ac-(shiwan*100000)-(wan*10000))/1000;
bai=(ac-(shiwan*100000)-(wan*10000)-(qian*1000))/100;
shi=(ac-(shiwan*100000)-(wan*10000)-(qian*1000)-(bai*100))/10;
ge=(ac-(shiwan*100000)-(wan*10000)-(qian*1000)-(bai*100)-shi*10)%10;
}
}
void abc()
{
ab=12/200;
ad=disnum/ab;
if(ad>0)
ad=+ac;
}
void tim1() interrupt 0
{
abc();
count++; //计数++
disnum++; //显示++
}
display(uchar shiwan,uchar wan,uchar qian,uchar bai,uchar shi,uchar ge)
{
P2=0xc0; //消影作用
P0=tabledu[shiwan];
P2=0xfd;
delay(0);

P2=0xc0;
P0=tabledu[wan];
P2=0xfb;
delay(0);

P2=0xc0;
P0=tabledu[qian];
P2=0xf7;
delay(0);

P2=0xc0;
P0=tabledu[bai];
P2=0xef;
delay(0);

P2=0xc0;
P0=tabledu[shi];
P2=0xdf;
delay(0);

P2=0xc0;
P0=tabledu[ge];
P2=0xbf;
delay(0);
// 0xfd,0xfb,0xf7,0xef,
// 0xdf,0xbf};
}
delay(char x) //延迟子程序
{
uchar a,b;
for(b=1000;b>0;b--)
for (a=x;a>0;a--) ;
}
...全文
824 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
backup88 2009-07-16
  • 打赏
  • 举报
回复
在单片机中不建议用浮点数(除非带FPU),你完全可以使用整型或者长整型替代,
只不过在显示时,在指定位置显示一个小数点即可。
把ac的类型改为long int (当然楼上的建议很好,看看编译器的使用手册,不同编译器对数据类型长度定义不同)。
显示时在显示千位时要稍微做一下处理,要显示小数点。
不过你的tabledu很奇怪哦,好像不是标准的数码管排列呢?
显示模块只要屏幕刷新率大于30Hz即可不用关中断。当前前提是你的中断程序要很速度的完成才行。

打字很麻烦,给你个代码做参考吧! 不一定是最理想的:
void SMG_ShowData(int iNum)
{
char i=0,j=0,k=0,NumStr[4]={1,2,3,4},tmp;
NumStr[0]=(iNum%10000)/1000; //取得千位
NumStr[1]=(iNum%1000)/100; // 取得百位
NumStr[2]=(iNum%100)/10; // 依次类推
NumStr[3]=(iNum%10);

for(i=0;i<10;i++)
{
k=0x01;
for(j=0;j<4;j++)
{
SEG_BITSEL_PORT=k;
SEG_FONT_PORT=Seg7TableN[NumStr[j]];
delay(20);
k=k<<1;
delay(20);
}
}
}
knate 2009-07-15
  • 打赏
  • 举报
回复
while(1)
{
if(ac>=1000000) //计数值到一百万后清0
ac=0;
display(shiwan,wan,qian,bai,shi,ge) ; //显示程序
shiwan=ac/100000;
wan=(ac-(shiwan*100000))/10000;
qian=(ac-(shiwan*100000)-(wan*10000))/1000;
bai=(ac-(shiwan*100000)-(wan*10000)-(qian*1000))/100;
shi=(ac-(shiwan*100000)-(wan*10000)-(qian*1000)-(bai*100))/10;
ge=(ac-(shiwan*100000)-(wan*10000)-(qian*1000)-(bai*100)-shi*10)%10;
}
}

如果我是老板,嘿嘿,你就危险了.
首先:算法并不怎么样,不知道求余的方法?
其次:float用那么多是大忌,估计从来没用汇编写过程序.性能差别不是一点两点.
其三:lloat,long int的位长不是每种单片机都是固定的,能不能满足1 000 000 的显示,你自己还得去翻书.
其四:显示模块最好关掉中断,(除非非常有必需不能关掉),否则可能出现显示错误的问题.//个人经验,不一定准确
其五:习惯不好.不要把在编写pc运行程序的所有习惯带到编写单片机那里.

建议
Interger_Partion = (int)ac;
Decimal_Partion = (ac-Interger_Partion)*1000;
路还长着呢
akcw007 2009-07-15
  • 打赏
  • 举报
回复
哪单片机当PC机使呢
这程序,51运行的话能累死
efenwu 2009-07-14
  • 打赏
  • 举报
回复
延时函数用unsigned int 型
unsigned int a,b;

定时器初值呢大哥...
大前置 2009-07-14
  • 打赏
  • 举报
回复
单片机的
没搞过
帮顶
shouwangzhe1981 2009-07-14
  • 打赏
  • 举报
回复
具体的程序没有仔细看.51的现在我没有做.有些寄存器功能忘了.只说一下细路吧.
看你的意思,你想显示一个浮点型的数.先设置一个字符数组.把浮点型的数转换到字符数组中.用循环把小数点的位置.记录小数点位置.在数码管要显示的位置+0x80就可以了.
例123.456,用ftoa函数,放在一个unsigned char cover[7]里,cover[4]里放的是小数点.用一变量记数小数点的位置4,当用数码管显示时,用for循环时,当等于4时加上0x80就可以了.

69,379

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧