单片机秒表程序 100
要求:0~59.99秒精度0.01秒有两个按键K1、K2,K1控制暂停、继续,K2控制清零。求高手帮忙编个程序。...
要求:0~59.99秒 精度0.01秒 有两个按键K1、K2,K1控制暂停、继续,K2控制清零。求高手帮忙编个程序。
展开
展开全部
下面是程序,刚刚调试成功;给我邮箱,打包发你。带仿真图
#include<reg51.h>
//unsigned char code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
unsigned char code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,
0x3f,0xbf,0xff,0x7f,0xbf};
unsigned char buf[4]={0,0,0,0};
unsigned char ss[4]={0x01,0x02,0x04,0x08};
//sbit p20=P2^0;
//sbit p21=P2^1;
sbit k0=P2^5;//定时计数器开始 暂停
sbit k1=P2^6;//定时计数器清零
unsigned int count1=0;
unsigned char n=0;
void delay(void)//延时20ms
{
unsigned char i,k;
for(i=5;i>0;i--)
for(k=200;k>0;k--);
}
void disp(void)//显示计时器内容
{
unsigned char i,num;
for(i=0;i<=3;i++)
{
P2=ss[i];
num=buf[i];
P1=tab[num];
delay();
}
}
void key0(void)//k0判断及相应处理
{
k0=1;
if(k0==0)
{disp();disp();
k0=1;
if(k0==0)
{
if(TR0==0)
{TR0=1;}//启动定时/计数器0 中断
else{TR0=0;}
}
}
k0=1;//判断按键是否松开
while(k0==0)
{
disp(); k0=1;//等待
}
}
void key1(void)//k1判断及相应处理因为
{
k1=1;
if(k1==0)
{disp(); disp();
k1=1; //因为unsigned char ss[2]={0x01,0x02}时p25,p26都被清零,所以在判断k之前使k=1;
if(k1==0)
{
if(TR0==0)
{count1=0;}
}
}
}
void int_t0(void)interrupt 1 using 1//定时/计时器中断,定时10MS
{
TH0=0xd8;
TL0=0xf0;
// n++;
// while(n==1)
// {
// n=0;
count1++;
if(count1 == 5999)
{
count1=5999;TR0=0;
}
}
void disp_time(void) //显示时间(时分秒分别送相应buf)
{
buf[0]=((count1%1000)%100)%10;
buf[1]=((count1%1000)%100)/10;
buf[2]=(count1%1000)/100+10;
buf[3]=count1/1000;
// times();
disp();
}
void main(void)
{ //中断设置
TMOD=0x01;//定时计数器初始化
TH0=0xD8;
TL0=0xF0;//初始值
IE=0x82;//开总中断/允许定时/计数器0 中断
// TR0=1;
while(1)
{
key0();
key1();
disp_time();
}//重复调用相应函数
}
#include<reg51.h>
//unsigned char code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
unsigned char code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,
0x3f,0xbf,0xff,0x7f,0xbf};
unsigned char buf[4]={0,0,0,0};
unsigned char ss[4]={0x01,0x02,0x04,0x08};
//sbit p20=P2^0;
//sbit p21=P2^1;
sbit k0=P2^5;//定时计数器开始 暂停
sbit k1=P2^6;//定时计数器清零
unsigned int count1=0;
unsigned char n=0;
void delay(void)//延时20ms
{
unsigned char i,k;
for(i=5;i>0;i--)
for(k=200;k>0;k--);
}
void disp(void)//显示计时器内容
{
unsigned char i,num;
for(i=0;i<=3;i++)
{
P2=ss[i];
num=buf[i];
P1=tab[num];
delay();
}
}
void key0(void)//k0判断及相应处理
{
k0=1;
if(k0==0)
{disp();disp();
k0=1;
if(k0==0)
{
if(TR0==0)
{TR0=1;}//启动定时/计数器0 中断
else{TR0=0;}
}
}
k0=1;//判断按键是否松开
while(k0==0)
{
disp(); k0=1;//等待
}
}
void key1(void)//k1判断及相应处理因为
{
k1=1;
if(k1==0)
{disp(); disp();
k1=1; //因为unsigned char ss[2]={0x01,0x02}时p25,p26都被清零,所以在判断k之前使k=1;
if(k1==0)
{
if(TR0==0)
{count1=0;}
}
}
}
void int_t0(void)interrupt 1 using 1//定时/计时器中断,定时10MS
{
TH0=0xd8;
TL0=0xf0;
// n++;
// while(n==1)
// {
// n=0;
count1++;
if(count1 == 5999)
{
count1=5999;TR0=0;
}
}
void disp_time(void) //显示时间(时分秒分别送相应buf)
{
buf[0]=((count1%1000)%100)%10;
buf[1]=((count1%1000)%100)/10;
buf[2]=(count1%1000)/100+10;
buf[3]=count1/1000;
// times();
disp();
}
void main(void)
{ //中断设置
TMOD=0x01;//定时计数器初始化
TH0=0xD8;
TL0=0xF0;//初始值
IE=0x82;//开总中断/允许定时/计数器0 中断
// TR0=1;
while(1)
{
key0();
key1();
disp_time();
}//重复调用相应函数
}
追问
270101680@qq.com 谢了!
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询