1、AVR单片机教学试验指导DOC 50页 AVR单片机实验教学指导书 保定电力职业技术学院动力工程系热自教研室2007年4月18日实验一 实训装置的认识与软件使用实验二 彩灯控制实验三 键控加减计数实验四 外部中断的使用实验五 数码管动态扫描显示实验六 实时时钟显示实验七 高频脉冲频率的测量实验八 低频脉冲频率的测量实验九 脉宽调制的实验实验十 显示驱动器7219的使用实验十一 7219驱动8位8段数码管的时钟显示实验十二 88点阵字符显示控制器的使用实验十三 异步通信实验实验十四 多路模拟数据采集与显示实验十五 模拟比较器应用实验十六 矩阵键盘扫描与编码显示实验十七 常数设置 实验十八 液晶显
2、示器应用 实验一 AVR实训装置与软件使用一、目的1熟悉实训装置上元器件名称、作用及相应的接口。2会使用C编译器编辑、编译、调试简单C源程序。3会使用下载软件将程序代码写入实训装置并得到正确结果。二、实训装置 实训装置及相应元件如图1所示。 图1 实训装置及相应元件所有模块的引出接口为标准FC-l0芯连接。FC座的接口外形如图2所示。引脚定义如表1所示。8引脚对应一字节的8位数据D0D7,9引脚为电源Vcc,10引脚为电源GND。表1 FC-10座引脚定义引脚序号12345678910对应定义D0D1D2D3D4D5D6D7VCCGND 本实训装置按功能模块化设计,各模块之间是相互独立的。各功
3、能模块都可以与ATmegal6相连接,构成不同的单片机系统。模块之间的连接采用如图2所示的扁平线连接。不同的连接可以组成不同的应用系统,因此装置对用户是开放的。图2 FC-l0座及扁平连接线 图3单片机ATmegal6单元 三、实训装置原理图 单片机ATmegal6单元如图3所示。 8个LED双色发光管显示电路如图4所示,8个数码管显示电路如图5所示。8按钮开关控制电路如图6所示。8拨动开关控制电路如图7所示。其它单元电路介绍见后续实验。 图4 8个LED发光管显示电路图 图5 8个位数码管数字显示电路图6 按钮开关模块电路图图7 拨动开关模块电路图 四、实训装置的使用本实训装置中的8个LED
4、双色发光管显示器、8位LED数码管显示器、88点阵汉字显示器、LCD液晶显示器属于输出设备,与它们连接的ATmegal6单元相应口的方向寄存器应必须设置为输出方向(DDRX=0XFF)。本实训装置中的按钮开关组、拨动开关组、A/D转换器、44矩阵键盘属于输入设备,与它们连接的ATmegal6单元相应口的方向寄存器必须设置为输入方向(DDRX=0X00)。五、C编译器(Code Vision AVR软件)及下载软件(SLISP)使用(实际操作)例1:编写并调试程序使C口输出等于A口输入。#include ;/文件头 main() char a;/设置局部变量 DDRA = 0x00;/A口设置输
5、入 DDRC = 0xff;/C口设置输出 while (1) a=PINA; PORTC=a; 步骤:(1)用代码生成器生成框架文件,然后修改该文件。(2)编辑、编译、调试该文件并生成HEX代码。(3)启动SLISP下载软件将生成的HEX代码写入AVR芯片。(4)观察结果是否符合命题要求,若不符合则重复上述过程。例2:编写并调试程序使键控8个发光管不断闪光。#include ;/文件头#include ;/延时函数 main() DDRD= 0x00;/A口设置输入; PORTD=0xff;/D口设置上拉。 DDRC = 0xff;/C口设置输出 ; PORTC=0xff; /C口输出高电平
6、; while (PIND.5=1); while (1) PORTC=0xff; delay_ms(500) ; 要求:分别使用异或语句 及取反语句 例3:编写并调试程序使C口某位不断由左向右循环移动。提示:用循环语句 例4:编写并 调试程序使C口由左向右循环移位。由全1变全0。提示:用循环语句实验二 彩灯控制 一、实验目的与任务1实验目的 熟悉并行接口的设置与应用; 进一步熟悉编译软件和下载软件的使用; 熟悉C语言中移位、延时、数组等指令的应用; 增强学习单片机的兴趣。2实验任务任务一:实验板上有8只LED双色发光二极管,每只发光管低电平点亮,编程使发光管红灯间隔0.3S单一右移点亮,然后
7、绿灯间隔0.3S单一左移点亮;发光管红灯间隔0.3S逐一右移点亮,然后绿灯间隔0.3S逐一左移点亮;重复循环。任务二:实验板上有8只LED双色发光二极管,每只发光管低电平点亮,编程使发光管红灯间隔0.3S逐一右移点亮,其次绿灯间隔0.3S逐一左移点亮,然后橙灯间隔0.3S逐一右移点亮;发光管红灯间隔0.3S由中间向两边逐一点亮,其次绿灯间隔0.3S由两边向中间逐一点亮;重复进行 二、实验接线与要求 实验板上将双色发光二极管LED设计为一个独立的单元回路,用扁平线将PD口与红灯LED口连接,将PC口与绿灯LED口连接,形成如图12所示的电路,实验要求将PD口、PC口设置为输出。图8 实验二LED
8、显示电路图 三、实验参考程序 程序一: #include #include unsigned char dataa=0xff,0xe7,0xc3,0x81,0x00; void main(void) unsigned char t,j; DDRC=0xFF; PORTC=0xff; DDRD=0xFF; PORTD=0xff; while(1) /单发光管左右移动 for(t=0;tt); delay_ms(300); PORTD=0XFF; PORTC=0XFF; for(t=0;t8;t+) PORTC=(1t); delay_ms(300); PORTC=0XFF; PORTD=0XFF
9、; /发光管左右逐一全亮 for(t=0;tt; delay_ms(300); PORTD=0XFF; PORTC=0XFF; for(t=0;t9;t+) PORTC=0XFFt; delay_ms(300); PORTC=0XFF; PORTD=0XFF; 程序二:#include #include unsigned char dataa=0xff,0xe7,0xc3,0x81,0x00; void main(void) unsigned char t,j; DDRC=0xFF; PORTC=0xff; DDRD=0xFF; PORTD=0xff; while(1) for(t=0;tt;
10、 delay_ms(300); PORTD=0XFF; PORTC=0XFF; for(t=0;t9;t+) PORTC=0XFFt; delay_ms(300); PORTC=0XFF; PORTD=0XFF; / for(t=0;tt; PORTC=0XFFt; delay_ms(300); PORTD=0XFF; PORTC=0XFF; for(t=0;t5;t+) PORTD=dataat; delay_ms(300); PORTC=0XFF; PORTD=0XFF; for(t=5;t0XFF;t-) PORTC=dataat; delay_ms(300); PORTC=0XFF;
11、PORTD=0XFF; 四、实验指导 打开CodeVisionAVR开发编程软件,新建一个工程文件框架,参照上述程序清单或根据实验要求自己重新修改设置并输入程序。在程序设计过程中须将ATmegal6的PC口设置为输出。编译之前先将调试码设置成外部调试码,方法是按下工具栏中的configure the project 命令,出现一个对话框,再按下c compiler按钮,在对话框的左上角选择芯片型号和时钟频率,在右下角将文件输出格式设置为外部调试码(即选择OBJ ROM HEX EEP)。将所输入的程序进行编译(菜单Project Make命令),或者在工具栏单击Make按钮),若编译时未生成可
12、执行文件*hex,说明程序有语法错误,此时必须根据编译器所列出的错误消息,逐条查改,重新编译,直到错误消除并生成*hex文件。 打开下载程序,将刚刚生成的相应*hex文件写入单片机(在此之前,须将单片机实验板按要求与PC机连接正确,单片机实训装置接通电源)。 按复位键RESET,观察实验结果。 五、实验扩展 由于本实训装置将ATmegal6的4个I/O口PA、PB、PC和PD的引脚,全部引出且作为独立的端口使用,所以本实验除了可以用PC口和PD口外,PA和PB口都可作为“彩灯”的控制口。 (1) 仿照LED与PC和PD口的相连,分别将ATmegal6的PA和PB 口作为作为“彩灯”的控制口,重
13、新编写程序、编译并写入实训装置,观察实验结果。 (2) 改变延时时间即改变语句delay_ms(300),控制“彩灯”的循环速度。 (3) 改变“彩灯”的循环方向。 (4) 自行设计“彩灯”的点亮方式及循环方式,观察实验结果。 实验三 键控加减计数 一、实验目的与任务 1实验目的 掌握按键消抖的几种方法; 熟悉并行接口的设置与应用; 进一步熟悉编译软件和下载软件的使用; 熟悉C语言中if 、while语句的应用;2实验任务采用PD口的8个发光二极管以“亮1灭0”的方式显示一个8 位的二进制数,PC口按键AN7每按下一次,PD口显示的二进制数加1,PC口按键AN0每按下一次,PD口显示的二进制数
14、减1。 二、实验接线图与条件电路如图13所示。实验前,用扁平连接线将按钮开关接口与PC接口连接起来,用扁平连接线将LED发光管接口与PD接口相连起来。图9 键控计数电路实验要求是PC口设置为输入,并且是内部上拉;PD口设置为输出。 三、实验原理 电路中,按钮不按下时,在内部上拉电阻的作用下,PC口为高电平。按钮按下时,引脚与地短接,PC口相应的该位为低电平。通常按键所用开关为机械弹性开关,均利用了机械触点的合、断作用,一个电压信号通过机械触点断开、闭合过程的波形如图14所示。图10 按键抖动波形由于机械触点的弹性作用,一个按钮开关在按下时不会马上稳定地接通,在松手时不会一下子断开。而是在闭合和
15、断开的瞬间伴随有一连串的抖动,抖动的时间一般为510ms。按键有断开、下按、接通和释放四种情况,对应为高电平、高电平向低电平变化、低电平、低电平向高电平变化四种状态。每按一次键都要经历这四种状态,检查是否按了一次键,可以检查高电平向低电平变化或者检查低电平向高电平变化。检查高电平向低电平变化的方法是:上次检查为高电平,本次检查为低电平,则表示键已按下。检查低电平向高电平变化的方法是:上次检查如果为低电平,本次检查为高电平,则表示键已释放。也可以通过延时来实现消除按键抖动,具体的方法是如果按键按下值为0,延时2ms,跳过前沿抖动,然后执行相关程序。If (PINC.0=0) while(PINC
16、.0=0) delay_ms(2); 此外还有一些其它方法可以消除抖动:程序等待按后通过:while(PINC.0=0);按住时等待或执行预定程序:while(PINC.0=0) ;按一键后执行预定程序:If (PINC.0=0) while(1) 。 四、实验参考程序#include #include void main(void)PORTC=0xff;DDRC=0x00;PORTD=0xff;DDRD=0xff;while (1) if(PINC.7=0) while(PINC.7=0) delay_ms(2);PORTD-; 五、实验延伸扩展 给出的参考程序是判断键的“按下”时,进行加、
17、减计数的,若将程序改为判断按键 “释放”时,加、减计数。修改程序并调试,观察实验结果。实验四 外部中断的使用一、实验目的与任务1实验目的 掌握外部中断的工作原理,熟悉外部中断的设置与使用; 会用C- AVR的代码生成器生成外中断的基本框架文件,能正确解读框架文件中关于外中断寄存器功能设置的语句。 了解CPU对中断请求的响应过程,会正确修改框架文件实现外中断的命题要求。 进一步熟悉位操作命令;2实验任务任务一:上电后8只发光管灭,按下外部中断0时,发光管高4位亮;按下外部中断1时,发光管低4位亮。任务二:上电后8只发光管灭,按下外部中断0时,发光管单一右移点亮;按下外部中断1时,发光管单一左移点
18、亮。二、实验原理Atmega16有3个外部中断源INT0、INT1和 INT2,分别对应PD2、PD3和PB2。外部中断的原理如图15所示。CPU要实现中断的响应,首先合上中断控制总开关和分开关,其次设置中断触发方式等,然后按要求编制中断服务子程序。图11 外部中断原理图三、实验接线在实训装置上,将PD口与按钮开关的接口用扁平线相连,将PC口与LED接口用扁平线相连。要求PD口设置为输入,并且上拉;PC口设置为输出。 四、实验参考程序 程序一:#include interrupt EXT_INT0 void ext_int0_isr(void) PORTC=0X0F;interrupt EXT
19、_INT1 void ext_int1_isr(void) PORTC=0XF0;void main(void)/I/O口的设置PORTC=0xFF;DDRC=0xFF;PORTD=0xFF;DDRD=0x00;/中断的初始化设置GICR|=0xC0;MCUCR=0x0F;MCUCSR=0x00;GIFR=0xC0;#asm(sei)while (1) 程序二: #include #include bit k1,k2;/设置全局位变量interrupt EXT_INT0 void ext_int0_isr(void)k1=1,k2=0;interrupt EXT_INT1 void ext_i
20、nt1_isr(void) k1=0,k2=1;void main(void) char i;/I/O口的设置PORTC=0xFF;DDRC=0xFF;PORTD=0xFF;DDRD=0x00;/中断的初始化设置GICR|=0xC0; MCUCR=0x0F;MCUCSR=0x00;GIFR=0xC0;#asm(sei)while (1) while(k1) for(i=0;ii);delay_ms(200); while(k2) for(i=0;i8;i+)PORTC=(1i);delay_ms(200); ; 五、实验指导中断服务子程序框架的生成和初始化设置可以通过新建工程文件来建立。具体的
21、操作是:新建工程文件选择芯片选择外部中断按钮先选中断0、设置触发模式为上升沿有效再选中断1、设置触发模式为上升沿有效点击菜单上的文件、选中程序阅览产生中断服务子程序框架选中该程序复制粘贴到C编译软件工程文件下适当地修改,编译、调试即可。实现任务二时,注意变量k1,k2必须是全局位变量。PD口必须接按钮接口设置为输入,这是因为中断0、中断1在PD口。另外有特别注意中断的初始化设置。六、实验扩展读懂本实验程序二,对程序进行修改,按中断0让发光管由中间逐一向两边点亮,按中断1让发光管由两边逐一向中间点亮。实验五 数码管动态扫描显示一、实验目的与任务1实验目的 熟悉8段数码管动态显示数字原理,并能读懂
22、动态扫描程序。 会编制、调试动态扫描程序。 会修改动态扫描程序,使之能符合简单命题要求。 2实验任务任务一:上电后,使八个数码管显示1-8。任务二:上电后,使八个数码管显示0-9999高速循环。任务三:上电后,使八个数码管显示0-FFFF高速循环。三、实验接线用扁平线的两插头分别插入单片机PB口至数码管字形口LEDD插座(AJ4),用扁平线的两插头分别插入单片机PD口至数码管字位口LEDW插座(AJ3),如图16所示。 图12 实验五硬件电路连接图 四、 实验步骤:启动CVAVR编译程序编辑、调试动态扫描程序1。编译、下载程序到实验板。五实验程序清单程序一:#include #include
23、/* 七段译码字形表 */ unsigned char table=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71; /* 显示缓冲区 */unsigned char ledbuff=0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f;/unsigned long xx; /* 8路动态扫描显示子程序*/ void disp(void) unsigned char i; for (i=0;i8;i+) PORTB=ledbuffi ; /共阴数码管字形 P
24、ORTD=(1i); /共阴数码管字位 delay_ms(1); /每个数码管显示延时1mS时间 /* 初始化子程序*/ void init(void) DDRB = 0xff; PORTB = 0xff; DDRD = 0xff; PORTD = 0xff; /* BCD转换1子程序*/ void bcd1(unsigned long xx ) ledbuff0=tablexx%10; ledbuff1=tablexx/10%10; ledbuff2=tablexx/100%10; ledbuff3=tablexx/1000%10; ledbuff4=tablexx/10000%10; le
25、dbuff5=tablexx/100000%10; ledbuff6=tablexx/1000000%10; ledbuff7=tablexx/10000000%10; /* 主程序*/ void main(void) unsigned long aa;/设置长整型变量 init();/口初始化 while (1) aa=12345678;/变量置数 bcd1(aa); disp(); /显示缓冲区的数 程序二:#include #include /* 七段译码字形表 */ unsigned char table=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
26、0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71; /* 显示缓冲区 */unsigned char ledbuff=0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f ;/unsigned long xx,temp; /* 8路动态扫描显示子程序*/ void disp(void) unsigned char i; for (i=0;i8;i+) PORTB=ledbuffi ; /共阴数码管字形 PORTD=(1i); /共阴数码管字位 delay_ms(1); /每个数码管显示延时1mS时间 /* 初始化子程序*/ void init(void) DDRB = 0xff; PORTB = 0xff; DDRD = 0xff; PORTD = 0xff; /*
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1