新搭了一个系统,用线激光进行实时三维重建,不用每次都判断位置开始拍照,加了两个接近开关,当步进电机向某一方向运行时,利用两个传感器确定需要拍照的时刻,同时通过串行口向电脑发送一个字符,电脑收到这个字符开始拍照。今天先把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