avr中断使用例子

发布者:温柔花香最新更新时间:2016-09-18 来源: eefocus关键字:avr  中断使用 手机看文章 扫描二维码
随时随地手机看文章
在ICCAVR下,用以下语句可定义中断程序
#pragma interrupt_handler 函数名:中断向量 
要注意不同的AVR芯片的中断向量是不同的,因此在ICCAVR下编译,除了要在程序上注明芯片的类型外,还要在PROJECT的OPTION页选择正确的芯片,否则有可能导致程序运行不正常;而GCC只要在MFILE里面选定芯片型号就可以,GCC在这点上的使用比ICCAVR的方便。
附:定时器1溢出中断例子,每溢出一次就令i自加1,然后在LCD1602上显示出来
------------------------------------------------------------------------------------------------
#include
#include
#pragma interrupt_handler ANA_COMP:10 //定时器1溢出中断
#define uchar unsigned char
#define uint unsigned int
#define LcdBus PORTA
#define rs 2 //LCD端口定义
#define rw 3
#define en 4 


void LcdIni(void);
void WrOp(uchar dat);
void WrDat(uchar dat);
void ChkBusy(void);
void DisText(uchar addr,uchar *text);
void DisTextConst(uchar addr,uchar const *text);
void ShowNum(uchar addr,uint num); //在addr处显示数字num
int AdcVal(uchar n);
void delayms(uint n);
int AdcValPro(uchar n);
void ANA_COMP(void);

char BCD[6]; //十位二进制的显示码分别是千百十个位的显示
int Adc[3]; //存放Adc转换后的值
int i=0;
void main(void)
{
   LcdIni();
   TIMSK=0X04;
   TCNT1H=0XFF;
   TCNT1L=0X00;
   TCCR1A=0X00;
   TCCR1B=0X01;
   SEI(); //允许全局中断
   while(1);
}

void ANA_COMP(void)
{//中断处理程序,溢出时就令i增加1
   TCNT1H=0XFF;
   TCNT1L=0X00;
ShowNum(0x82,i++);
}

int AdcVal(uchar n)
{//软件滤波
uchar i,k;
uint tmp=0;
for(i=0;i<20;i++)
tmp=(tmp+AdcValPro(n))/2;
k=tmp>Adc[n] ? (tmp-Adc[n]):(Adc[n]-tmp);
Adc[n]=k>0 ? tmp:Adc[n];
return Adc[n];
}

int AdcValPro(uchar n)
{//返回第N个ADC的值从0到7
uchar dat1,dat0;
int val;
DDRA &=~BIT(n); //设置对应的ADC口为输入
PORTA &=~BIT(n);
ADMUX=0x40+n; //选择AVCC,选择第N个ADC
ADCSRA=0xc0; //允许转换ADEN,ADSC
while(ADCSRA & BIT(ADSC)); //
dat1=ADCH;
dat0=ADCL;
val=ADCH*256+ADCL;
return val;
}

void ShowNum(uchar addr,uint num) //在addr处显示数字num
{//将num转化成五个BCD码存放在全局数组BCD[5]中
uchar i;
for(i=5;i>0;i--)       //将NUM数据转化成ASCII码,如521会转化为00521
{
          BCD[i-1]=(uchar)(num%10+0x30);     //取出最低位
          num/=10;                           //去掉最低位
     }
     i=0;
while(BCD[i] ==0x30 && i<4) BCD[i++]=' ';     //NUM转换成数组存放,但还没有加上小数点
BCD[5]='\0';
DisText(addr,BCD+1);
}

void DisText(uchar addr,uchar *p)
{
WrOp(addr);
while(*p !='\0')WrDat(*(p++));
}

void DisTextConst(uchar addr,uchar const *p)
{
WrOp(addr);
while(*p !='\0')WrDat(*(p++));
}

