51单片机外部中断+串行口中断

新搭了一个系统,用线激光进行实时三维重建,不用每次都判断位置开始拍照,加了两个接近开关,当步进电机向某一方向运行时,利用两个传感器确定需要拍照的时刻,同时通过串行口向电脑发送一个字符,电脑收到这个字符开始拍照。今天先把keil端的程序弄上来,有时间再把串口通信的程序写一写。程序已经通过运行,如图所示:


利用串口调试工具试了一下完全可以,程序的思路大概就是设置了两个状态标志位flag0和flag1,当通过接近开关1时,p3.2出现下降沿,此时设置flag0=1,当通过接近开关2时,p3.3出现下降沿,此时进入外部中断1,如果满足flag0=1,就设置flag1=1,如果flag1=1,则向串口发送一串字符即可。当然这其中还需要相互制约,保证反方向进入时不会发送数据,具体一看程序就明白了。当然也可以使用外部中断计数器做。



#include <STC12C5A60S2.H>
bit Flag=0; 
bit flag0=0;    //0中断标志
bit flag1=0;    //1中断标志
void SendOneByte(unsigned char c)   
{
SBUF = c;           //把数据送往寄存器
while(!TI);         //等待发送完成TI=0时一直发送,直到TI=1,发送后硬件自动置1
TI = 0;             //发送完成标志
}
void SendString(unsigned char *p)
{
while(*p!='\0')
{SendOneByte(*p++);}
 flag1=0;
 flag0=0;
}


void main(void)
{
//单片机初始化


//通信设置,串行口中断
TMOD = 0x20;
SCON = 0x50;
TH1 = 0xFD;
TL1 = TH1;
PCON = 0x00;
EA = 1;
ES = 1;
TR1 = 1;
//外部中断0
IT0=1;      //外部中断0下降沿触发方式
EX0=1;      //开外部中断0


//开外部中断1
IT1=1;      //外部中断1下降沿触发方式
EX1=1;      //开外部中断1
while(1)
{
while(flag1)
{
SendString("konglingsheng");
while(!Flag); //flag=0一直循环,循环结束flag=1;
Flag=0;
}
}
}
void int0(void) interrupt 0   //外部0中断服务
{
        EX0=0;
        flag1=0;
        flag0 = 1;
        EX0=1;
}
void int1(void) interrupt 2 //外部1中断服务
{    EX1=0;
    if(flag0) //如果0已中断
    {
       flag0=0;
flag1=1;
    }
    else
{
flag1 = 0;
  flag0= 0;
}
EX1=1;
}
void UARTInterrupt(void) interrupt 4  //4号串行中断
{
  RI = 0;                                    //停止接受
  Flag=1;                                     //标志位使循环 

作者:kls 2018.5.28  23:26

猜你喜欢

转载自blog.csdn.net/konglingshneg/article/details/80490129