📄 celiang.c
字号:
#include <regX51.H>
#define _MHZ_ 11.0592 // 设置单片机使用的晶振频率
typedef unsigned char uchar;
typedef struct time
{ uchar second; //秒级
uchar m_second; //50毫秒级
uchar mm_second_1; //计数器高8位,12/_MHZ_秒级
uchar mm_second_2; //计数器低8位
long sum; //时间
}TIME;
uchar puls_num; //脉冲次数
uchar flag; //开始计时标志
TIME time[65]; //每次脉冲的时间
void main()
{ flag=1;
/* 定时、中断初始化 */
TMOD = 0x10; // T1使用定时模式,工作模式1,无门控位
TH1 = 0x4C; // 为T1填入初值,定时时间50ms
TL1 = 0x00;
IT0 = 1; // 设置INTR0中断方式为边沿触发方式,负跳变时产生中断
PT1 = 1; // 设置定时器1中断为高优先级
EX1 = 1; // 允许外部中断0中断
EA = 1; // CPU开放中断
while(1); // 循环等待
}
/* T1溢出中断处理函数 */
void timer1_int() interrupt 3 using 3 //不同级别的中断函数使用不同的工作组
{ TH1 = 0x4C; // 重新填入初值,每次溢出间隔50ms
TL1 = 0x00;
time[puls_num].m_second++;
if(time[puls_num].m_second==20) // 计时满1s
{ time[puls_num].m_second=0; // 清0
time[puls_num].second++; // 总秒数增1,溢出时会自动归0
}
}
/* 外部中断0处理函数 */
void intr0_int() interrupt 0 using 2 // INTR0中断,使用工作组2
{ unsigned char tmp1,tmp2;
if(flag)
{ flag=0;
TR1=1;
ET1=1;
}
puls_num++;
EA = 0; // 关中断
do // 读取T1中的内容
{ tmp1 = TH1;
tmp2 = TL1;
}while(tmp1 != TH1); // 数据无效则反复循环
time[puls_num].mm_second_1=tmp1; //在这里不进行时间处理,减少中断处理时间
time[puls_num].mm_second_2=tmp2;
EA = 1; // 开中断
if(puls_num==64)
{ EA=0;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -