单片机中断程序

单片机中断程序,第1张

//本段程序开辟一个16字节的接受缓冲区,防止处理不及时时丢掉数据

#include<reg51h>

unsigned char rxdat[16];

unsigned char ptd,getdat[3];

unsigned char put,get;

main()

{

unsigned char i;

TMOD=0x20;

TH0=0xfd;

TL0=0xfd;

TR1=1;

ES=1;

put=0;

get=0;

i=0;

while(1){

if(put!=get)(

get=get&0x0f;

getdat[i]=rxdat[get];

get++;

i++;

if(i>2)i=0;

}

}

void serint() interrupt 4 using 0

{

if(RI){

Ri=0;

put=put&0x0f;

rxdat[put]=SBUF;

put++;

}

if(TI)TI=0;

}

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

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

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

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

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

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

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

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

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

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

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

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

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

发送是同样的道理

1、中断:指当出现需要时,CPU暂时停止当前程序的执行转而执行处理新情况的程序和执行过程。即在程序运行过程中,系统出现了一个必须由CPU立即处理的情况,此时,CPU暂时中止程序的执行转而处理这个新的情况的过程就叫做中断。

2、中断服务程序:处理器处理"急件",可理解为是一种服务,是通过执行事先编好的某个特定的程序来完成的,这种处理"急件"的程序被称为--中断服务程序。

3、中断是处理器一种工作状态的描述。我们把引起中断的原因,或者能够发出中断请求信号的来源统称为中断源。

1、中断的处理过程为:关中断(在此中断处理完成前,不处理其它中断)、保护现场、执行中断服务程序、恢复现场、开中断。

2、通常中断源有以下几种:

(1)外部设备请求中断。

(2)故障强迫中断。

(3)实时时钟请求中断。

(4)数据通道中断。

(5)程序自愿中断。

3、中断系统的功能中断系统应具有的功能可归结为中断处理和中断控制。

(1)中断处理。中断处理包括发现中断请求、响应中断请求、中断处理和中断返回。

(2)中断控制。中断控制主要是实现中断优先级的排队和中断嵌套。

4、防止方法

(1)声卡:一些早期的ISA型声卡,系统很有可能不认,就需要用户手动设置(一般为5)

(2)内置调制解调器和鼠标:一般鼠标用COM1,内置调制解调器使用COM2的中断(一般为3),这时要注意此时COM2上不应有其它设备

(3)网卡和鼠标:此问题一般发生在鼠标在COM1口,使用中断为3,这时要注意通常网卡的默认中断为3,两者极有可能发成冲突。

(4)打印机和EPP扫描仪:在安装扫描仪驱动程序时应将打印机打开,因为两个设备中串联,所以为了防止以后扫描仪驱动程序设置有误,一定要将打印机打开再安装扫描仪驱动程序。

(5) *** 作系统和BIOS:如果计算机使用了"即插即用" *** 作系统(例如win98),应将BIOS中PNP OS Installed设置为Yes这样可让 *** 作系统重新设置中断。

(6)PS/2鼠标和BIOS:在使用PS/2鼠标时应将BIOS中PS/2 Mouse Function Control打开或设置为Auto,只有这样BIOS才能将IRQ12分配给PS/2鼠标用。

概念:中断程序是计算机的重要组成部分。实时控制、故障自动处理、计算机与外围设备间的数据传送往往采用中断程序。中断程序的应用大大提高了计算机效率。

不同的计算机其硬件结构和软件指令是不完全相同的,因此,中断系统也是不相同的。计算机的中断系统能够加强对多个任务事件的处理能力。中断机制是现代计算机系统中的基础设施之一,它在系统中起着通信网络作用,以协调系统对各种外部事件的响应和处理。中断是实现多道程序设计的必要条件。 中断对系统发生的某个事件作出的一种反应。 引起中断的事件称为中断源。

怎么产生的?如果就字面意思来说的话~就是由芯片内的中断逻辑产生的~串口模块发送寄存器为空或接受寄存器为满时,会向430中断控制器发信号~

这是TI的官方代码样例

//

//  MSP-FET430x140 Demo - USART0, Ultra-Low Pwr UART 9600 String, 32kHz ACLK

//

//  Description: This program demonstrates a full-duplex 9600-baud UART using

//  USART0 and a 32kHz crystal  The program will wait in LPM3, and will

//  respond to a received 'u' character using 8N1 protocol The response will

//  be the string 'Hello World

//  ACLK = LFXT1 = UCLK0, MCLK = SMCLK = default DCO ~ 800KHz

//  Baud rate divider with 32768hz XTAL @9600 = 32768Hz/9600 = 341 (000Dh 4Ah )

//  // An external watch crystal is required on XIN XOUT for ACLK //

//

//               MSP430F149

//            -----------------

//        /|\|              XIN|-

//         | |                 | 32kHz

//         --|RST          XOUT|-

//           |                 |

//           |             P34|----------->

//           |                 | 9600 - 8N1

//           |             P35|<-----------

//

//  M Buccini

//  Texas Instruments Inc

//  Feb 2005

//  Built with CCE Version: 320 and IAR Embedded Workbench Version: 321A

//

#include  <msp430x14xh>

static char string1[] = { "Hello World\r\n" };

char i;

void main(void)

{

WDTCTL = WDTPW + WDTHOLD;                 // Stop watchdog

P3SEL = 0x30;                             // P33,4 = USART0 TXD/RXD

ME1 |= UTXE0 + URXE0;                     // Enabled USART0 TXD/RXD

UCTL0 |= CHAR;                            // 8-bit character, SWRST=1

UTCTL0 |= SSEL0;                          // UCLK = ACLK

UBR00 = 0x03;                             // 9600 from 1Mhz

UBR10 = 0x00;                             //

UMCTL0 = 0x4A;                            // Modulation

UCTL0 &= ~SWRST;                          // Initialize USART state machine

IE1 |= URXIE0 + UTXIE0;                   // Enable USART0 RX/TX interrupt

IFG1 &= ~UTXIFG0;                         // Clear inital flag on POR

_BIS_SR(LPM3_bits + GIE);                 // Enter LPM3 w/ interrupt

}

// UART0 TX ISR

#pragma vector=USART0TX_VECTOR

__interrupt void usart0_tx (void)

{

if (i < sizeof string1-1)

TXBUF0 = string1[i++];

}

// UART0 RX ISR

#pragma vector=USART0RX_VECTOR

__interrupt void usart0_rx (void)

{

if (RXBUF0 == 'u')                        // 'u' received

{

i = 0;

TXBUF0 = string1[i++];

}

}

当MCU接收到GPS发来的一个

字节

时触发中断,进入中断程序,(在进入中断程序时串口照样接收,中断程序是往串口

缓存

区读的数据,并且读数据时相当快的,永远不用担心还在读的时候数据被新来的给覆盖了)将该接收的字节提取出放在一个

缓冲区

内,缓冲区是你自己

定义

的一个

数组

字符串

,谁你喜好,如你所述GPS是每隔1秒发送一次数据的,此时你可以在

主程序

中设计当05秒没有接收到GPS所发的数据时,就将缓冲区内的数据读出处理,并清空缓冲区,这样其实中断程序只管

接收数据

主函数

只管处理数据,两不相冲。

在程序中检测RI和TI,RI表示接收中断,TI表示发送中断,如果只要在接收中断时运行,可以如下设置:

JNB RI,EXIT

CLR RI

EXIT:

RETI

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

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

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

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

发表评论

登录后才能评论

评论列表(0条)

    保存