void LcdIni()
{
     uint i;
DDRD=0XFF; //设置PA输出
PORTD=0XFF; //全部加上上拉电阻
DDRC=0XFF; //设置PC为输出
PORTC=0XFF; //全部加上上拉电阻
WrOp(0x38); 
WrOp(0x06); //光标加1
WrOp(0x0c); //开显示
WrOp(0x01);
for(i=0;i<5000;i++);
}

void WrOp(uchar dat)
{
uchar i;
ChkBusy();
PORTD &=~BIT(rs); //RS=0
PORTD &=~BIT(rw); //RW=0
PORTD &=~BIT(en); //EN=0
PORTC =dat; //送数据
PORTD |=BIT(en); //EN=1
for(i=1;i;i++); //延时
PORTD &=~BIT(en); //EN=0
}

void WrDat(uchar dat)
{
uchar i;
ChkBusy();
PORTD |=BIT(rs); //rs=1
PORTD &=~BIT(rw); //rw=0
PORTD &=~BIT(en); //en=0
PORTC=dat; //送数据
PORTD |=BIT(en); //en=1
for(i=1;i;i++); //延时
PORTD &=~BIT(en); //en=0
}

void ChkBusy()
{
DDRC=0X00; //设置为输入
PORTC=0X00; //不设置上拉电阻
PORTD &=~BIT(rs); //RS=0
PORTD |=BIT(rw); //RW=1
PORTD |=BIT(en); //EN=1
while(PINC & 0x80); //送数据
PORTD &=~BIT(en); //en=0
DDRC=0xff; //设置为输出
}

