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
}
}
|