52单片机不用定时中断如何实现60S秒表功能

如题所述

#include<reg52.h>

sbit AA=P0^7;//数码管显示用IO端口
sbit BB=P0^6;
sbit CC=P0^5;
sbit DD=P0^4;

sbit K1=P3^2;
sbit K2=P3^5;
sbit K3=P3^7;

int s,m;
char table[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,};
void YS(int x); //延迟函数声明
void XS(int d); //显示函数声明

void main()
{
s=m=0;
TMOD=0x01;//设置定时器工作方式
TH0=(65536-1000)/256;//1毫秒
TL0=(65536-1000)%256;//定时器装初始值
EA=1;//开总中断
ET0=1;//开定时器 0 的中断
while(1)
{
XS(s); //显示

if(K1==0){ TR0=1; }//开启定时器,开始计时
if(K2==0){ TR0=0; }//关闭定时器,暂停计时
if(K3==0){ s=m=0; }//清空数据
}
}

void YS(int x) //延迟子函数
{
int y;
for(;x>0;x--)
for(y=100;y>0;y--);
}

void XS(int d) //显示子函数
{
char d1,d2,d3,d4;
d4=d%10; //取个位 %求余
d3=(d/10)%10; //取十位
d2=(d/100)%10;
d1=(d/1000)%10;

P2=table[d4]; AA=0; YS(1); AA=1;//个位显示
P2=table[d3]; BB=0; YS(1); BB=1;//十位显示
P2=table[d2]; CC=0; YS(1); CC=1;//百位显示
P2=table[d1]; DD=0; YS(1); DD=1;//千位显示
}

void timer() interrupt 1 //中断处理子函数
{
TH0=(65536-922)/256;//1毫秒
TL0=(65536-922)%256;

m++;
if(m>=10) //判断定时是否到达1s 即 1000 ms
{ m=0; s++; }

if(s>=9999) //判断定时是否到达1s 即 1000 ms
{ s=0; }
}
绝对可用的,你试试吧,可能我的程序端口与你的不一样,自己改一下就可以了
温馨提示:内容为网友见解,仅供参考
无其他回答
相似回答