void delayms(uint n)
{
uchar j;
uint i;
for(i=0;i for(j=0;j<250;j++);
}
关键字:avr  中断使用 引用地址:avr中断使用例子

上一篇:基于AVR ATMega16 的PID 控制算法程序
下一篇:AVR的中断应用设计要点

推荐阅读最新更新时间:2024-03-16 15:10

avr单片机eeprom初始化配置及说明
ATmega16 包含 512 字节的 EEPROM 数据存储器。它是作为一个独立的数据空间而存在的,可以按字节读写。 EEPROM 的寿命至少为 100,000 次擦除周期。 EEPROM 的访问 由地址寄存器、数据寄存器和控制寄存器决定。 /* EEPROM 数据存储器 EEPROM 地址寄存器(EEARH 和 EEARL) bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0 EEAR7 EEAR6 EEAR5 EEAR4 EEAR3 EEAR2 EEAR1 EEAR0 Res: 保留 保留位,读操作返回值为零。 EEAR8..0
[单片机]
avr单片机可演奏的电子琴仿真加源码
单片机电子琴仿真原理图如下 avr单片机源程序如下: //----------------------------------------------------------------- // 名称: 电子琴仿真 //----------------------------------------------------------------- // 说明: 本例在键盘矩阵上模拟演奏电子琴,数码管显示键号. // 按下不同按键时将输出不同频率音符,按键长按时发出长音, // 短按时发出短音. // //-------------------------------------------------------
[单片机]
<font color='red'>avr</font>单片机可演奏的电子琴仿真加源码
avr异步中断接收和发送通信程序
;******************************************************************************* ;* ;* 子程序名: USART_AINT.asm ;* 程序名称: 通用同步和异步串行接收器和转发器(USART) ;* 异步中断接收和发送通信程序 ;* 版本: 1.0 ;* 适用 MCU 型号: AVR所有型号 ;* 使用资源: r5,r6,r16,r17,r18,r19,r20,r28,r29,r30,r31 ;* 定时器/计数器0(溢出中断) ;* ;* 程序功能: ;*  
[单片机]
AVR单片机学习(七)异步串行口UART
串行通讯技术概述 异步串行通讯原理 UART与电脑的通讯 M16的USART 中断方式使用USART步骤 一、串行通讯技术概述 串行通讯的通俗定义: 一位发送一位(相对与并行,)当然通过 位同步 帧同步 串行通讯的分类 同步串行通讯 时钟线、数据线、通过时钟保持数据同步 SPI,IIC 属于同步串口通讯 异步串口通信 只有一根数据线,通过波特率保证数据同步(顾名思义没有时钟线只有数据线) UART 无线通信一般均为异步串行通信(相对于无形之中只能有一根天线) 波特率 每秒发送码元时间宽度为(1/9600)S 大概是在100个微妙左右 发送方按照
[单片机]
<font color='red'>AVR</font>单片机学习(七)异步串行口UART
AVR GCC常见库函数和头文件介绍
一、库函数头文件介绍 库函数按不同的类别声明在不同的头文件中,以字母为序分别介绍头文件: ctype.h:字符类型函数 eeprom.h:EEPROM访问函数 errno.h:错误处理函数 ina90.h:与IAR C兼容的头文件 interrupt.h:中断处理函数 inttypes.h:定义不同的数据类型 io.h:包含寄存器定义和其它头文件 math.h:数学函数 pgmspace.h:与IAR C兼容的头文件,内含对Flash存储器中数据读写函数 progmem.h:与pgmspace.h头文件相同 setjmp.h:长跳转函数 sig-avr.h:与signal.h相同,旧版头文件,建议不使用 signal.h:信号处理
[单片机]
AVR使用定时器必须弄清的几个概念!
在MCU中(M16),定时器是独立的一个模块,M16有三个独立的定时器模块,即T/C0、T/C1和T/C2;其中T/C0和T/C2都是8位的定时器,而T/C1是一个16位的定时器。定时器的工作是独立于CPU之外自行运行的硬件模块。 1、定时器何时开始工作(或说计数)的? 当TCCR0!=0x00任何模式下,只要MCU一上电,T/C就开始计时工作。其实TCCR0主要是定时器的预分频和波形模式、比较匹配模式的设置,说到预分频,不得不提一下这个模块,这个模块是T/C0、T/C1共用的一个模块,但可以有不同的分频设置。 2、定时器是如何进行工作的:说到定时器的工作,不得不说三个个重要参数:TCNT0、OCR0,TIMSK,TCNT0是设
[单片机]
采用AVR单片机控制实现太阳能光伏直流控制器设计
当今世界能源短缺以及环境污染问题日益严重,这些问题迫使人们寻找和使用新的代替能源。随着电子技术、太阳能电池板生产技术的提高,使得太阳能的利用越来越普遍。太阳能具有无地域限制的特点,而我国很多地方仍然处于缺电状态,特别是一些边远地区、旅游景区,由于非常分散,依靠电网供电难度大、成本高,因而选择太阳能供电十分必要,而在太阳能发电系统中,控制器是十分关键的部件之一。 目前市面上一些太阳能控制器提高效率的手段仅仅局限在单一物理量算法研究(比如只对电压、电流的跟踪),效率的提高是很有限的。我们经过多次实际考察与测量,发现发电效率较高的产品往往价格昂贵,且适应性差,一般都用于固定场合,如大型太阳能发电站等;一些低价的控制器为了降低成本,内
[单片机]
采用<font color='red'>AVR</font>单片机控制实现太阳能光伏直流控制器设计
基于AVR单片机的智能烤烟控制仪
    烤烟是云南省农业生产的主要经济作物之一,近年来,由于推广了优质烟栽培技术,使烤烟生产有了很大发展,但烟叶的烘烤仍然是一个薄弱环节。为了解决烟叶烘烤技术难于掌握的问题,设计了烤烟智能控制仪,他使难于控制的烟叶烘烤过程变得简单。本文从软、硬件方面详细介绍智能控制仪的组成和工作原理。 1 烟叶烘烤的基本要求   影响烟叶质量的因素有很多方面,除了有标准的烤房之外,烟叶烘烤过程中的温度、湿度控制十分重要。云南省烟草研究所研究得出优质烟叶的一般烘烤方法。其温度时间、湿度时间关系如图1和图2所示。   从图1和图2中可以看出,在烟叶烘烤的整个过程中,一定的时刻对应一个确定的温度、湿度值。图1和图2中的一定时间的温度、湿
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved