標題:
單片機定時器可調(diào)60秒倒計時 將中斷函數(shù)中的判斷寫入主程序,啟動倒計時時間變長?
[打印本頁]
作者:
守望氵
時間:
2017-8-1 11:00
標題:
單片機定時器可調(diào)60秒倒計時 將中斷函數(shù)中的判斷寫入主程序,啟動倒計時時間變長?
新人求解:為什么將中斷函數(shù)中的判斷寫入主程序中,啟動倒計時的時間就變長了。函數(shù)見下:
#include<reg52.h>
//8位共陰數(shù)碼管顯示定義
#define DataPort P0
sbit LATCH1=P2^2;//段鎖存
sbit LATCH2=P2^3;//位鎖存
//定義按鍵
sbit KEY_ADD=P2^4;
sbit KEY_DEC=P2^5;
sbit Key_Star=P2^6;
sbit Key_Stop=P2^7;
unsigned char code DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 顯示段碼值0~9
unsigned char code WeiMa[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分別對應(yīng)相應(yīng)的數(shù)碼管點亮,即位碼
unsigned char y;
void Delay(unsigned int t); //延時函數(shù)聲明
void DelayMs(unsigned int t);
void Display(unsigned char FirstBit,unsigned char Num);
unsigned char TempData[10]; //存儲顯示值的全局變量
/*——————————————
定時器初始化子程序
——————————————*/
void Init_Timer0()
{
TMOD|=0x01;//使用模式1,16位定時器,“|”符號可以在使用多個定時器時不受影響
//TH0=0x00;
//TL0=0x00;
EA=1;//總中斷打開
ET0=1;//定時器中斷打開
TR0=1; //定時器開關(guān)打開
}
/******************************
主函數(shù)
******************************/
main()
{
unsigned char num=60; KEY_ADD=1;
KEY_DEC=1;
Key_Star=1;
Key_Stop=1;
Init_Timer0();
while(1)
{
if(!KEY_ADD)
{ Display(0,2);
if(!KEY_ADD)
{
while(!KEY_ADD)
Display(0,2);
{
if(num<99)
num++;
else
num=0;
}
}
}
if(!KEY_DEC)
{ Display(0,2);
if(!KEY_DEC)
{
while(!KEY_DEC)
Display(0,2);
{
if(num>0)
num--;
else
num=99;
}
}
}
if(!Key_Star)
{
while(num>0)
{ if(y==20)
{
y=0; if(num>0)
num--;
else
num=0;
}
TempData[0]=DuanMa[num/10];
TempData[1]=DuanMa[num%10];
Display(0,2);
}
}
TempData[0]=DuanMa[num/10];
TempData[1]=DuanMa[num%10];
Display(0,2);
}
}
/*************************
延時函數(shù)
*************************/
void DelayUs(unsigned char t)
{
while(t--);
}
void DelayMs(unsigned char t)
{
while(t--)
{
DelayUs(245);
DelayUs(245);
}
}
/*——————————————
定時器中斷子程序
——————————————*/
void Timer_isr() interrupt 1 using 1
{
TH0=(65536-50000)/256;//重新賦值
TL0=(65536-50000)%256;
y++;
}
void Display(unsigned char FirstBit,unsigned char Num)
{
unsigned char i;
for(i=0;i<Num;i++)
{
DataPort=0;
LATCH1=1;
LATCH1=0;
DataPort=WeiMa[i+FirstBit];
LATCH2=1;
LATCH2=0;
DataPort=TempData
;
LATCH1=1;
LATCH1=0;
DelayUs(200);//延時
}
}
作者:
yzwzfyz
時間:
2017-8-2 00:08
如果倒計時是用T中斷做的,應(yīng)當不會有此問題。
作者:
不倒翁.WZT
時間:
2017-8-2 09:05
標題:
RE: 單片機定時器可調(diào)60秒倒計時 將中斷函數(shù)中的判斷寫入主程序,啟動倒計時時間變長?
第一定時器的定時時間是有限的,如果需要很大的定時時間,超出了定時器的額定值,那么就需要用多次定時的辦法來實現(xiàn)。第二是計算方便和應(yīng)用習慣。不但要在主程序中檢測,而且要在大循環(huán)中檢測。因為這個檢測是時時刻刻的,只要定時器處于計時環(huán)節(jié),程序在做其它事情的同時,也要對定時的次數(shù)進行檢測,一旦計時次數(shù)完成,程序馬上進入相應(yīng)的處理工作。
作者:
peterstorm
時間:
2017-8-2 09:19
if(!Key_Star)
{
while(num>0)
{ if(y==20)
{
y=0; if(num>0)
num--;
else
num=0;
}
這里要按鍵后進去??不知道你硬件如何的,按你的代碼里面,一旦Y 不等于20不就一直沒法進去了??
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1