stc12c5604ad T0中斷與串口不能同時(shí)使用,求高人分析。
程序結(jié)構(gòu)為時(shí)間片輪轉(zhuǎn)方式,5ms一個(gè)中斷,中斷里刷數(shù)碼管。
在程序進(jìn)入串口前P13設(shè)高電位,完成串口程序后P13設(shè)低電位
,用邏輯分析儀捕捉P13口后看高電位寬度寬達(dá)7ms,這是不正常的,也就
是說(shuō)發(fā)送一字節(jié)用了7ms時(shí)間
把T0中斷屏蔽了用大循環(huán)方式串口就正常了,串口發(fā)送一字節(jié)數(shù)據(jù)也就1ms不到,
如下代碼,是大概樣子
void Ini_Timer0(void) //5ms中斷
{
TMOD &= 0xF0; //設(shè)置定時(shí)器模式
TMOD |= 0x01; //設(shè)置定時(shí)器模式
TL0 = 0x00; //設(shè)置定時(shí)初值
TH0 = 0x28; //設(shè)置定時(shí)初值
TF0 = 0; //清除TF0標(biāo)志TR0 = 1;
EA = 1;
ET0 = 1;
TR0 = 1;
}
//串口初始化
void InitUART(void) //9600bps 11.0592mhz
{
TMOD |= 0x20;
SCON = 0x40;
TH1 = 0xDC;
TL1 = TH1;
PCON = 0x00;
TR1 = 1;
}
//串口發(fā)送一位數(shù)據(jù)
void SendOneByte(u8 c)
{
SBUF = c;
while(!TI);
TI = 0;
}
void Timer0() interrupt 1
{
P14 = 1; //中斷開(kāi)始測(cè)試
TL1 = 0x00; //設(shè)置定時(shí)初值
TH1 = 0x00; //設(shè)置定時(shí)初值
if(work_count1)work_count1--; //每節(jié)拍對(duì)任務(wù)延時(shí)變量減1,減至0后,任務(wù)就緒。
if(work_count2)work_count2--;
if(work_count3)work_count3--;
if(++weicon>3) weicon=0; //顯示位置輪流,需要嚴(yán)格限制范圍為0-7
P2=0; //關(guān)段碼顯示 74LS245
switch(weicon)
{
case 0: //第1位顯示內(nèi)容
P2=LED_tab[bai]; //顯示內(nèi)容 74ls245
P17=0;P15=0;P16=1; //位選 74lLS138
break;
case 1: //第2位顯示內(nèi)容
P2=LED_tab[shi]; //顯示內(nèi)容
P17=1;P15=0;P16=1; //位選
break;
case 2: //第3位顯示內(nèi)容
P2=LED_tab[ge]; //顯示內(nèi)容
P20=1; //在各位上顯示小數(shù)點(diǎn)
P17=0; P15=1;P16=1; //位選
break;
case 3: //第4位顯示內(nèi)容
P2=LED_tab[xiaoshu]; //顯示內(nèi)容
P17=1; P15=1;P16=1; //位選
break;
default:break;
}
P14=0; //中斷結(jié)束測(cè)試端
}
void main(void)
{
P2=0; //關(guān)顯示
P17=1; //數(shù)碼管74ls138位選
P15=1; //
P16=1; //
P14=0; //測(cè)試端口
P13=0; //測(cè)試端口
P12=0; //測(cè)試端口
P11=0; //測(cè)試端口
AUXR = AUXR|0x80; // T0, 1T Mode
AUXR = AUXR|0x40; // T1, 1T Mode
convert_T(); //開(kāi)機(jī)先轉(zhuǎn)換一次溫度
Ini_Timer0(); //初始化定時(shí)器0
InitUART();
while(1)
{ P12=1;
convert_T(); //啟動(dòng)溫度轉(zhuǎn)換
if(work_count2++==)
{ P13=1;
SendOneByte(temp>>4); //發(fā)送串口
work_count2=0;
P13=0;
}
if(work_count1++==100)
{
P14=1;
read_T(); //讀轉(zhuǎn)換溫度數(shù)字
P14=0;
}
work_temp(temp); //處理溫度數(shù)據(jù)
P12=0;
}
}
|