找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 11144|回复: 19
收起左侧

数码管实现加1计数器,循环显示000-999,间隔1秒,定时器方式!我这到底错哪啊?

  [复制链接]
ID:145415 发表于 2016-11-17 22:04 | 显示全部楼层 |阅读模式
  1. #include<reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. sbit dula=P2^6;
  5. sbit wela=P2^7;
  6. uchar num,b,count;
  7. uint flag=0;
  8. uint bai=0,shi=0,ge=0;
  9. uint xms;
  10. void delayms(uint);
  11. void display(uint bai,uint shi,uint ge);
  12. uchar code table[]={
  13. 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,};
  14. void main()
  15. {
  16.         TMOD=0x00;
  17.         TH0=(8192-8000)/32;
  18.         TL0=(8192-8000)%32;
  19.         EA=1;
  20.         ET0=1;
  21.         TR0=1;

  22.         while(1)
  23.         {
  24.         display(bai,shi,ge);
  25.         }
  26.        
  27. }
  28. void display(uint bai,uint shi,uint ge)
  29. {        dula=1;
  30.         P0=table[ge];
  31.         dula=0;
  32.         P0=0xff;
  33.         wela=1;
  34.         P0=0x2f;
  35.         wela=0;
  36.         delayms(100);
  37.        
  38.     dula=1;
  39.         P0=table[shi];
  40.         dula=0;
  41.         P0=0xff;
  42.         wela=1;
  43.         P0=0x1f;
  44.         wela=0;
  45.     delayms(100);
  46.        
  47.         dula=1;
  48.         P0=table[bai];
  49.         dula=0;
  50.         P0=0xff;
  51.         wela=1;
  52.         P0=0x37;
  53.         wela=0;
  54.         delayms(100);


  55. }
  56. void timer0()interrupt 0
  57. {
  58.     TH0=(8192-8000)/32;
  59.         TL0=(8192-8000)%32;
  60.    count++;
  61.    if(count ==125)
  62.    {
  63.         count = 0;
  64.                 bai=num/100;
  65.         shi=(num - (bai*100))/10;
  66.         ge=num%10;
  67.                 num++;
  68.         if(num==999)
  69.              num = 0;

  70.    }
  71. }

  72. void delayms(uint xms)
  73. {
  74.         uint i,j;
  75.         for(i=xms;i>0;i--)
  76.                 for(j=110;j>0;j--);
  77. }
复制代码

Screenshot_2016-11-17-21-59-46-913_com.miui.galle.png
运行后并没有实现预定功能,就一直显示000,我分析原因是因为,display的参数没有传过去!但是该怎么改啊?请大家帮忙看看!我是新手
回复

使用道具 举报

ID:138155 发表于 2016-11-18 08:39 | 显示全部楼层
两种可能 一是可能数据传递不成功  二是 定时器没有计数
回复

使用道具 举报

ID:111634 发表于 2016-11-18 11:20 | 显示全部楼层
本帖最后由 zl2168 于 2016-11-18 11:22 编辑

为什么不吸取教训?上次给了你一个程序,还带keil调试,与别人的程序比较,不知你有什么体会?给你学习方法的建议有什么感想?不学理论,盲目实践,不是事倍功半,就是知其然,不知其所以然。
回复

使用道具 举报

ID:111634 发表于 2016-11-18 11:25 | 显示全部楼层
为什么有人学得快、学的好,有人学得慢、学的差?除了悟性、勤奋外,学习方法不好是一个重要原因!
回复

使用道具 举报

ID:148310 发表于 2016-11-18 12:17 | 显示全部楼层
TMOD=0x00;这名句改为 TMOD = 0X01;
TMOE寄存器的低4位是设置T0定时器的工作模式;
59.void timer0()interrupt 0 这句改为:void timer0() interrupt  1 (此处中断号不对,0是外部中断,1是内部中断)
另:做为初学者来说,从一开始,就要养成良好编程的习惯,程序要加注释,层次要清晰。建议看宋学松老师的视频,(本论坛就有下载)不要看郭天祥老师的。。。。
写了这些,有没有HB啊
回复

使用道具 举报

ID:148310 发表于 2016-11-18 12:19 | 显示全部楼层
忘说了,我也是初学者,希望高手 不要喷我,谢谢~
回复

使用道具 举报

ID:148624 发表于 2016-11-18 12:48 | 显示全部楼层
你程序里面数字变化的量num都没有看到有变化的地方,肯定一直是000啊
回复

使用道具 举报

ID:140371 发表于 2016-11-18 18:56 来自手机 | 显示全部楼层
wuyibin2003 发表于 2016-11-18 08:39
两种可能 一是可能数据传递不成功  二是 定时器没有计数

