1AVR单片机(ATmega16)培训宗旨:引导为主培养编程思维时间分配(一学期):三分之一时间讲解;三分之二时间动手实验。具体时间:星期六晚上6:00~9:00内容形式:1、软、硬件知识(一)讲解2、实验经验3、常用程序(思维)分析1、专业讲座(请资深讲师)(二)讲座2、课外讲座(如书记等)3、电影(专业性强的短片)(李世维讲座)1、硬件测试与软件使用(三)实验内容2、汇编语言编程3、AVR单片机内部资源的使用建议方法:先由指导老师讲解实验内容的原理、特点、应用、实践应用中的经验以及编程思维的分析,再由会员自己理解、自己验证、运用原理设计应用、调试程序。在会员动手的过程中,由摇篮的部长(三名)从旁指导。2实验一软件和硬件的认识一、实验目的:1、掌握硬件原理。2、初步掌握实验板的使用方法。3、熟悉软件工作界面。二、实验仪器:ATmage16实验板一块PC机一台三、实验内容及步骤:1、插上电源,按下开关。观察批示灯是否点亮。电源(可输入7~12V)3ATmega16管脚图2、由原理可知I/O口的批示灯为低电平亮,在实验板上取地与I/O口相接,观察是否点亮。I/O口LED显示与接口3、打开编程界面,点击各栏,认识各栏的用途。4AVRICCIDE软件的工作界面4、输入以下程序:#includeiom16v.hintmain(void){DDRA=0xff;/*alloutputs*/DDRB=0xff;/*alloutputs*/DDRC=0xff;/*alloutputs*/DDRD=0xff;/*alloutputs*/PORTA=0x00;/*输出低电平*/PORTB=0x00;/*输出低电平*/PORTC=0x00;/*输出低电平*/PORTD=0x00;/*输出低电平*/while(1);}观察I/O口的灯是否被点亮。实验二I/O口的输入与输出一、实验目的:1、了解IO口的结构;2、熟悉IO口的特性;3、掌握IO口的控制。二、实验仪器:ATmage16实验板一块5PC机一台三、实验原理:作为通用数字I/O使用时,AVR所有的I/O端口都具有真正的读-修改-写功能。这意味着用SBI或CBI指令改变某些管脚的方向(或者是端口电平、禁止/使能上拉电阻)时不会改变其他管脚的方向(或者是端口电平、禁止/使能上拉电阻)。输出缓冲器具有对称的驱动能力,可以输出或吸收大电流,直接驱动LED。所有的端口引脚都具有与电压无关的上拉电阻。并有保护二极管与VCC和地相连,如Figure23所示。在控制I/O时,分别由方向寄存器DDRX与数据寄存器PORTX控制I/O的状态,如下表。Figure23.I/O引脚等效原理图6I/O口LED显示与接口四、实验内容及步骤:输入以下程序:这个程序为流水灯#includeiom16v.h//*******************延时usvoiddelay_us(intt){dot--;while(t1);}//*******************延时msvoiddelay_ms(unsignedintt){while(t!=0){delay_us(1142);t--;}}intmain(void){DDRA=0xff;/*alloutputs*/DDRB=0xff;/*alloutputs*/7DDRC=0xff;/*alloutputs*/DDRD=0xff;/*alloutputs*/PORTA=0XFF;PORTB=0XFF;PORTC=0XFF;PORTD=0XFF;while(1){//***IO口输出低电平有效,如:0X01为十六进制数,二进制表示为00000001B,再取反PORTA=~0X01;delay_ms(1000);//************延时1秒PORTA=~0X02;delay_ms(1000);PORTA=~0X04;delay_ms(1000);PORTA=~0X08;delay_ms(1000);PORTA=~0X10;delay_ms(1000);PORTA=~0X20;delay_ms(1000);PORTA=~0X40;delay_ms(1000);PORTA=~0X80;delay_ms(1000);PORTA=0XFF;PORTB=~0X01;delay_ms(1000);//************延时1秒PORTB=~0X02;delay_ms(1000);PORTB=~0X04;delay_ms(1000);PORTB=~0X08;delay_ms(1000);PORTB=~0X10;delay_ms(1000);PORTB=~0X20;delay_ms(1000);PORTB=~0X40;delay_ms(1000);PORTB=~0X80;delay_ms(1000);PORTB=0XFF;PORTC=~0X01;8delay_ms(1000);PORTC=~0X02;delay_ms(1000);PORTC=~0X04;delay_ms(1000);PORTC=~0X08;delay_ms(1000);PORTC=~0X10;delay_ms(1000);PORTC=~0X20;delay_ms(1000);PORTC=~0X40;delay_ms(1000);PORTC=~0X80;delay_ms(1000);PORTC=0XFF;PORTD=~0X01;delay_ms(1000);PORTD=~0X02;delay_ms(1000);PORTD=~0X04;delay_ms(1000);PORTD=~0X08;delay_ms(1000);PORTD=~0X10;delay_ms(1000);PORTD=~0X20;delay_ms(1000);PORTD=~0X40;delay_ms(1000);PORTD=~0X80;delay_ms(1000);PORTD=0XFF;}}观看现象是不是流水灯。实验三外部中断一、实验目的:1、了解外部中断的库函数;92、熟悉外部中断的特性;3、掌握外部中断的使用。二、实验仪器:ATmage16实验板一块PC机一台三、实验原理:外部中断通过引脚INT0与INT1或PCINT23..0触发。只要使能了中断,即使引脚INT0与INT1或PCINT23..0配置为输出,只要电平发生了合适的变化,中断也会触发。这个特点可以用来产生软件中断。只要使能,PCINT23..16引脚上的电平变化将触发外部中断PCI2,PCINT14..8引脚上的电平变化将触发外部中断PCI1,PCINT7..0将触发外部中断PCI0。PCMSK2、PCMSK1与PCMSK0寄存器则用来检测是哪个引脚上的电平发生了变化。PCINT23..0外部中断的检测是异步的。也就是说,和其他中断方式一样,这些中断也可以用来将器件从休眠模式唤醒。INT0与INT1中断可以由下降沿、上升沿,或者是低电平触发。具体由外部中断控制寄存器A–EICRA的设置来确定。当INT0或INT1中断使能且设定为电平触发时,只要引脚电平被拉低,中断就会产生。若要求INT0或INT1在信号下降沿或上升沿触发中断,则I/O时钟必须工作(请参见P23”时钟系统及其分布”了解更多信息)。INT0与INT1的低电平中断检测是异步的。也就是说它可以用来将器件从休眠模式唤醒。在休眠过程(除了空闲模式)中I/O时钟是停止的。通过电平中断将MCU从掉电模式唤醒时,要保证低电平保持一定的时间以使MCU完成唤醒过程并触发中断。如果触发电平在启动时间结束前就消失,MCU将被唤醒,但中断不会被触发。启动时间由熔丝位SUT与CKSEL决定。详见P23”系统时钟及其选项”。外部中断控制寄存器MCUCR外部中断控制寄存器A包括决定中断触发方式的控制位。10位1,0–ISC01,ISC00:中断触发方式控制0之位1与位0外部中断0由引脚INT0激发,如果SREG寄存器的I标志位和相应的中断屏蔽位置位的话。触发方式如Table35所示。在检测边沿前MCU首先采样INT0引脚上的电平。如果选择了边沿触发方式或电平变化触发方式,那么持续时间大于一个时钟周期的脉冲将触发中断,过短的脉冲则不能保证触发中断。如果选择低电平触发方式,那么低电平必须保持到当前指令执行完成。中断完成后回到被中断的位置。外部中断控制寄存器MCUCR外部中断控制寄存器A包括决定中断触发方式的控制位。通用中断控制寄存器GICR,控制外部中断使能位,具体如下:四ICC软件中断程序书写格式及16中断向量表1116中断向量表五实验步骤及内容:输入程序:本程序一开始是IO口中的A口以流水灯工作,一旦有外部中断请求,就是B口以流水灯工作,循环一次后回到被中断处继续运行。程序如下:#includeiom16v.h#includemacros.h//*******************延时usvoiddelay_us(intt){12dot--;while(t1);}//*******************延时msvoiddelay_ms(unsignedintt){while(t!=0){delay_us(1142);t--;}}#pragmainterrupt_handlerINT_0:2//外部中断0执行函数voidINT_0(void){PORTC=0XFF;PORTB=~0X01;delay_ms(1000);PORTB=~0X02;delay_ms(1000);PORTB=~0X04;delay_ms(1000);PORTB=~0X08;delay_ms(1000);PORTB=~0X10;delay_ms(1000);PORTB=~0X20;delay_ms(1000);PORTB=~0X40;delay_ms(1000);PORTB=~0X80;delay_ms(1000);PORTB=0XFF;}voidmain(void){DDRA=0xff;/*输出*/DDRB=0xff;/*输出*/DDRC=0xff;/*输出*/DDRD=0xff;/*输出*/PORTA=0XFF;PORTB=0XFF;PORTC=0XFF;PORTD=0XFF;13MCUCR=0X02;//定义外部中断INT0为下降沿产生中断请求GICR=0X40;//中断屏蔽寄存器开INT0SEI();//******开全局中断for(;;){PORTA=~0X01;delay_ms(1000);PORTA=~0X02;delay_ms(1000);PORTA=~0X04;delay_ms(1000);PORTA=~0X08;delay_ms(1000);PORTA=~0X10;delay_ms(1000);PORTA=~0X20;delay_ms(1000);PORTA=~0X40;delay_ms(1000);PORTA=~0X80;delay_ms(1000);}}实验四数码LED实验一、实验目的:1、了解数码管的原理;2、熟悉数码管的使用;3、掌握外部中断和数码管动态显示的应用。二、实验仪器:ATmage16实验板一块PC机一台三、实验原理:数码管原理图如下:14多个数码管的动态显示是利用人的眼睛在瞬间无法识别的原理来实现在,如电灯也是利用这个原理。四、实验步骤及内容:这个程序是数码管动态显示,按INT0键加1,一直到数码管显示为9999再重新计数。实验程序如下:#includeiom16v.h#includemacros.hintled[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//*******显示符0,1,2,3,4,5,6,7,8,9,unsignedinti;intg,s,b,q;//*******************延时usvoiddelay_us(intt){dot--;while(t1);}//*******************延