历史上的今天
今天是: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; //标志位使循环
}
上一篇:写了一个 51单片机外部中断程序
下一篇:单片机控制外部中断输入
史海拾趣
|
屏蔽就是对两个空间区域之间进行金属的隔离,以控制电场、磁场和电磁波由一个区域对另一个区域的感应和辐射。具体讲,就是用屏蔽体将元部件、电路、组合件、电缆或整个系统的干扰源包围起来,防止干扰电磁场向外扩散;用屏蔽体将接收电路、设备或系 ...… 查看全部问答> |
|
安静的生活不需再起什么波澜,即将进入四十岁不再进入研发黄金时间段,想把自己做过的想过的都留下来,没有什么名利场的事情了,说出来格外轻松。面对目前大部分国内杂志近乎清一色的嵌入系统,单片机和软件的文章,硬件电路尤其是模拟电路设计似乎 ...… 查看全部问答> |
|
猎头职位:赴美国工程师!月薪五万,咨询13381085719 13381085771刘先生 猎头职位:赴美国工程师!月薪五万,咨询13381085719 13381085771刘先生… 查看全部问答> |
|
最近在折腾LINUX 的GPIO中断。用驱程实现了的情形是:1 在驱程里,借用copy_to_user函数,在中断发生时,让一个数值发生变化写回用户态,使得应用程序可以读出这个变化。问题是:这样看起来,好像跟查询没什么区别。以前玩51的时候,情况不是这样的 ...… 查看全部问答> |
|
本帖最后由 nwx8899 于 2014-8-17 13:22 编辑 利用易电源软件工具设计的一个DSP的一个供电系统,,输入电压是直流14-22V,输出3.3V给DSP供电,电源选择3安输出,选择环境温度27摄氏度。轻轻输入几个数据然后点击开始设计了。 不是,还要等待一会 ...… 查看全部问答> |
|
上篇文章中我们已经能够通过u-boot启动内核了,但是没有能够启动成功,从内核的log中可以看出,内核启动失败的原因是没有挂载到root文件系统,本文将使用busybox制作根文件系统并打包成ramdisk供u-boot启动内核使用。(1)制作根文件系统使用busybo ...… 查看全部问答> |




