找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

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

查看数: 13229 | 评论数: 19 | 收藏 0
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2016-11-17 22:04

正文摘要:

#include<reg52.h> #define uchar unsigned char #define uint unsigned int sbit dula=P2^6; sbit wela=P2^7; uchar num,b,count; uint flag=0; uint bai=0,shi=0,ge=0; uint xms; void delayms(uint); void di ...

回复

ID:155877 发表于 2016-12-19 14:04
求电路图!
ID:150555 发表于 2016-12-11 21:36
void timer0()interrupt 0    不是0 是1,你好好看看中断级别。
ID:121114 发表于 2016-12-11 14:29
解决没有??什么问题
ID:149144 发表于 2016-11-21 10:17
定时器没跑吧
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:145415 发表于 2016-11-21 09:35
zl2168 发表于 2016-11-18 11:20
为什么不吸取教训?上次给了你一个程序,还带keil调试,与别人的程序比较,不知你有什么体会?给你学习方法 ...

非常感谢,学生下次一定注意
ID:145415 发表于 2016-11-21 09:34
king@ 发表于 2016-11-19 21:55
电路图不一样。自行修改
#include
#define uchar unsigned char

非常感谢
ID:111634 发表于 2016-11-21 09:20
先学学正确的东西。
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:148930 发表于 2016-11-19 23:43
看了一下你的板子好像是天祥的。我只觉得你一个地方有问题,天祥的书里不是也说了嘛,中断函数里少放东西,尽量把计算和赋值提到外面来
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:102056 发表于 2016-11-18 23:36
第一个是跳转到中断那里应该写,interrupt 1     第二个是每次显示数码管最好是先写消隐   ,第三是写完段码显示就不要段码控制为0,不然就显示动不了,延时时间太长。最后一个中断控制里计算个,十,百,最好提到主函数里,不然1秒计数就会产生很大的误差。
ID:140371 发表于 2016-11-18 18:56
wuyibin2003 发表于 2016-11-18 08:39
两种可能 一是可能数据传递不成功  二是 定时器没有计数

中斷編號有誤。延時過長。
ID:148624 发表于 2016-11-18 12:48
你程序里面数字变化的量num都没有看到有变化的地方,肯定一直是000啊
ID:148310 发表于 2016-11-18 12:19
忘说了,我也是初学者,希望高手 不要喷我,谢谢~
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:111634 发表于 2016-11-18 11:25
为什么有人学得快、学的好,有人学得慢、学的差?除了悟性、勤奋外,学习方法不好是一个重要原因!
ID:111634 发表于 2016-11-18 11:20
本帖最后由 zl2168 于 2016-11-18 11:22 编辑

为什么不吸取教训?上次给了你一个程序,还带keil调试,与别人的程序比较,不知你有什么体会?给你学习方法的建议有什么感想?不学理论,盲目实践,不是事倍功半,就是知其然,不知其所以然。
ID:138155 发表于 2016-11-18 08:39
两种可能 一是可能数据传递不成功  二是 定时器没有计数

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

Powered by 单片机教程网

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