中斷編號有誤。延時過長。
回复

使用道具 举报

ID:102056 发表于 2016-11-18 23:36 来自手机 | 显示全部楼层
第一个是跳转到中断那里应该写,interrupt 1     第二个是每次显示数码管最好是先写消隐   ,第三是写完段码显示就不要段码控制为0,不然就显示动不了,延时时间太长。最后一个中断控制里计算个,十,百,最好提到主函数里,不然1秒计数就会产生很大的误差。
回复

使用道具 举报

ID:102056 发表于 2016-11-19 21:55 | 显示全部楼层
电路图不一样。自行修改
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit dula=P1^7;
sbit wela=P1^6;
uchar num,count;
uint bai=0,shi=0,ge=0;
void display(uint bai,uint shi,uint ge);
uchar code table[]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,};
void delay1ms(void)   //误差 -0.651041666667us
{
    unsigned char a,b;
    for(b=102;b>0;b--)
        for(a=3;a>0;a--);
}
void main()
{
        TMOD=0x00;
        TH0=(8192-8000)/32;
        TL0=(8192-8000)%32;
        EA=1;
        ET0=1;
        TR0=1;

        while(1)
        {
        display(bai,shi,ge);
        }
        
}
void display(uint bai,uint shi,uint ge)
{   
            bai=num/100;
        shi=(num - (bai*100))/10;
        ge=num%10;


                dula=1;
                P0=0X00;
                dula=0;
                wela=1;
        P0=0x7f;
        wela=0;
        dula=1;
        P0=table[ge];  
        delay1ms();
        
                dula=1;
                P0=0X00;
                dula=0;
                wela=1;
        P0=0xbf;
        wela=0;
        dula=1;
        P0=table[shi];  
        delay1ms();
        
                dula=1;
                P0=0X00;
                dula=0;
                wela=1;
        P0=0xdf;
        wela=0;
        dula=1;
        P0=table[bai];
        delay1ms();


}
void timer0()interrupt 1
{
    TH0=(8192-8000)/32;
    TL0=(8192-8000)%32;
   count++;
   if(count ==125)
   {
        count = 0;
         num++;
        if(num==999)
          num = 0;

   }
}


回复

使用道具 举报

ID:148930 发表于 2016-11-19 23:43 | 显示全部楼层
看了一下你的板子好像是天祥的。我只觉得你一个地方有问题,天祥的书里不是也说了嘛,中断函数里少放东西,尽量把计算和赋值提到外面来
回复

使用道具 举报

ID:111634 发表于 2016-11-20 11:18 | 显示全部楼层
xht9951 发表于 2016-11-18 12:17
TMOD=0x00;这名句改为 TMOD = 0X01;
TMOE寄存器的低4位是设置T0定时器的工作模式;
59.void timer0()inte ...

“做为初学者来说,从一开始,就要养成良好编程的习惯,程序要加注释,层次要清晰。”对头!!!
回复

使用道具 举报

ID:111634 发表于 2016-11-21 09:20 | 显示全部楼层
先学学正确的东西。
回复

使用道具 举报

ID:145415 发表于 2016-11-21 09:34 | 显示全部楼层
king@ 发表于 2016-11-19 21:55
电路图不一样。自行修改
#include
#define uchar unsigned char

非常感谢
回复

使用道具 举报

ID:145415 发表于 2016-11-21 09:35 | 显示全部楼层
zl2168 发表于 2016-11-18 11:20
为什么不吸取教训?上次给了你一个程序,还带keil调试,与别人的程序比较,不知你有什么体会?给你学习方法 ...

非常感谢,学生下次一定注意
回复

使用道具 举报

ID:145415 发表于 2016-11-21 09:35 | 显示全部楼层
xht9951 发表于 2016-11-18 12:17
TMOD=0x00;这名句改为 TMOD = 0X01;
TMOE寄存器的低4位是设置T0定时器的工作模式;
59.void timer0()inte ...

非常感谢
回复

使用道具 举报

ID:149144 发表于 2016-11-21 10:17 | 显示全部楼层
定时器没跑吧
回复

使用道具 举报

ID:121114 发表于 2016-12-11 14:29 | 显示全部楼层
解决没有??什么问题
回复

使用道具 举报

ID:150555 发表于 2016-12-11 21:36 | 显示全部楼层
void timer0()interrupt 0    不是0 是1,你好好看看中断级别。
回复

使用道具 举报

ID:155877 发表于 2016-12-19 14:04 | 显示全部楼层
求电路图!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表