📄 celiang.h
字号:
#ifndef CeLiang_Program_
#define CeLiang_Program_
typedef struct times
{ uchar second; //秒级
uint m_second; //毫秒级
}TIME;
data uchar puls_num; //脉冲次数
data uchar flag; //开始计时标志
xdata TIME time[65]; //每次脉冲的时间
data uchar max; //测量总次数
//中断系统初始化
void int0_initial()
{ flag=1;
TMOD = 0x10; // T1使用定时模式,工作模式1,无门控位
TH1 = 0x4C; // 为T1填入初值,定时时间50ms
TL1 = 0x00;
IT0 = 1; // 设置INTR0中断方式为边沿触发方式,负跳变时产生中断
PT1 = 1; // 设置定时器1中断为高优先级
EX0 = 1; // 允许外部中断0中断
EA = 1; // CPU开放中断
}
/* T1溢出中断处理函数 */
void timer1_int() interrupt 3 using 3 //不同级别的中断函数使用不同的工作组
{ TR1=0;
TH1 = 0xFC; // 重新填入初值,每次溢出间隔1ms,1ms初值是0xFC,0x66,
TL1 = 0xA5; // 考虑中断处理的时间,此处作了修正,即每次减少68.3us;
time[puls_num].m_second++; //此修已在Proteus验证得到,在频率介于1-50Hz中,误差低于
TR1=1; //1ms
}
/* 外部中断0处理函数 */
void intr0_int() interrupt 0 using 0 // INTR0中断,使用工作组2
{ TR1=0;
if(flag)
{ flag=0;
TR1=1;
ET1=1;
puls_num=0;
}
EA = 0; // 关中断
if(time[puls_num].m_second>=1000) // 计时满1s
{ time[puls_num].second=time[puls_num].m_second/1000; // 清0
time[puls_num].m_second=time[puls_num].m_second-time[puls_num].second*1000;
// 总秒数增1,溢出时会自动归0
}
puls_num++;
TH1 = 0xFC; // 重新填入初值,每次溢出间隔1ms
TL1 = 0xA8;
EA = 1; // 开中断
TR1=1;
if(puls_num>=max)
{ EA=0;
TR1=0;
}
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -