爱问知识人 爱问教育 医院库

一个简单的单片机程序问题

首页

一个简单的单片机程序问题

函数功能:用LED灯数码管显示计数器对T0的计数值。

#include<reg52.h>  
unsigned char x;
unsigned char s[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
sbit P34=P3^4;

delay1ms(int i)   //1秒基准延时函数
{
int j;
while(i--)
{for(j=0;j<115;j++);}
}

void display(unsigned char x)
{
P2=0xef;
P0=s[x/1000];
delay1ms(5);

P2=0xdf;
P0=s[x%1000/100];
delay1ms(5);

P2=0xbf;
P0=s[x%1000%100/10];
delay1ms(5);

P2=0x7f;
P0=s[x%1000%100%10];
delay1ms(5);
}


void main(void)
{
TMOD=0x06;//TMOD=000 0110B
EA=1;  //开放总中断
ET0=1;  //允许定时器T0的中断
EX0=1;//允许外中断INT0
IT0=1;//INT0为下负脉冲触发方式(TCON的,处理外部中断)
TR0=1;//启动T0(TCON的处理定时器工作的)
TH0=TL0=256-1;//计数器T0高8位赋初值25566
while(1)
{
//x=TL0;
display(x);      
}


}

//INT0终端函数(中断服务函数)
void clear()   interrupt 0
{
x=0;          
}

//T0 计数器中断     ()
 void Key_counter() interrupt 1
 {
   if(P34==0)
   {
      delay1ms(20);
      if(P34==0)
        {
           x=(x+1)%10000;  //因为是4位数码管显示 所以要把计的数控制在10000以内(000~999)
        }
   }
 }


有几个小问题:
1.这个程序执行的流程可以大致说一下吗?
2.在主函数的while里面,为什么要把x=TL0注释掉?
3.void clear() interrupt 0里面的x=0;可以理解为对x赋初值吗?

谢谢!

提交回答
好评回答
  • 2011-07-28 08:32:45
    1 大致分为3 个模块,显示函数,中断,主函数,流程如下:首先进入主函数,打开计数器开关和外部中断开关,然后进入中断服务函数,开始计数.
    2,在while(),只需显示就可以了,因为在中断中已经对x计数赋值了,所以不需要了
    3.可以那样理解,不过最好说成清零,因为在keil c 中默认初值为0,如果你不对其进行赋值的话.
    不知道是你自己写的程序不?主函数里面最好不要放中断设置,放到初始化函数中,这样就显得有条理了.我也是学单片机的,大家共同交流

    2***

    2011-07-28 08:32:45

类似问题

换一换

相关推荐

正在加载...
最新问答 推荐信息 热门专题 热点推荐
  • 1-20
  • 21-40
  • 41-60
  • 61-80
  • 81-100
  • 101-120
  • 121-140
  • 141-160
  • 161-180
  • 181-200
  • 1-20
  • 21-40
  • 41-60
  • 61-80
  • 81-100
  • 101-120
  • 121-140
  • 141-160
  • 161-180
  • 181-200
  • 1-20
  • 21-40
  • 41-60
  • 61-80
  • 81-100
  • 101-120
  • 121-140
  • 141-160
  • 161-180
  • 181-200
  • 1-20
  • 21-40
  • 41-60
  • 61-80
  • 81-100
  • 101-120
  • 121-140
  • 141-160
  • 161-180
  • 181-200

热点检索

  • 1-20
  • 21-40
  • 41-60
  • 61-80
  • 81-100
  • 101-120
  • 121-140
  • 141-160
  • 161-180
  • 181-200
返回
顶部
帮助 意见
反馈

确定举报此问题

举报原因(必选):