/************************************************************************************
硬體載體:51單片機 P0口共陰極連接8個LED;
撰寫語言:c語言;
目標:1.定時器T0T1精確定時、2.高4位低4位回圈換亮滅,定時器0提供定時、
3.外部中斷0或外部中斷1回應后8個LED逐個點亮,后中斷結束,定時
器1提供定時。
筆記:中斷程式與主程式 count 變數可能發生沖突,若發生沖突嘗試給中斷
定義定時器1 為延時程式。
===================================================
請教問題:當前程式下,外部中斷可正常回應,但回應后定精準定時 定時器1
不能提供定時(定時直接不運行),使用非精準定時可正常運行。
**************************************************************************************/
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit _key0 = P3^2;
sbit _key1 = P3^3;
uint count=0,count_1=0,num=0xf0,valueINT_0,valueINT_1,n;
int i;
int main(void)
{
void Time0_Time1_Init(); //定時器0、1初始化函式宣告
void INT0_INT1_Init(); //外部中斷0、1初始化函式宣告
EA = 1;
Time0_Time1_Init(); //定時器0、1初始化函式呼叫
INT0_INT1_Init(); //外部中斷0、1初始化函式呼叫
_key0 = 1;
_key1 = 1;
while(1)
{
P0 = num;
if(count == 2)
{
count = 0;
num = ~num;
}
}
}
//外部中斷0、1初始化函式
void INT0_INT1_Init()
{
EX0 = 1;
EX1 = 1; //IE = 0x8f;
IT0 = 0;
IT1 = 0;
}
//定時器0、1初始化函式
void Time0_Time1_Init()
{
TMOD = 0x11;
ET0 = 1; //IE = 0x8f;
TR0 = 1;
TH0 = (65535-46079)/256;
TL0 = (65535-46079)%256;
ET1 = 1;
TR1 = 1;
TH1 = (65535-46079)/256;
TL1 = (65535-46079)%256;
}
void _INT0_(void) interrupt 0 using 1
{
valueINT_0 = 0xff;
i = 8;
while(i != 0)
{
P0 = valueINT_0;
if(count_1 == 5)
{
i--;
count_1 = 0;
valueINT_0 = valueINT_0>>1;
}
}
}
void _INT1_(void) interrupt 2 using 1
{
/******************************
i = 0;
while(1)
{
P0 = valueINT_1;
if(count_1 == 5)
{
i++;
count_1 = 0;
valueINT_1 = valueINT_1>>1;
}
if(i==7)
break;
}
********************************/
valueINT_1 = 0xff;
for(i=0;i<8;i++)
{
valueINT_1 = valueINT_1<<1;
P0 = valueINT_1;
for(n=0;n<30000;n++); //非精準定時
}
}
void time0() interrupt 1 using 1
{
TH0 = (65535-46079)/256;
TL0 = (65535-46079)%256;
count++;
}
void time1() interrupt 3 using 1
{
TH1 = (65535-46079)/256;
TL1 = (65535-46079)%256;
count_1++;
}
uj5u.com熱心網友回復:
中斷非搶占的,導致定時終端被延時執行,更嚴重的是丟中斷uj5u.com熱心網友回復:
1. void _INT1_(void) interrupt 2 using 1 里不要用延遲 for(n=0;n<30000;n++);2. 中斷使用 using 個人感覺意義不大
3. 中斷服務程式寫的太啰嗦,最好讓其他操作都移到 main 里去執行
你的邏輯再理一理吧
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/104249.html
標籤:單片機/工控
上一篇:labview 中,我已經一個一個陣列作為Y值,一個均勻的時間間隔作為X值,參照這些資料該怎么才能做出一個XY圖出
