|
NB的lkc8210大神,又來(lái)打擾你了。∧愕某绦蛴玫绞谴1通信,我試著改成串口2通信,但中斷用的定時(shí)器沒(méi)改,依然用的是定時(shí)器0,
改完編譯無(wú)誤,下載進(jìn)芯片,用Modbus Poll軟件通信連接,通信不通,
檢查,測(cè)試后發(fā)現(xiàn)定時(shí)器0中斷不運(yùn)行,這是什么原因。
難道串口1中斷只能用定時(shí)器0嗎?我改成串口2,也得用定時(shí)器2嗎?這是對(duì)應(yīng)捆綁著的嗎?
請(qǐng)大神有時(shí)間指導(dǎo)指導(dǎo)!!
感謝!
定時(shí)器程序如下(串口1通信時(shí)也用的這個(gè)定時(shí)器0)
Timer.c
#include "Project.h"
UINT8 idata c10ms; //10ms 計(jì)時(shí)
bit b1ms,bt1ms,b10ms,bt10ms,b100ms,bt100ms; //定義定時(shí)標(biāo)志位
//定時(shí)器0初始化
void TimerInit(void)
{
TMOD = (TMOD & 0XF0) | 0X01;//定時(shí)器0模式配置
TH0 = TIMER_HIGHT;//定義初始裝載值
TL0 = TIMER_LOW;//定義初始裝載值
TR0 = 1; //定時(shí)器0開(kāi)始計(jì)時(shí)
ET0 = 1; //使能定時(shí)器0的溢出中斷允許位
}
//定時(shí)處理//timerProc定時(shí)器0回調(diào)函數(shù)
//在C中,static主要定義全局靜態(tài)變量、定義局部靜態(tài)變量、定義靜態(tài)函數(shù)。
void timerProc(void)
{
static UINT8 c200ms;
static UINT8 c1s;
b1ms = 0;
b10ms = 0;
b100ms = 0;
ET0 = 0;//復(fù)位定時(shí)器0溢出中斷允許位
//dwTickCount = dwIntTick;
ET0 = 1;//置位定時(shí)器0溢出中斷允許位
if(bt1ms)
{
bt1ms = 0;
b1ms = 1;
if(receTimeOut>0)//若接收超時(shí)>0
{
receTimeOut--;
if(receTimeOut==0 && receCount>0) //判斷通訊接收是否超時(shí)
{
receCount = 0; //將接收地址偏移寄存器清零
checkoutError = 0;//校驗(yàn)錯(cuò)標(biāo)志位復(fù)位
}
}
}
if(bt100ms)
{
bt100ms = 0;
b100ms = 1;
}
if(bt10ms)//判斷中斷10ms標(biāo)志位是否1
{
bt10ms = 0; //清中斷10ms標(biāo)志位
b10ms = 1;
c200ms++; //200ms計(jì)時(shí)器加1
if(c200ms >= 20) //判斷是否計(jì)時(shí)到200ms
{
c200ms = 0; //清200ms計(jì)時(shí)器
}
c1s++; //1s計(jì)時(shí)器加1
if(c1s >= testRegister[2]) //判斷是否計(jì)時(shí)到1s
{
c1s = 0; //清1s計(jì)時(shí)器
testCoil[0]++;
testRegister[4]++;
// P14 ^= 1;
}
}
}
//定時(shí)器0 1ms 中斷
void timer0IntProc() interrupt 1
{
TL0 = TIMER_LOW;
TH0 = TIMER_HIGHT;
//dwIntTick++;
bt1ms = 1;//設(shè)bt1ms初值=1
c10ms++; //c10ms自+1
if(c10ms >= 10)//如果c10ms>=10
{
c10ms = 0; //把c10ms計(jì)時(shí)器清零
bt10ms = 1;//把bt10ms置1
}
}
|
|