秒表显示

[复制链接]
393|10
手机看帖
扫描二维码
随时随地手机跟帖
spark周|  楼主 | 2018-4-12 15:09 | 显示全部楼层 |阅读模式
下面是秒表显示程序:
#include<reg51.h>
//
包含51单片机寄存器定义的头文件
unsigned char code Tab[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

//数码管显示0~9的段码表
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将定时器关闭呢?

相关帖子

午夜粪车| | 2018-4-12 15:13 | 显示全部楼层

是啊,那还能计数了吗?

使用特权

评论回复
jiahy| | 2018-4-12 15:16 | 显示全部楼层

就是要它不计数啊。

等你把定时器中断里德事情做完了,才让它再开始计数啊。

使用特权

评论回复
zhaoxqi| | 2018-4-12 15:26 | 显示全部楼层
感觉你学单片机不注重实操,是不是只看程序不动手的啊?这样学单片机很吃力.

使用特权

评论回复
dengdc| | 2018-4-12 15:29 | 显示全部楼层
不要用using  另外你的注释怎么在语句的下面啊 似乎和一般人不一样吧

使用特权

评论回复
zhenykun| | 2018-4-12 15:33 | 显示全部楼层
进中断后,不用再记数了,需要把中断中的事情做完,才能重新记数.

使用特权

评论回复
zhenykun| | 2018-4-12 15:33 | 显示全部楼层
进中断后,不用再记数了,需要把中断中的事情做完,才能重新记数.

使用特权

评论回复
heweibig| | 2018-4-12 15:36 | 显示全部楼层

不加TR0 = 0;计时更准

使用特权

评论回复
wuhany| | 2018-4-12 15:38 | 显示全部楼层

看得出LZ用的是11.0592MHz的晶振,单片机也是12分频的老51
那么初始化时应该TH = 0x4C;

TL = 0x00;
复制代码每次中断重载定时值时只重载TH,即
TH = 0x4C;
// TL不用管
如果我写的话,初始化完毕后中断ISR也就如此而已:    void Timer0_ISR(void) interrupt 1

    {  

        TH0 = 0x4C;

        l_SysTimer_TimeBaseTriggered = 1;

    }
复制代码具体主循环内才对l_SysTimer_TimeBaseTriggered进行处理

使用特权

评论回复
shimx| | 2018-4-12 15:43 | 显示全部楼层

等中断中的事情处理完再计数

使用特权

评论回复
spark周|  楼主 | 2018-4-12 15:46 | 显示全部楼层
嗯,了解了

使用特权

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

本版积分规则

821

主题

10121

帖子

4

粉丝