历史上的今天
返回首页

历史上的今天

今天是:2025年07月12日(星期六)

正在发生

2018年07月12日 | 51单片机外部中断+串行口中断

2018-07-12 来源:eefocus

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


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



#include
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;                                     //标志位使循环 


推荐阅读

史海拾趣

问答坊 | AI 解惑

只要用金属做箱子,然后将箱子接地,是错误的

屏蔽就是对两个空间区域之间进行金属的隔离,以控制电场、磁场和电磁波由一个区域对另一个区域的感应和辐射。具体讲,就是用屏蔽体将元部件、电路、组合件、电缆或整个系统的干扰源包围起来,防止干扰电磁场向外扩散;用屏蔽体将接收电路、设备或系 ...…

查看全部问答>

【转】说实话:模拟设计可以老但不可以朽

安静的生活不需再起什么波澜,即将进入四十岁不再进入研发黄金时间段,想把自己做过的想过的都留下来,没有什么名利场的事情了,说出来格外轻松。面对目前大部分国内杂志近乎清一色的嵌入系统,单片机和软件的文章,硬件电路尤其是模拟电路设计似乎 ...…

查看全部问答>

wince6用什么开发驱动?

除了写makefile,然后build之外还有吗? 以前5.0可以用evc,pb等工会开发。 vs2005好像没有支持建立驱动的项目选项啊。…

查看全部问答>

如何使用Windows CE开发Web server。最好又实例,谢谢了。

问题如题提供实例者奖1000分。请求帮忙。 可发邮件给我ld.wuxi@yahoo.com.cn…

查看全部问答>

猎头职位:赴美国工程师!月薪五万,咨询13381085719 13381085771刘先生

猎头职位:赴美国工程师!月薪五万,咨询13381085719 13381085771刘先生…

查看全部问答>

软仿与硬仿的差距?

本帖最后由 dontium 于 2015-1-23 13:33 编辑 一段算法 软仿真时间大约160us, JTAG硬件仿真一下子降到3ms 这个差距会由哪些方面引起?谢谢! …

查看全部问答>

ARM+LINUX 中断一定要用驱动在内核完成吗

最近在折腾LINUX 的GPIO中断。用驱程实现了的情形是:1 在驱程里,借用copy_to_user函数,在中断发生时,让一个数值发生变化写回用户态,使得应用程序可以读出这个变化。问题是:这样看起来,好像跟查询没什么区别。以前玩51的时候,情况不是这样的 ...…

查看全部问答>

晒WEBENCH设计的过程+3.3VDSP供电

本帖最后由 nwx8899 于 2014-8-17 13:22 编辑 利用易电源软件工具设计的一个DSP的一个供电系统,,输入电压是直流14-22V,输出3.3V给DSP供电,电源选择3安输出,选择环境温度27摄氏度。轻轻输入几个数据然后点击开始设计了。 不是,还要等待一会 ...…

查看全部问答>

AM335x(TQ335x)学习笔记——挂载Ramdisk

上篇文章中我们已经能够通过u-boot启动内核了,但是没有能够启动成功,从内核的log中可以看出,内核启动失败的原因是没有挂载到root文件系统,本文将使用busybox制作根文件系统并打包成ramdisk供u-boot启动内核使用。(1)制作根文件系统使用busybo ...…

查看全部问答>