求单片机实验的外部中断实验的程序

求单片机实验的外部中断实验的程序,第1张

#include<reg51h>

#include<intrinsh>

#define uchar unsigned char

uchar cnt,times;

void delay()

{

uchar i;

TMOD=0x01;

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

TR0=1;

for(i=0;i<times;i++)

{

while(TF0==0);

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

TF0=0;

}

TR0=0;

}

void ext0() interrupt 0

{

uchar i,j;

P1=0xfe;

times=8;

for(i=0;i<5;i++)

{

for(j=0;j<8;j++)

{

P1=_crol_(P1,1);

delay();

}

}

}

void ext1() interrupt 2

{

uchar i,j;

P1=0x7f;

times=12;

for(i=0;i<3;i++)

{

for(j=0;j<8;j++)

{

P1=_cror_(P1,1);

delay();

}

}

}

main()

{

EX0=1;

EX1=1;

IT0=0;

IT1=1;

PX0=0;

PX1=1;

while(1);

}

首先你要知道,UART不是与ARM体系有关,而是与具体的ARM体系CPU有关。

就是说不同的CPU的UART控制器是不一样的

这个程序只能给你一个思路了

有些CPU这些发送,接收中断是可以在寄存器直接设置一个阀值的

比如你的发送缓存为8个字节,接收也是8个字节

你可以设置,当发送缓存里的数据少于1的时候就产生中断

当接收缓存里数据大于4时,就产生中断

目前很多CPU都可以直接设置内部的UART寄存器来完成这个配置

如果没有UART控制器来完成。就是说你的UART发送和接收都是自己控制的

你可以在自己的发送,接收的中断处理程序里面模拟一个缓存,来实现这些功能。我想这个应该不成问题吧

就是2个全局变量记录缓存的用量分别记录接收和发送

还有2个全局数组,比如8个字节,用来缓存接收发送的数据

你的UART中断程序如果判断到是接收,首先把数据放到缓存,然后接收缓存计数+1,判断是否超过某一个阀值,如果是的话,就做一些自定义的事情

发送是同样的道理

这个有几个原因,请参考下面分析:

1,ucos

是多任务 *** 作系统,当系统正常运行时,必须建立一个以上的任务,否则系统处于死机崩溃状态,程序运行出现异常。

2,你的系统时钟中断程序有问题,应该关中断,调用过系统时钟后再开中断,否则系统时钟异常导致程序运行异常,具体程序如下:

void

Tmr_TickISR_Handler

(void)

{

T0IR

=

0xFF;

//清零中断标志位

OSIntEnter(

);

//

关中断,必须有

OSTimeTick();

OSIntExit();

//临界代码完成,与关中断成对使用

}

3,看你上面的程序里面,你想使用定时器1中断来处理一些信息,而程序无法运行到其中,可能的原因有:1)你的定时器1初始化异常。2)你系统里面的中断使能关掉了。其实多任务的时候,你完全可以将它分配到一个任务里处理,这样既可以充分利用多任务,又不会因为中断没处理好而出现异常,如果你想要求实时性较高,那你可以将这个人物的优先级设为最高。

4,UCOS初始化异常,UCOS系统初始化有固定的顺序以及模式,颠倒了就会出现异常。

5,系统时钟tick一般建议为10hz-50hz,太高的话在你初始化的时候,还没创建任务的时候都已经进行任务切换了而导致ucos崩溃。

以上就是关于求单片机实验的外部中断实验的程序全部的内容,包括:求单片机实验的外部中断实验的程序、使用ARM中UART接收发送数据时,如果选择每接收一个字节数据就产生接收中断如何设计程序、ARM7在UCOS下如何使用中断等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/9426016.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-28
下一篇2023-04-28

发表评论

登录后才能评论

评论列表(0条)

    保存