打印

帮小弟解决个c编程问题,谢了!

[复制链接]
2053|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jony.z|  楼主 | 2010-1-19 23:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
//----------------------------------------------
//程序名:key_smg_2.c
//程序描述:启动时四个数码管全都显示0,当按一下按键(key=0有效),开始累加,直到9999停止,蜂鸣器响,当途中有按键按下则停止累加,再次按下继续。
//编程时间:2010.1.17
//----------------------------------------------

#include<reg52.h>  //包含特殊功能寄存器库
//---定义---------------------------------------
sbit fmq=P3^6;
#define key P1^4;
unsigned char k,ge,shi,bai,qian;
unsigned int i=0;
unsigned char a[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
unsigned char b[4]; //定义b数组,存储每一位数码管上的字符
//---显示延时-----------------------------------
void delaym(unsigned int t)   
{
unsigned char j;        //j=0~255
while(t--)
{
  for(j = 0; j <150; j++);   //j进行的内部循环
}
}
//---主函数-------------------------------------
void  main()
{
TMOD=1;
TH0=(65535-10000)/256;
TL0=(65535-10000)%256;
EA=1;
ET0=1;
TR0=1;
while(1)
{
   for(k=0;k<4;k++)
   {
    P0=b[k];
    P2=k;
    delaym(2);
   
   }
}
}
//---定时---------------------------------------
time0_int(void)  interrupt 1   //中断服务程序
{
  TH0=(65535-10000)/256;
   TL0=(65535-10000)%256;
   i++;
   qian=i/1000;
   bai=i%1000/100;
   shi=i%100/10;
   ge=i%1000;   
    b[3]=a[qian];
    b[2]=a[bai];
    b[1]=a[shi];
    b[0]=a[ge];
    if(i==9999)
    {
     
     while(1)
      {
     fmq=1;
     b[3]=a[10];
   
     b[2]=a[10];
     
     b[1]=a[10];
   
     b[0]=a[10];
   
       }
    }
  
}

小弟初学中断和定时,仿真如上程序,当i加到9999时,并没有在四个数码管上都显示9999,只是在shi位上显示9,并且蜂鸣器没有响,怎么回事?还有如果像我程序描述那样用按键来控制的话,程序该怎么写?多谢高手们指教了!!!

相关帖子

沙发
zgl7903| | 2010-1-20 09:57 | 只看该作者
中断里的while循环什么时候跳出呢?

使用特权

评论回复
板凳
原野之狼| | 2010-1-20 10:06 | 只看该作者
就是呀 中断里怎么还有死循环呢

使用特权

评论回复
地板
xymxym| | 2010-1-20 10:19 | 只看该作者
一方面是死循环,一方面中断里用了那么多除运算和取模运算也不合理,中断里讲求速战速决!

使用特权

评论回复
5
jony.z|  楼主 | 2010-1-20 20:22 | 只看该作者
我是想让i加到9999之后停止在9999,在数码管上显示9999并且蜂鸣器一直响,这在我开始的“程序描述”中有写。呵呵,我也是刚学习中断和定时,也不知道那样写对不对,还请大家给我点指导。还有如果加上按键控制累加的停或者继续,该怎么做?

使用特权

评论回复
6
jony.z|  楼主 | 2010-1-20 23:35 | 只看该作者
弄了一晚上,终于把这个小程序弄好了,是看原野之狼和xymxym的回复后,仔细想了想,在学习板上调试了很多次终于好了,呵呵,第一次写这么长的程序。:L
附程序:大家再给我指导指导。

//----------------------------------------------
//程序名:key_smg_2.c
//程序描述:启动时四个数码管全都显示0,当按一下按键(key=0有效),开始累加,直到9999停止,蜂鸣器响,当途中有按键按下则停止累加,再次按下继续。
//编程者:jony.z
//编程时间:2010.1.20
//----------------------------------------------


#include<reg52.h>  //包含特殊功能寄存器库
//---定义---------------------------------------
sbit fmq=P3^6;
sbit key=P1^4;
unsigned char k,ge,shi,bai,qian;
unsigned int i=0;
unsigned char a[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
unsigned char b[4];        //定义b数组,存储每一位数码管上的字符

//---显示延时-----------------------------------
void delaym(unsigned int t)                
{
        unsigned char j;               //j=0~255
        while(t--)
        {
                for(j = 0; j <150; j++);                        //j进行的内部循环
        }
}

//---主函数-------------------------------------
void  main()
{
while(key==1)
{
        for(k=0;k<4;k++)
        {
                P0=0xc0;
                P2=k;
        }
}
TMOD=1;
TH0=(65535-10000)/256;
TL0=(65535-10000)%256;
EA=1;
ET0=1;
TR0=0;

        while(1)
        {       
                 for(k=0;k<4;k++)
                 {
                  P0=b[k];
                  P2=k;
                  delaym(2);
                  if(key==0)                                   //若按键按下,定时器停止计数
                  TR0=0;
                  if(key==1)                                   //若按键松开,定时器继续计数
                  TR0=1;
                  if(i==9999)                       //--------------------------------------
                          {TR0=0;                                           //当i累加到9999,定时器停止计数,蜂鸣器响,数码管全部显示9
                          while(1)                                   //
                          {                                                   //
                                           for(k=0;k<4;k++)   //
                                        {                                   //
                                                 fmq=0;                   //
                                                 delaym(1);           //
                                                 P0=0x90;           //
                                                 P2=k;                   //
                                                                           //--------------------------------------
                                        }       
                          }
                  }

                 }
        }
}

//---定时---------------------------------------
time0_int(void)  interrupt 1   //中断服务程序
{               
                        TH0=(65535-10000)/256;
                        TL0=(65535-10000)%256;
                        i++;
                        qian=i/1000;
                        bai=i%1000/100;
                        shi=i%100/10;
                        ge=i%1000;           
                         b[3]=a[qian];
                         b[2]=a[bai];
                         b[1]=a[shi];
                         b[0]=a[ge];
                       
               
}

使用特权

评论回复
7
清风致影| | 2010-1-21 09:18 | 只看该作者
中断里只有   
            {    TH0=(65535-10000)/256;
                        TL0=(65535-10000)%256;
                        i++;}
程序就可以了,计算的部分放在中断外

使用特权

评论回复
8
反质子| | 2010-1-21 10:23 | 只看该作者
中断里有个标志位就行了

使用特权

评论回复
9
jony.z|  楼主 | 2010-1-21 20:23 | 只看该作者
多谢7楼和八楼指导!学习了~

使用特权

评论回复
10
t86964988| | 2010-1-23 11:29 | 只看该作者
qian=i/1000;
   bai=i%1000/100;
   shi=i%100/10;
   ge=i%1000;    中的ge=i%10;

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

9

主题

56

帖子

2

粉丝