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