导读关于51单片机实现数字秒表程序算法出错的问题答你想表达的是不是: 你的程序中每次进入for循环都有这样一条指令sec=sec/10,而且执行了4次,所以每次for循环出来都有sec=0,因为计时...

今天运困体育就给我们广大朋友来聊聊51数字卡互换平台,希望能帮助到您找到想要的答案。

关于51单片机实现数字秒表程序算法出错的问题

关于51单片机实现数字秒表程序算法出错的问题

你想表达的是不是: 你的程序中每次进入for循环都有这样一条指令sec=sec/10,而且执行了4次,所以每次for循环出来都有sec=0,因为计时开始,sec < 10,sec的前3位还总是0,进入for因为连续4次除10再重新赋值,导致每次出来sec都为0,而出来后累加得1后再进入循环,那每次进入循环都应该有sec=1,从而应该每次BUF[0]=1,数码管个位应该一直显示1才对,可是却显示的是0。

根据你第二张图的上面,我发现你还用来显示秒ms,而刷新完毫秒后就立刻去刷新s了,而这时秒位还没更新到1,所以99次刷新为0,只有一次刷新为1,所以显示0时会闪,而且刷新为1停留的时间占的比重太小,根本看不到刷新为1的时候。

而你说你用左图的方法代替那个for循环正常,是因为左图那个每次都不会把储存秒的变量给清0,即使是每ms刷新一次,因为储存秒的变量是存在的,到下一秒才变化,所以每ms进入刷新时,储存秒的变量储存的是上一个s得到的值,显示出来就是正确的。

①②③④⑤这样的圆圈数字都能打,怎么打一个圆圈51呀?打出来一个给我复制一下。

带圈数字正常输入只能输入1—10,11—50需要用Unicode编码转换,50之后的带圈数字就只能在Word中输入了,下面用Word 2007演示输入方法:

一、打开Word,进入“开始选项卡”,点击“字体”栏内的“带圈字符”按钮。

二、打开带圈字符窗口后,在文字栏中输入“51”,右边圈号使用圆形。

三、上方“缩小文字和增大圈号”选择一种,点击“确定”(增大圈号会更加美观一些)。

四、效果如下图,这时就可以在Word中输入一个带圈的51,但该符号仅可以在该窗口中使用,复制到其它程序中会变为正常数字“51”。

请教高手,用51单片机独立按键控制数码管数字加减,为什么在按下独立按键的时候会出现闪烁?怎么回事?

因为你按键的时候影响了数码管刷新;

数码管一般都是动态扫描的,利用人眼的视觉暂留做的,你按下按键的时候,肯定有延时消抖,延时的时候就影响了数码管显示,所以数码管刷新的慢了,人眼就能分辨出来亮和灭的状态

解决办法

1、改进按键扫描

2、改进数码管显示

3、用嵌入式系统

三选一即可解决

51单片机做计数显示时,数字不连续,一闪一闪的。

当然会闪啦,你在每次中断时扫描LED,间隔太长啦!请用以下改过的程序:

#include<reg52.h>

#include<intrins.h>

#define uint unsigned int

#define uchar unsigned char

uchar temp,aa,shi,ge;

uchar code table[]={ 0x28,0xeb,0x32,0xa2,0xe1,0xa4,0x24,0xea,0x20,0xa0};

void delay(uint z);

sbit com0=P2^7;

sbit com1=P2^6;

bit flag;

void main()

{

aa=0;

TMOD=0x01;

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

EA=1;

ET0=1;

TR0=1;

while(1){

if(aa==20)

{

aa=0;

temp++;

if(temp==60)temp=0;

shi=temp/10;

ge=temp%10;

}

P1=table[ge] ;

com1=0;

delay(10);

com1=1 ;

P1=table[shi];

com0=0;

delay(10) ;

com0=1;

}

void timer0() interrupt 1

{

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

aa++;

}

void delay(uint z)

{

uint x,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);

}

今天的内容先分享到这里了,读完本文《51数字闪卡》之后,是否是您想找的答案呢?想要了解更多,敬请关注www.zuqiumeng.cn,您的关注是给小编最大的鼓励。