c语言解答

[复制链接]
3620|10
 楼主| 717665524qqcom 发表于 2010-9-25 14:24 | 显示全部楼层 |阅读模式
下面是秒表显示程序:
#include<reg51.h>
//
包含51单片机寄存器定义的头文件

unsigned char code Tab[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

//
数码管显示09的段码表

unsigned char int_time;
//
记录中断次数

unsigned char second;
//
储存秒

/***********************************************************************
函数功能:快速动态扫描延时,延时约0.6毫秒
************************************************************************/
void delay(void)
{

unsigned char i;


for(i=0;i<200;i++)


;

}
/***********************************************************************
函数功能:显示秒
入口参数:k
出口参数:无
************************************************************************/

void DisplaySecond(unsigned char k)

{



P2=0xfb;
//P2.6
引脚输出低电平, DS6点亮


P0=Tab[k/10];
//
显示十位


delay();



P2=0xf7;
//P2.7
引脚输出低电平, DS7点亮


P0=Tab[k%10];
//
显示个位


delay();

       P2=0xff;
//
关闭所有数码管




}

void main(void)
//
主函数


{



TMOD=0x01;
//
使用定时器T0



TH0=(65536-46083)/256;
//
将定时器计时时间设定为46083×1.085微秒

//=50000微秒=50毫秒


TL0=(65536-46083)%256;


EA=1;
//
开启总中断


ET0=1;
//
定时器T0中断允许


TR0=1;

//
启动定时器T0开始运行


int_time=0;
//
中断次数初始化


second=0;

//
秒初始化


while(1)


{



DisplaySecond(second);
//
调用秒的显示子程序



}


}

//********************************************************
//函数功能:定时器T0的中断服务程序
//*******************************************************

void interserve(void ) interrupt 1 using 1


{


TR0=0;
//
关闭定时器T0


int_time ++;
//
每来一次中断,中断次数int_time自加1



if(int_time==20)
//
20次中断,1秒钟进行一次检测结果采样



{


int_time=0;
//
中断次数清0



second++;

//
秒加1



if(second==60)



second =0; //
秒等于60就返回0



}




TH0=(65536-46083)/256;
//
重新给计数器T0赋初值


TL0=(65536-46083)%256;


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


}


为什么在这个秒表显示,函数void interserve(void ) interrupt 1 using 1 中为什么要先TR0=0将定时器关闭呢???那还能计数了吗???不明白
 楼主| 717665524qqcom 发表于 2010-9-25 15:07 | 显示全部楼层
我的问题在最下边
datouyuan 发表于 2010-9-25 16:03 | 显示全部楼层
就是要它不计数啊。

等你把定时器中断里德事情做完了,才让它再开始计数啊。
cch21洪 发表于 2010-9-25 16:28 | 显示全部楼层
感觉你学单片机不注重实操,是不是只看程序不动手的啊?这样学单片机很吃力.
bhsdlmj 发表于 2010-9-25 20:33 | 显示全部楼层
不要用using  另外你的注释怎么在语句的下面啊 似乎和一般人不一样吧
entepino 发表于 2010-9-25 23:04 | 显示全部楼层
进中断后,不用再记数了,需要把中断中的事情做完,才能重新记数.
EE歪歪 发表于 2010-9-26 15:36 | 显示全部楼层
不去掉,计时更准
EE歪歪 发表于 2010-9-26 15:37 | 显示全部楼层
说错了,是不加TR0 = 0;计时更准
yao1314520shi 发表于 2010-9-27 15:58 | 显示全部楼层
新来的,看热闹
zq1987731 发表于 2010-9-27 16:34 | 显示全部楼层
看得出LZ用的是11.0592MHz的晶振,单片机也是12分频的老51
那么初始化时应该
  1. TH = 0x4C;
  2. TL = 0x00;
每次中断重载定时值时只重载TH,即
TH = 0x4C;
// TL不用管

如果我写的话,初始化完毕后中断ISR也就如此而已:
  1.     void Timer0_ISR(void) interrupt 1
  2.     {  
  3.         TH0 = 0x4C;
  4.         l_SysTimer_TimeBaseTriggered = 1;
  5.     }
具体主循环内才对l_SysTimer_TimeBaseTriggered进行处理
zq1987731 发表于 2010-9-27 16:55 | 显示全部楼层
下面贴个详细点的片段
  1. /* Public constants ----------------------------------------------------------------------------------------------------------*/  
  2.     #define SYSTEM_OSC_FREQUENCY        11059200UL  
  3.     // System time-base(Weak real-time tasks) in ms
  4.     #define SYSTEM_TIME_BASE        5
  5.    
  6. /* Public macro --------------------------------------------------------------------------------------------------------------*/
  7.     #if ((65536UL - (SYSTEM_OSC_FREQUENCY * SYSTEM_TIME_BASE / 1000UL) / 12UL) & 0x00FF)
  8.         #define _INTEGER_OSC_FREQUENCY
  9.     #endif

  10. #define TIMER_PERLOAD_HIGH  ((UINT8)(((UINT16)(65536UL - (SYSTEM_OSC_FREQUENCY * SYSTEM_TIME_BASE / 1000UL) / 12UL)) >> 8))
  11.     #define TIMER_PERLOAD_LOW   ((UINT8)(((UINT16)(65536UL - (SYSTEM_OSC_FREQUENCY * SYSTEM_TIME_BASE / 1000UL) / 12UL))))

  12. /*******************************************************************************************************************************
  13. * Function Name : SysTimer_Init
  14. * Description   : Initialize the system time(T0 work in Mode 1 and 16-bit)
  15. * Parameter     :
  16. * Return        :
  17. * Notes         :
  18. *******************************************************************************************************************************/
  19.     void SysTimer_Init(void)
  20.     {      
  21.         TMOD |= 0x01;                           
  22.         TH0 = TIMER_PERLOAD_HIGH;
  23.     #ifdef _INTEGER_OSC_FREQUENCY
  24.         TL0 = TIMER_PERLOAD_LOW;
  25.     #else
  26.         TL0 = 0x00;
  27.     #endif
  28.         ET0 = 1;
  29.         TR0 = 1;                             
  30.     }

  31. /*******************************************************************************************************************************
  32. * Function Name : Timer0_ISR
  33. * Description   : Timer 0 Interrupt service routine
  34. * Parameter     :
  35. * Return        :
  36. * Notes         :
  37. *******************************************************************************************************************************/
  38.     void Timer0_ISR(void) interrupt 1
  39.     {
  40.     #ifdef _INTEGER_OSC_FREQUENCY
  41.         TL0 = TIMER_PERLOAD_LOW;
  42.     #endif   
  43.         TH0 = TIMER_PERLOAD_HIGH;
  44.         l_SysTimer_TimeBaseTriggered = 1;
  45.     }
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

125

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部