51单片机动态数码管+定时器

2019-07-16 02:34发布

我的学习板上有四个数码管,两个正置,两个是倒置的
我想实现每过一秒使数码管自动加一
但是实现不了,把代码贴上,麻烦各位指点下……




友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
11条回答
xieshaobao228
1楼-- · 2019-07-16 07:49
  1. #include <reg52.h>
  2. #define TIME 50000

  3. char t_time = 0;
  4. char thr_bit = 0,thou_bit = 0;                 //thr_bit是百位,thou_bit是千位
  5. int sin_bit = 0,dou_bit = 0;                 //sin_bit是个位,dou_bit是十位

  6. char code bit_chosen[]={
  7.                               0XBF,0XDF,0XEF,0XF7
  8.                            };   //choose the bit
  9.                                                                                          
  10. char code       p_digit[] ={         //positive
  11.                                                         0XC0,0XF9,0XA4,0XB0,            //0~3
  12.                                                         0X99,0X92,0X82,0XF8,            //4~7
  13.                                                         0X80,0X90,0X88,0X83,            //8~B
  14.                                                         0XC6,0XA1,0X86,0X8E                //C~F
  15.                                                         };

  16. char code      n_digit[]={                //negative
  17.                                                         0XC0,0XCF,0XA4,0X86,                 //0~3
  18.                                                         0X8B,0X92,0X90,0XC7,                //4~7
  19.                                                         0X80,0X82,0X81,0X98,                //8~B
  20.                                                         0X98,0X98,0X98,0X98,                //C~F
  21.                                                     };

  22. void delay();


  23. void main(void)
  24. {

  25.                 EA  = 1;
  26.                 ET0 = 1;
  27.                 TR0 = 1;


  28.         TH0 = (65536-TIME)/256;                   //?1
  29.         TL0 = (65536-TIME)%256;

  30.                 while(1)          //因为倒置的数码管,所以有两个需要倒置数字的code
  31.                 {                          //bit_chosen数组是位选,加了注释,尽量增加可读性了
  32.                               //如果有什么细节没讲到,我可以继续解释。
  33.                          P2 = bit_chosen[3];
  34.                             P0 = n_digit[sin_bit%10];
  35.              delay();

  36.                          P2 = bit_chosen[2];
  37.                          P0 = n_digit[dou_bit%10];
  38.              delay();

  39.                          P2 = bit_chosen[1];
  40.                          P0 = p_digit[thr_bit%10];                  
  41.                          delay();

  42.                          P2 = bit_chosen[0];
  43.                          P0 = p_digit[thou_bit%10];                  
  44.                          delay();

  45.             }
  46.                
  47.                   

  48. }

  49. void delay()
  50. {
  51.      int i,j;
  52.          for(i<50;i;i++)
  53.            for(j=1;j;j--);
  54. }


  55. void timer() interrupt 1
  56. {       
  57.         TH0 = (65536-TIME)/256;
  58.         TL0 = (65536-TIME)%256;
  59.         t_time++;
  60.        
  61.        
  62.         if(t_time ==40)                                                        //晶振24M,定时1s
  63.         {                                                                               
  64.                 sin_bit++;                                                        //过一秒加1
  65.                
  66.                 if(!(sin_bit%10))                                        //10秒,十位加1
  67.                          dou_bit++;
  68.                 if(!(sin_bit%100))                                    //100s,百位加1
  69.                          thr_bit++;
  70.                 if(!(sin_bit%1000))                                        //1000s,千位加1
  71.                          thou_bit++;
  72.                 if(!(thou_bit%10000))                                //9999之后归0
  73.                          sin_bit=0;
  74.         }
  75.        

  76. }
复制代码
xieshaobao228
2楼-- · 2019-07-16 10:27
用tab排版之后可移植性果然差了很多……
顺便还有几个小问题。

1、主函数里面依然需要设置
        TH0 = (65536-TIME)/256;
        TL0 = (65536-TIME)%256;
吗?
因为我不了解具体的定时器的工作,是独立于CPU的么?
那样在interrupt 1 里面已经设置了
        TH0 = (65536-TIME)/256;
        TL0 = (65536-TIME)%256;
上电之后定时器就应该开始跑了吧……那在主函数里面再初始化不是很多余么。。
wjs2638795
3楼-- · 2019-07-16 16:19
本帖最后由 wjs2638795 于 2013-1-31 10:04 编辑

呃呃呃呃呃呃呃
xieshaobao228
4楼-- · 2019-07-16 18:19
 精彩回答 2  元偷偷看……
hobbye501
5楼-- · 2019-07-16 20:02
首先,你的这个代码不够规范  工程首先要有一个总的说明与描述 然后每个函数都要有说明功能返回值,还有      语句  对齐与空格  还有注释 这些都很重要 一定要养成良好的习惯 不然程序一多了 自己先乱了 找错都费劲
其次,调试时有技巧的  分步,分功能去调试,我打个比方 四个数码管弄不清楚的话就一个一个来
最后,要有耐心,这是最关键的!也是最重要的
sirius08
6楼-- · 2019-07-16 21:24
解决了就好

一周热门 更多>