📄 第二方案中断.c
字号:
#include<reg51.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit dula=P2^7;
sbit wela=P2^6; //数码管段,位定义
sbit send=P1^0; //发送端定义
uint count=0,js,L,a,b;
uchar a1,a2,a3;
void display(uchar,uchar,uchar);
void delay(uchar);
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71}; //段码数组
void main()
{
EA=0;
send=0;
delay(100);
TH0=0x1F;
TL0=0xF4; //T0设初值刚好驱动探头
TH1=0x00;
TL1=0x00; //T1计数设初值
TMOD=0x10; //T0为模式0,13位计数; T1为模式1,16位计数
TR0=1; //开启T0
/*TR1=1;*/ //开启T1
EA=1;
ET0=1;
PT0=1; //开启T0中断,并设高优先级
ET1=1; //开启T1中断,用于溢出显示无效
PX1=1; //该不该设?
IT0=1; // 低电平触发方式
EX0=1; //开启外部中断0
IE=0x83;
}
void display(uchar bai,uchar shi,uchar ge) //显示子函数
{
for(;;)
{
dula=1;
P0=table[bai];
dula=0;
wela=1;
P0=0x0d;
wela=0;
delay(1);
dula=1;
P0=table[shi];
dula=0;
wela=1;
P0=0x0b;
wela=0;
delay(1);
dula=1;
P0=table[ge];
dula=0;
wela=1;
P0=0x07;
wela=0;
delay(1);
}
}
void delay(uchar x5ms) //延时5ms子函数
{
for(b=x5ms;b>0;b--)
for(a=532;a>0;a--);
}
void time0_int(void) interrupt 1 //T0溢出中断,P1.0口连续发40KHz脉冲
{
count++;
send=!send;
TH0=0x1F;
TL0=0xF4;
/*if(count==17)
{
count=0;
TR0=0;
ET0=0;
TH0=0x00;
TL0=0x00;
}*/
}
void rec(void) interrupt 0 //外部中断0,接收信号并处理
{
TR0=0;
js=TH0*256+TL0;
if(js<300);
if(js>=300)
{
L=(17*js)/1000;
a1=L/100;
a2=L%100/10;
a3=L%100%10;
display(a1,a2,a3);
}
}
void time1_over(void) interrupt 3 //T1溢出则无效测量,显示FFF
{ ET1=0;
a1=table[15];
a2=table[15];
a3=table[15];
display(a1,a2,a3);
ET1=1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -