本帖最后由 ililililiiiilll 于 2016-12-24 18:12 编辑
TH0=(65536-50000)/256; TL0=(65536-50000)%256; count++; if (count==20) { count=0; b++; if(b==5) {b=0;
以上是中断服务子程序的一部分。 程序是两位数码管显示每秒倒计时,并根据其他按键给出灯位显示的一个关于微波炉的简单仿真。上面的程序为了给微波炉定时而用。按理说上面的程序每次中断为50ms,count计数20次就可以实现一秒了。但实际运行数码管跑得飞快,必须加一个b的五次循环才能基本实现数码管一秒一变,为什么?
附所有程序:
#include <reg52.h>
sbit KEY1=P3^0;
sbit KEY2=P3^1;
sbit KEY3=P3^2;
sbit KEY4=P3^3;
sbit KEY5=P3^6;
sbit led1=P1^4;0
sbit led2=P1^5;
sbit led3=P1^6;
sbit w1=P3^4;
sbit w2=P3^5;
int k;code unsigned char table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //共阳数码管
0-9unsigned char StrTab[2];
unsigned char a1=0,a2=0;
unsigned char flag1,flag2,b;
void Delay(unsigned int del)
{ unsigned int i,j; for(i=0; i<del; i++) for(j=0; j<400; j++) ;}
void Displaypro(unsigned char a1,unsigned char a2){ for(k=0;k<2;k++){switch(k){
case(0): w2=1;w1=0; P2=table[a1];Delay(1);break;
case(1): w2=0; w1=1; P2=table[a2];
Delay(1); break; }
}
}
main()//主函数
{ TMOD=0x10;//定时器0 10ms in 12M crystal 用于计时
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
ET0=1;
TR0=0; //定时器1用于动态扫描
TH1=0xF8;
TL1=0xf0;
ET1=1;
TR1=1;
EA =1;
flag1=1;
flag2=0; Displaypro(a1,a2);while(1)//主循环 { if(flag1==0) led1=0; else led1=1; if(flag1==1) led2=0; else led2=1; if(flag1==2) led3=0; else led3=1;/////////////////////////////////////////////////////////////////
if(!KEY1) //按键1去抖以及动作
//选择档位 { Delay(1); if(!KEY1) { while(!KEY1); flag1++; if(flag1==3) flag1=0; } } if(!KEY2) //按键2去抖以及动作 { Delay(1); if(!KEY2) { while(!KEY2); a1++; if(a1==10) {a1=0; a2++; } // 正常时间 小时 加1
Displaypro(a1,a2); } }/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
if(!KEY3) //按键3去抖以及动作 { Delay(1); if(!KEY3) { while(!KEY3); a1--; if(a1==-1) {a1=9; a2--;} Displaypro(a1,a2); } }/////////////////////////////////////////////////////////////////
if(!KEY4) //按键4去抖以及动作 { Delay(1); if(!KEY4) { while(!KEY4); { TR0=1; Displaypro(a1,a2); } } } } }////////////////////////////////////////////////////////////////
********************************//* 定时中断1 *//********************************/
void time1_isr(void) interrupt 3 using 0//定时器1用来动态扫描{ TH1=0xF8;//重入初值 TL1=0xf0; Displaypro(a1,a2);}//////////////////////////////////////////////////////////////////
/********************************//* 定时中断0 *//********************************/
void tim(void) interrupt 1
using 1{static unsigned char count=0;//定义内部静态变量
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
count++;
if (count==20)
{ count=0;
b++;
if(b==5)
{b=0; a1--;
if(a1==-1)
{ a1=9;
if(a2>0)
a2--; }
if(a1==0&&a2==0)
{ TR0=0;
flag1=4;}
}
}
}
|