星星博客 »  > 

51单片机程序0到60计数个位逢5和6不显示,十位逢1不显示http://www.51hei.com/bbs/mcu-h24-1.html

原文如下:

单片机源程序如下:


1.#include <reg52.h>

2.#define uchar unsigned char

3.#define uint unsigned int

4.sbit DE=P2^1;      

5.sbit WE=P2^2;   

6.uint m,m0,m1,m2,gew,shiw;

7.uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

8.void delay(uint);

9.void main()

10.{

11.        TMOD=0x01;

12.        EA=1;

13.        ET0=1;

14.        TR0=1;

15.        TH0=(65536-45872)/256;

16.        TL0=(65536-45872)%256;  

17.        while(1)

18.        {

19.                WE=1;

20.                P1=0xfe;

21.                WE=0;

22.                DE=1;

23.                P1=table[shiw];

24.                DE=0;

25.                delay(20);

26.                WE=1;

27.                P1=0xfd;

28.                WE=0;

29.                DE=1;

30.                P1=table[gew];

31.                DE=0;

32.                delay(20); 

33.        }        

34.}

35.void T0_time() interrupt 1   

36.{

37.        TH0=(65536-45872)/256;

38.        TL0=(65536-45872)%256;

39.        m0++;

40.        if(m0==20)

41.        {

42.                m0=0;

43.                m++;

44.                if(m==60)

45.                        m=0;

46.                shiw=m/10;

47.                gew=m%10; 

48.        }

49.}

50.void delay(uint ms) 

51.{

52.        uint i,j;

53.        for(i=ms;i>0;i--)

54.                for(j=110;j>ms;j--);

55.}
复制代码求助大神,为什么我做的这个0到60计数循环,个位逢5丢数,十位逢1丢数啊。。

在仿真中确实存在修改一下代码即可 P1=0xfe; WE=1; WE=0;

xianfajushi 发表于 2019-6-25 10:08
在仿真中确实存在修改一下代码即可 P1=0xfe; WE=1; WE=0;


感谢帮助,这样修改确实解决了这个问题。请问这是什么问题?这是仿真软件的问题吗,我看书中的格式都是先开锁存输入数据再关锁存这种顺序。。。为什么在proteus里要改成先送数据再开关锁存?

纸上谈兵编写的教科书早该改了,P1=0xfe; WE=1; WE=0;我这样写的才是正确的,无论是从理论或仿真或实物都能正确无误执行,准备好数据打开锁存关闭锁存送入的是的的确确想要的正确的值;
而教科书WE=1; P1=0xfe; WE=0;这写在打开锁存瞬间写入的是上一个循环后存留的值,再送入想要的值就造成种种魅像,看不到某些数码显示或出现魅影(鬼影)或数码显示黯淡等等,如有的说使用CHAR写延时比较节约内存,殊不知使用2个CHAR与使用1个INT是一样的,因此教科书其实在纸上谈兵的人编写充斥种种误人子弟的谬论.

如论坛有人回复我的帖子说FOR循环不需要声明变量,而我用WHILE需要声明变量,这样可笑荒谬的回复,他忘记了变量使用前需要声明的基本原则了,试问变量不声明FOR循环中如何使用?这就是典型的纸上谈兵范.
至于锁存具体如何工作锁存数据脉冲上升沿下降沿等就不赘述,有兴趣的自己去深究.

 

从现象反推出产生现象的原因是科学定律;这在程序调试中是最常用的分析方法,中医也是这样从病症去反推产生病症的原因从而对证治病,西医何尝不是从果究因去寻找各种病菌呢都一样,从物理学上来说也是从果推因寻找现象背后的成因,如打雷闪电缘何产生去究其因,类推之化学界生物界等,又如破案从犯罪现场种种证据搜集去推导出犯罪的思想动机,总之从现象推导原因普遍存在于方方面面,因此是科学规律,人类正是在这种规律中建立和积累起来的知体系.

相关文章