当前位置:
文档之家› AVR单片机WinAVR及Proteus仿真外部中断
AVR单片机WinAVR及Proteus仿真外部中断
打开刚才画好的仿真图,左键双击单片机出现如下配置框图,在Program File一栏中加载刚才生成的main.hex,由于我们编译时采用8M的CPU时钟,故CLKDIV8一栏要选择Unprogrammed,不要8分频,时钟选用内部8M的RC振荡源,确认后点击OK。按左下角的黑色三角形就可以仿真啦。
仿真的时候就可以按下那个button,看程序是否完成了应有的功能。
//LED灯状态标志位,0代表目前LED灯状态为灭,1代表LED灯目前状态为点亮
unsigned char led_flg = 0;
ISR(INT0_vect)//外部中断的中断服务程序,INT0_vectfromiom48p.h
{
EIFR &= ~(1<<INTF0);//清除中断标志位
_delay_ms(10);//延时去掉干扰
先打开这个MFile
将它另存到Hello_AVR下面,不要改它的名字,软件只认识Makefile这个名字,你若重命名了,还得再改还回来的。(在另存之前,这个界面下也可以做配置,可以配置完了再保存过去,效果也是一样的)
然后把它添加到工程文件夹Makefile下,打开Makefile文件,进行配置
绿色字体是注释,蓝色和黑色的是配置项。
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
extern void Exint_Iint(void);
#endif
avrexti.C:
#include <avrexti.h>
void Exint_Iint(void)//外部中断初始化函数
#include <avr/interrupt.h>//包含中断函数实现的相关函数定义
#include <util/delay.h>//提供了2个比较准的延时函数,自己懒得写就包含进去
#include "avrexti.h"//自己写的外部中断实现的相关函数的头文件
int main(void)
{
unsigned char i;
let's begin。
首先要明确我们要完成的功能:单片机开始工作后,点亮LED灯1S,灭掉LED灯1S,如此循环3次,然后单片机进入无限循环,等待外部按键button按下,LED等再次点亮,当再次按下button时,LED等灭掉,如此循环。
接着画出要实现这个功能的电路,以便后续仿真。
先在桌面建一个文件夹Hello_AVR, 如图。
DDRB |=(1<<0);//PB0此管脚外接LED灯
for(i=0; i<3; i++)
{
PORTB |=(1<<0);//PB0置位点亮LED灯
_delay_ms(1000);//延时1000msfrom#include <util/delay.h>
PORTB &= ~(1<<0);//PB0清零灭掉LED灯
{
DDRD&= ~(1<<2);
//MCUCR |= (1<<PUD);
//PORTC |=(1<<2);//上拉电阻使能
//PORTC &= ~(1<<2);//上拉电阻禁止
EICRA = (1<<ISC01);//下降触发
EIMSK =(1<<INT0);//使能外部中断
}
将这3个文件加入到工程文件中
把MCU项改成atmaga48
F_CPU就是AVR单片机内核频率,一般采用内部8M的时钟分频系数为8后,得到1M,不过这里我们直接选8M也可以。
FORMATE代表输出的格式,有3个可选项srec,ihex和binary,这里用ihex输出hex文件,用于proteus仿真
TARGET代表你的main()函数所在源代码文件的文件名,而且不需要再写.c
本文主要以AVR单片机atmega48的外部中断的在Proteus上仿真的例子介绍AVR单片机C语言开发环境WinAVR的使用(如何包含头文件,如何写中断服务程序,如何配置编译产生hex文件),及其在Proteus上的仿真实现(如何建立仿真图,载入hex文件进行仿真)
本例子完全为PC上软件仿真所以不涉及硬件,其全部所需软件清单如下:
完成。
在工程下面建4个文件夹Sys、Drv、App、Makefile
在Hello_AVR文件夹下,创建main.c、avrexti.c、avrexti.h这3个源代码文件,这些代码实现什么功能,我在程序中进行了注释,最重要的还是参考芯片的手册。
其内容如下:
main.c:
#include <avr/io.h>//通过宏定义开关,将包含iom48p.h
_delay_ms(1000);
}
Exint_Iint();//初始化外部中断from#include "avrexti.h"
sei();//开全局中断from#include <avr/interrupt.h>
while(1);//无限循环
return 0;
}
/***********************************************************************/
这里用PB0管脚来驱动LED灯,查阅芯片的数据手册或直接从图中可以知道,外部中断0(INT0)在PD2管脚。而且Proteus的好处是,这里我们给单片机画电源的麻烦也可以省去。
接下来要做的就是看数据手册和建立工程,编程,编译的事了。
打开Programmers Notepad
File->New->Project新建工程Hello_AVR,保存到Hello_AVR文件夹
OBJDIR是编译中间生产的文件,比如.o和.lst文件存放的目录,.表示当前工程的目录,可以改成./obj,把它放到当前工程下新建的obj文件夹下。它会自动为你创建的,如果不存在。
SRC代表你这个工程包含的C源文件,$(TARGET).c代表刚才的包含main()函数的主文件,现在我们还需要包含avrexti.c这个源文件,两者之间用空格隔开即可。avrexti.c和源文件同在工程直接目录下直接写avrexti.c,否则就包含全路径是比较保险的做法,移动的时候要注意修改这里。
if(!(PIND&(1<<2)))//确认按键按下
{
if(1==led_flg)
{
PORTB &= ~(1<<0);
led_flg = 0;
}
else
{
PORTB |=(1<<0);
led_flg = 1;
}
}
}
avrexti.h:
#ifndef __AVREXTI_H__
#define __AVREXTI_H__
每个选项都有注释表明它是干什么的,有时间可以慢慢研究,这里就只涉及到这几个就可以了。下面是配置好的选项
然后点Tool下的Make All就会编译生成一堆文件,其中就包括我们需要的main.hex文件
再点击Make Clean,所有编译生成的文件就会被消除干净,省的看起来比较乱,
现在需要再Make All一次,以产生需要的main.hex
WinAVR、Proteus、atmega48_Datasheet
软件的下载安装,请参考网上其他教程,有很多,很容易的。
atmega48单片机的数据手册网上中英文的版本也都可以下载到。
下图是笔者所使用的软件截图,不同版本可能稍有差异,但基本不影响使用。
下面我将在假设您已经安装好2个软件(当然目前您不需要知道它们是怎么用的),并且对单片机和C语言有基本了解的基础上进行例程的演示。
头文件iom48p.h的位置是G:\Program Files\WinAVR\avr\include\avr\iom48p.h,它包含了这个芯片外设控制寄存器的地址映射和中断向量表,包含进来以后可以方便查看拷贝寄存器和中断向量表。
编辑好源代码后,就是编译了,跟一般的集成开发环境有点不一样,不过仍旧是很好用的。
打开软件, 这个图标。
在软件界面上,右键Place->Component->From Libraries
在Keywords里面输入atmega48,选择一个32PIN管脚的单片机放到图上
同样的方法,放置一个LED灯,一个button,电阻,电容。
放置POWER和GND
图完成,在文件夹Hello_AVR下新建文件夹Sim,保存在这里