#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
?} ?
?