下面的程序有错怎么查表显示数码管0到9啊

发布时间:2019-08-09 15:03:08

#include <reg51.h>

#define uint8 unsigned char

#define uint16 unsigned int

#define TIMER0_HIGHT 0xDC      //设置定时器0工作方式1自动装载初值,定时10ms,Fosc=11.059200MHZ

#define TIMER0_LOW 0x00

sbit keyin = P3^1;       //按键输入

bit starttest;    //启动测脉搏标志

uint16 cnt10ms;    //10ms计数器

uint8 cnt1s;    //1秒计数器

uint8 Pulsecnt;      //脉搏次数,计数器

uint8 Pulsenum;     //上次测试脉搏的次数

uint8 code DispCode[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//共阳数码管段码表

void Init_Extint(void);

void TimerInitProc();

void initvar();

void Init_System(void);

void Display(uint8 chose_dat, uint8 dat);

void ShowDisp(uint8 tPulsenum, uint8 tPulsecnt, uint8tcnt1s);

void DelayMs(uint8 Ms);

void main()

{

      Init_System();       //初始化

      while(1)

      {

             ShowDisp(Pulsenum,Pulsecnt, cnt1s);     //显示

      }

}

/*******************************************************************************

* 函 数 名: Exti0_interrupt

* 函数功能: INT0引脚下降沿进入中断

* 入口参数: 无

* 返    回: 无

*******************************************************************************/

void Ext0_interrupt(void) interrupt 0

{

      if(starttest== 1)           //处在测试状态

      {

             Pulsecnt++;   //来一次中断脉搏计数器加1

      }

}

/********************************************************************

函数功能:定时器/计数器0中断处理

入口参数:null

返   回:null

备   注:null

********************************************************************/

void Timer0IntProc() interrupt 1

{

      TH0 =TIMER0_HIGHT;  //设置定时器0高字节初值

      TL0 =TIMER0_LOW;      //设置定时器0低字节初值

      if(++cnt10ms== 100) //1s计时到

      {

             cnt10ms= 0;

             if(starttest== 1)           //处在测试状态

             {

                    if(++cnt1s== 60) //一分钟时间到

                    {

                           starttest= 0;  //一次检测完毕,等待下一次检测

                           Pulsenum= Pulsecnt;   //保存测得脉搏值

                    }

             }

      }

      if(keyin== 0)       //检测按键

      {

             if(starttest== 1)    //处在测试状态

             {

                    cnt10ms= 0;        //复位测试值,重新开始测试

                    cnt1s= 0;

                    Pulsecnt= 0;

             }

             else                      //不在测试状态,开始新的一次测试

             {

                    starttest= 1;

                    cnt10ms= 0;

             }

      }

}

/////////////////////////End ofTimer0IntProc////////////////////////

void Init_Extint(void)

{

   IT0 =1;    //外部中断1设置为下降沿触发

   IE0 =0;    //标志位清0

   EX0 =1;    //允许外部中断1

}

/********************************************************************

函数功能:定时器/计数器初始化

入口参数:null

返   回:null

备   注:null

********************************************************************/

void TimerInitProc()

{

      TMOD&= 0xF0;

      TMOD |=0x01;          //设置定时器0,方式1:16位定时器

      TH0 =TIMER0_HIGHT;  //设置定时器0高字节初值

      TL0 =TIMER0_LOW;      //设置定时器0低字节初值

      TR0 = 1;                     //启动定时器0

   ET0 = 1;                    //开定时器0中断

      EA =1;              //开总中断

}

/////////////////////////End of TimerInitProc////////////////////////

void initvar()

{

      starttest= 0;

      cnt10ms =0;

      cnt1s = 0;

      Pulsecnt =0;

      Pulsenum =0;

}

void Init_System(void)

{

  Init_Extint();

  TimerInitProc();

      initvar();

}

/******************************************************************************

* 函 数 名: Display(uchar chose_dat,uchar dat)

* 函数功能: 数码管显示

* 入口参数: chose_dat数码管显示字位,dat显示字型

* 返    回: 无

*******************************************************************************/

void Display(uint8 chose_dat, uint8 dat)

{

   P0 = dat;               //送显示字型

      P2 = ~(0x01<<chose_dat);//送显示字位

  DelayMs(1);             //延时1MS

      P2 =0xFF;              //关闭显示

}

void ShowDisp(uint8 tPulsenum, uint8 tPulsecnt, uint8tcnt1s)

{

      Display(6,DispCode[tPulsenum%10]);    //显示上次测量的脉搏

      tPulsenum= tPulsenum/10;

      Display(7,DispCode[tPulsenum%10]);

      Display(3,DispCode[tPulsecnt%10]);    //显示测试中的脉搏

      tPulsecnt= tPulsecnt/10;

      Display(4,DispCode[tPulsecnt%10]);

      Display(0,DispCode[tcnt1s%10]);    //显示测试中的时间

      tcnt1s =tcnt1s/10;

      Display(1,DispCode[tcnt1s%10]);

}

/********************************************************************

函数功能:延时ms

入口参数:MS

返   回:null

备   注:null

********************************************************************/

void DelayMs(uint8 Ms)

{

   unsignedchar i,j;

   do

   {

      for(i=5;i>0;i--)

      for(j=98;j>0;j--);

  }while(--Ms);

      //Test for12M

}

///////////////////////////End ofDelayMs////////////////////////////


推荐回答

还没有选出推荐答案,请稍候访问或查看其他回答!
以上问题属网友观点,不代表本站立场,仅供参考!