北科大单片机实验报告.docx_第1页
北科大单片机实验报告.docx_第2页
北科大单片机实验报告.docx_第3页
北科大单片机实验报告.docx_第4页
北科大单片机实验报告.docx_第5页
已阅读5页,还剩66页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

北京科技大学微机原理及应用实验报告 实验内容:单片机及应用 班 级:智能12 姓 名: 2015年1月5日目 录实验一 avr单片机硬件开发平台1一、实验目的1二、实验内容1三、实验所用仪表及设备1四、实验步骤1了解avr系列单片机1认识avr_studyv1.1实验板的组成模块2五、思考题6六、心得体会7实验二 avr单片机软件开发环境9一、实验目的9二、实验内容9三、实验所用仪表及设备9四、实验步骤9新建项目9编译项目11下载程序11五、思考题13六、实验现象13七、遇到的问题及解决方法14八、心得体会15实验三 i/o口操作实验17一、实验目的17二、实验内容17三、实验所用仪表及设备17四、实验步骤17硬件接线图:17新建工程,实现实验内容1。18新建工程,实现实验内容2。19下载程序,观察实验现象。20五、实验现象21六、思考题22七、遇到的问题及解决方法23八、心得体会23实验四 数码管显示实验25一、实验目的25二、实验内容25三、实验所用仪表及设备25四、实验步骤25新建项目,实现实验内容1。25建立新项目,实现实验内容2。25五、实验现象26六、思考题27七、遇到的问题及解决方法28八、心得体会28实验五 按键实验29一、实验目的29二、实验内容29三、实验所用仪表及设备29四、实验步骤29新建项目29五、实验现象30六、思考题31七、遇到的问题及解决方法33八、心得体会33实验六 外部中断实验35一、实验目的35二、实验内容35三、实验所用仪表及设备35四、实验步骤35新建项目实现实验内容35新建项目实现实验内容237五、实验现象38六、思考题39七、遇到的问题及解决方法40八、心得体会41实验七 定时计数器实验43一、实验目的43二、实验内容43三、实验所用仪表及设备43四、实验步骤43新建工程43普通模式44ctc模式44五、实验现象45六、思考题45七、遇到的问题及解决方法46八、心得体会46选作内容:基于avr mega16单片机的闹表测温仪设计47一、实验目的47二、功能简介47三、功能细节设计47实验设备48端口、功能分配以及硬件连接设计49六、 程序结构设计50七、各功能模块的具体实现53八 源程序55九、实验心得56附录 源程序:57实验一 avr单片机硬件开发平台一、实验目的1了解atmega16单片机的组成。2认识avr_studyv1.1实验板的功能模块。二、实验内容1了解avr系列单片机。2认识avr_studyv1.1实验板的组成模块。三、实验所用仪表及设备硬件:pc机一台、avr_studyv1.1实验板四、实验步骤了解avr系列单片机 avr单片机是atmel公司1997年推出的risc单片机。risc(精简指令系统计算机)是相对于cisc(复杂指令系统计算机)而言的。risc优先选取使用频率最高的简单指令,避免复杂指令;并固定指令宽度,减少指令格式和寻址方式的种类,从而缩短指令周期,提高运行速度。由于avr采用了risc指令,使avr系列单片机具备1mips/mhz(百万条指令每秒/兆赫兹)的高速处理能力。avr单片机吸收了dsp双总线的特点,采用harvard总线结构,因此单片机的程序存储器和数据存储器是分离的,并且可对具有相同地址的程序存储器和数据存储器进行独立的寻址。avr单片机具有良好的集成性能。avr 系列的单片机都具备在线编程接口,其中的 mega 系列还具备jtag仿真和下载功能;都含有片内看门狗电路、片内程序 flash、同步串行接口 spi;多数 avr 单片机还内嵌了 ad 转换器、eeprom、摸拟比较器、定时计数器等多种功能;avr 片机的 i/o 接口具有很强的驱动能力,灌电流可直接驱动继电器、led等器件,从而省去驱动电路,节约系统成本。avr单片机还支持 basic、c 等高级语言编程。采用高级语言是单片机开发的发展趋势。对单片机用高级语言编程可很容易地实现系统移植,更加灵活并加快软件的开发进程。avr 单片机具有多个系列,包括 attiny、at90、atmega。每个系列又包括多个产品,它们在功能和存储器容量等方面有很大的不同,但基本结构和原理都类似,而且编程方也相同。认识avr_studyv1.1实验板的组成模块a区电源a区采用ams1117-5.0低压降三端线性稳压器,输入电压范围为6.512v,输出为5v,为整个实验板的其它模块供电。为方便做实验,将+5v和gnd用排针分别引出。b区lcd1602b区为字符型液晶1602接口模块,只需要将1602液晶插到j12孔内,使用杜邦线从j10处将相关接口与单片机端口相连即可。注意,使用液晶时应将j11短路,为液晶供电。c区八段数码管c区为八段共阴型数码管模块,j1为数码管的八段,高电平点亮。j2和j3为八个数码管的位选,低电平使能。d区led发光二极管d区为8个led发光二极管,采用共阳接法,即低电平点亮。其中电阻为保护led的限流电阻。使用时只需从j7处使用杜邦线引出即可。e区按键按键采用外部上拉电阻,平时j4为高电平,当按键按下时,输出低电平。其中,电容为滤波电容,滤除按键按下时产生的尖峰毛刺。f区ds18b20ds18b20是dallas公司生产的单总线数字温度传感器,具有3引脚to-92小体积封装形式;温度测量范围为55125,可编程为9位12位a/d转换精度,测温分辨率可达0.0625,被测温度用符号扩展的16位数字量方式串行输出;其工作电源既可在远端引入,也可采用寄生电源方式产生;多个ds18b20可以并联到3根或2根线上,cpu只需一根端口线就能与诸多ds18b20通信,占用微处理器的端口较少,可节省大量的引线和逻辑电路。以上特点使ds18b20非常适用于远距离多点温度检测系统。g区adc区g区通过一个滑动变阻器改变j14输出电压,可通过单片机片内ad进行采集。h区e2promat24c02是美国atmel公司的低功耗cmos串行eeprom,采用i2c总线通信,内含2568位存储空间,具有工作电压宽(2.55.5v)、擦写次数多(大于10000次)、写入速度快(小于10ms)等特点。i区蜂鸣器i区为一个无源蜂鸣器。无源蜂鸣器与有源蜂鸣器相比,没有内部驱动电路,如果直接加直流电压,蜂鸣器不会发声。它的理想工作信号为方波信号,且随着频率不同发出不同的声调。大约1k2k,蜂鸣器最响。j区串口j区位串口通信模块,采用maxim公司的max232实现电平转换,以满足rs232标准电平与pc机标准串口连接。其中,两个led为状态指示灯。atmega16最小系统主要包括复位电路、外部晶振、isp下载接口、adc外部参考电压。五、思考题1总结atmega16的特点和性能。avr单片机吸收了dsp双总线的特点,采用harvard总线结构,因此单片机的程序存储器和数据存储器是分离的,并且可对具有相同地址的程序存储器和数据存储器进行独立的寻址。1)先进的risc 结构,131 条指令,大多数指令执行时间为单个时钟周期,32个8 位通用工作寄存器;采用cmos技术,实现高速(50ns)、低功耗(a)、具有sleep(休眠)功能;2)非易失性程序和数据存储器,16k 字节的系统内可编程flash,擦写寿命: 10,000 次真正的同时读写操作,512 字节的eeprom,擦写寿命: 100,000 次,1k字节的片内sram,可以对锁定位进行编程以实现用户程序的加密,高度保密。3)工业级产品。具有大电流1020ma(输出电流)或40ma(吸电流)的特点,可直接驱动led、ssr或继电器。有看门狗定时器(wdt)安全保护,可防止程序走飞,提高产品的抗干扰能力;4)超功能精简指令,具有32个通用工作寄存器,克服了单一累加器数据处理造成的瓶颈现象;5)程序写入器件时,可以使用并行方式写入,也可使用串行在线下载(isp)、在应用下载(iap)方法下载写入;6)通用数字i/o口的输入输出特性与pic的hi/low输出及三态高阻抗hi-z输入类同,同时可设定类同与8051结构内部有上拉电阻的输入端功能,便于作为各种应用特性所需(多功能i/o口),avr的i/o口是真正的i/o口,能正确反映i/o口的输入/输出的真实情况;7)许多avr单片机具有内部的rc振荡器,提供1/2/4/8mhz的工作时钟,使该类单片机无需外加时钟电路元器件即可工作,非常简单和方便;8)有多个带预分频器的8位和16位功能强大的计数器/定时器(c/t),除了实现普通的定时和计数功能外,还具有输入捕获、产生pwm输出等更多的功能;2avr单片机存储器有哪几种类型?有何作用?flash可编程存储,主要用来存放程序。sram,即随机存储器ram,sram数据存储器是以8位(字节)为一个存储单元,编址方式采用与工作寄存器组、i/o寄存器和sram统一寻址的方式。eeprom即电可擦除可编程存储器,eeprom的寿命大于10万次,具有掉电后不丢失数据的特点,并且通过系统程序可以随时修改。eeprom数据存储器也是以8位(字节)为一个存储单元,对其的读写操作都以字节为单位。sram存储单片机运行过程中产生的了临时数据;eeprom视用户的需要而定,eeprom存储器一般用于存放一些永久或比较固定的系统参数。3avr单片机是如何实现高达1mips/mhz的处理能力的?先进的risc 结构131 条指令大多数指令执行时间为单个时钟周期,avr 采用了harvard 结构,具有独立的数据和程序总线。程序存储器里的指令通过一级流水线运行。cpu 在执行一条指令的同时读取下一条指令。4分析a区电容种类和作用。区电容分为有极性和无极性电容,分别对电源起稳压和滤波的作用。六、心得体会通过本次实验我了解了avr的单片机的基本情况,学习了avr的基本特性。对实验中使用的开发板有了基本的认识,了解了使用的电路板中有哪些外围设备,可以实现什么功能。为今后的单片机学习打下了基础。实验二 avr单片机软件开发环境一、实验目的1熟悉codevision avr集成开发环境2掌握单片机c语言开发二、实验内容1在codevision avr软件开发平台下创建一个工程并编译下载。三、实验所用仪表及设备硬件:pc机一台、avr_studyv1.1实验板软件:codevision avr集成开发软件、slisp下载软件四、实验步骤使用codevision avr软件的codewizardavr功能,创建一个简单的工程,编译并下载。新建项目(1)打开codevision avr(版本v2.03.4),打开file-new,选择project-ok,弹出一个confirm对话框,选择yes。如图2.1所示。图2.1(2)在弹出的codewizardavr窗口中进行选择。在chip选项卡中:chip-atmega16,clock-4mhz。在port选项卡中:选择porta,修改bit0为out,output value改为1。如图2.2所示。图2.2(3)在codewizardavr窗口中,file-generate,save and exit,创建新工程。如图2.3所示。图2.3将新生成的源程序(.c),工程文件(.prj),codewizardavr文件(.cwp),保存在一个新建文件夹下。如图2.4所示新生成的源程序。图2.4(4)修改源程序在源程序在开始处添加 #include 。在while(1)处添加四句语句。如图2.5所示。图2.5(5)保存。编译项目选择project-build all(ctrl + f9),弹出information窗口,其中no errors,no warnings表示编译成功。如果出现错误,根据错误提示修改源程序。下载程序由于codevision avr自带的下载软件code programmer修改熔丝位不够灵活,我们选用双龙公司的slisp进行程序下载。(1)打开slisp,在通信参数设置及器件选择项目中,按照图2.7进行设置。图2.7(2)点击flash选项,在工程文件夹下找到exe文件夹,选择xx.hex文件。在弹出的空闲存贮器填充对话框,点击确定。(3)编程选项修改。图2.9(4)配置熔丝位:点击编程选项中配置熔丝。切换到设置设置导航模式,如图2.10所示。图2.10选择int.rc osc.4mhz;start-up time:6 ck + 64ms这一项;其余项不要修改。此时右上角配置位数值变为:e3 99 ff。点击确定。(5)检查实验板j5、j6短路帽是否插上,没有要插上。将下载器与pc机并口相连,另一端连接实验板isp接口。使用杜邦线将d区任意一个led灯与pa0相连。检查无误后上电。(6)点击编程,如图2.11所示为编程成功。观察led,发现它在一闪一闪。图2.11五、思考题1用codewizardavr创建工程的有什么优点?codewizardavr有特定功能的头文件,可以直接调用,不用再去编写一些程序,比如delay.h等。codewizardavr中的工程向导可以省去很多的初始化的代码,以及程序的框架。codewizardavr中的中断函数可以提供自动的现场保护和断点回复功能,可以方便的使用中断。2创建工程的过程中应注意哪些问题?应注意正确配置各参数,以及目标芯片,防止配置错误,导致程序无法正常工作,甚至损坏电路板。3 avr熔丝位有哪些作用?编程时应注意哪些问题?(特别注意时钟及加密)熔丝是一个保护知识产权的设计。烧断熔丝后,片内的程序就不可以被读出来也不能被改写,只能用来运行。avr芯片使用熔丝来设定时钟、启动时间、一些功能的使能、boot区设定、当然还有最让初学者头疼的保密位,烧录程序时需要设定好熔丝位,不然设不好会锁芯片。六、实验现象led灯一闪一灭,间隔时间为半秒钟七、遇到的问题及解决方法1、我的电脑是64位,安装codeversion总是失败,于是我安装的atmelstudio,编程的时候需要设置cpu频率,头文件也与codeversion不同,比如。具体如下:2、下载器和烧录软件也与实验室不同:下载器:usbasp烧录器:八、心得体会本次实验,我学习了单片机的软件环境。使用codevision avr软件的工程创建向导功能,创建了一个简单的工程,编译并下载。在此过程中的设置是:chip-atmega16,clock-4mhz。按照需要配置各io端以及定时器等。编译后,要注意观察information窗口,观察是否有错误或警告以及它们所在的位置。下载过程中,一定要保证单片机与pc机连接正确,即串口连接好且单片机上电。实验三 i/o口操作实验一、实验目的1掌握atmega16 i/o口操作相关寄存器2掌握 codevision avr软件的使用3. 复习c语言,总结单片机c语言的特点二、实验内容1. 设计一个简单控制程序,功能是8个led逐一循环发光0.5s,构成“流水灯”。2. 设计一个4种闪烁方式交替循环的彩灯,闪烁方式如图3.1所示:8个led逐一点亮0.5s,左移循环2轮(16次)控制初值=&b111111108个led逐一点亮0.5s,右移循环2轮(16次)控制初值=&b011111118个led随机点亮,每次0.5s,共16次控制值=随机数8个led间隔点亮0.5s,明暗交替16次控制初值=&b10101010图3.1 4种不同控制方式的转换图三、实验所用仪表及设备硬件:pc机一台、avr_studyv1.1实验板软件:codevision avr集成开发软件、slisp下载软件四、实验步骤硬件接线图:根据图3.2所示,使用杜邦线将avr_studyv1.1实验板pa口与led相连。图3.2新建工程,实现实验内容1。根据电路图,led属于共阳接法,所以porta输出低电平时灯点亮。porta初始化:ddra = 0xff; /pa口工作为输出方式porta = 0xff; / pa口输出全1,led全灭“流水灯”程序控制:1、pa0 = 0 点亮led0 porta = 0b11111110 = (1 0)2、pa1 = 0 点亮led1 porta = 0b11111101 = (1 1)3、pa2 = 0 点亮led2 porta = 0b11111011 = (1 2)7、pa6 = 0 点亮led6 porta = 0b10111111 = (1 6)8、pa7 = 0 点亮led7 porta = 0b01111111 = (1 7)9、pa0 = 0 点亮led0 porta = 0b11111110 = (1 0)根据控制流程,总结出:可以利用移位运算实现“流水灯”的设计。主函数:void main(void)unsigned char position = 0;/ position为控制位的位置porta = 0xff;/ pa口输出全1,led全灭ddra = 0xff;/ pa口工作为输出方式while (1)porta = (1= 8) position = 0;delay_ms(500);新建工程,实现实验内容2。提示:在cvavr中,提供int rand (void)和void srand(int seed)函数,产生随机数。函数包含在头文件stdlib.h中,具体内容查阅cvavr帮助文档。其中task1(),task2(),task3(),task4()分别完成框图中要求的功能。void task1(void) unsigned char position,i; position = 0; i = 16; while(i-) porta = (0x80 position); if(+position = 8) position = 0; delay_ms(500); porta=0xff;void task2(void) unsigned char position,i; position = 0; i = 16; while(i-) porta = (1 = 8) position = 0; delay_ms(500); porta=0xff;void task3(void) bit position; unsigned char i; position = 1; i = 16; while(i-) if(position) porta = 0b10101010; else porta = 0b01010101; position = !position; delay_ms(500); porta=0xff;void task4(void) unsigned char i; i = 16; while(i-) porta = (unsigned char)rand(); delay_ms(500); porta=0xff; void main(void) porta=0xff; ddra=0xff; while (1) task1(); delay_ms(500); task2(); delay_ms(500); task3(); delay_ms(500); task4(); delay_ms(500); ;下载程序,观察实验现象。注意熔丝位的配置,选择内部4mhz时钟。五、实验现象实验内容流水灯从左往右依次亮和熄灭实验内容四种状态交替六、思考题1、总结avr i/o口的特点及编程流程。作为通用数字i/o 使用时,所有avr i/o 端口都具有真正的读- 修改- 写功能。这意味着用sbi 或cbi 指令改变某些管脚的方向( 或者是端口电平、禁止/ 使能上拉电阻) 时不会无意地改变其他管脚的方向( 或者是端口电平、禁止/ 使能上拉电阻)。输出缓冲器具有对称的驱动能力,可以输出或吸收大电流,直接驱动led。所有的端口引脚都具有与电压无关的上拉电阻。用户程序需要首先对要使用的i/o口进行初始化设置,根据实际需要设定使用i/o口的工作方式(输出还是输入)。数据寄存器portx:当ddrx为1,作为输出引脚时,写入引脚要输出的电平状态,作为输出引脚可输出高低电平。当ddrx为0作为输入引脚时,可配置上拉电阻.端口输入引脚pinx:只读寄存器。可以用来读取外部电平的变化。2)当ddrx=1时,i/o口处于输出工作方式,portx = 1,输出高电平;portx = 1,输出低电平;3)当ddrx=0时,i/o口处于输入工作方式,portx = 1,输入,使能内部上拉电阻,portx =0,高阻态。pinx的值代表端口输入值。2、复习c语言位运算相关内容。3、查阅相关资料,总结随机数、伪随机数,并举例说明在实际中的应用。真随机数是使用物理现象产生的,伪随机数通过一个固定的、可以重复的计算方法产生。如使用随机数表等方式产生,其中在c语言中,使用的是伪随机数,产生时如果没有进行随机数种子的设置,将会在不同次的运行中产生相同的随机序列。随机数在一些概率模拟,随机算法,如遗传算法,随机重新开始的爬山法等算法中有很多应用。4、修改实验内容一,实现从左到右依次先点亮一个发光二极管,再点亮两个,八个全部点亮,然后一个一个依次熄灭。while (1) / place your code here porta =0b11111110;while(porta) delay_ms(500); porta =porta1; porta =0b11111110; while(porta != 0xff)porta=(porta1); ;七、遇到的问题及解决方法在寝室自己电脑上做实验时,led灯亮和灭切换非常慢,我始终没搞清是怎么回事,于是将源程序中的delay_ms=500,改得很小,这样就切换得快了。后来发现是因为在使用自己电脑的烧录软件时没有配置熔丝位,八、心得体会通过实验实现8个led逐一循环发光的“流水灯”,以及设计出了一个4种闪烁方式交替循环的彩灯。在完成了硬件部分的连接工作后,在软件环境下,进行程序的改写。由于led属于共阳极接法,所以porta输出低电平时灯点亮,“流水”效果由移位运算实现。实验二,对四种显示方法分别编写相应的子函数代码,并在主函数中一次调用。下载程序过程中,选择内部4mhz时钟。本次实验,着重对各端口使用部分的操作练习。通过实验指导书的讲解,我了解到使用端口使led灯闪亮的操作原理,并在实验操作中,对实验内容二增加了新的闪烁方式。空白页实验四 数码管显示实验一、实验目的(1)掌握atmega16的i/o输出特性和使用。(2)了解数码管的内部结构,掌握数码管动态扫描的原理和设计方法。二、实验内容(1)单个数码管字符显示,控制一个数码管循环显示显示“0”“f”16个字符。(2)综合实验:设计一个秒表系统。三、实验所用仪表及设备硬件:pc机一台、avr_studyv1.1实验板软件:codevision avr集成开发软件、slisp下载软件四、实验步骤新建项目,实现实验内容1。建立数码管字型字段编码表(共阴数码管):flash unsigned char led_716=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71;关键字flash表示将数据存放到flash中,led_7数组中的量都是固定值,将它们存放到flash中不会占用有限的ram资源。数码管要显示0,使用下面语句:porta = led_70;建立新项目,实现实验内容2。硬件连接图如图4.3所示。图4.3数码管的动态显示函数:void display(void)/ 扫描显示函数,执行时间12mschar i; for(i=0;i=5;i+)porta = led_7dis_buffi; if (point_on & ( i=2 | i=4 ) porta |= 0x80;portc = positioni; delay_ms(2); portc = 0xff; 注意:pc端口与jtag功能复用,因为jtag使能时,pc2、3、4、5不能做i/o口用,所以必须禁止jtag。禁止jtag有两种方法:一是修改熔丝位 jtagen = 1;二是使用下面语句。/禁止jtag,注意要连续执行两次,原因参考数据手册mcucsr |= 0x80;mcucsr |= 0x80;五、实验现象实验内容1实验内容2六、思考题1、数码管如何显示特殊符号,如p、q、l、h等?只要对应的一段给予高电平点亮,即可自己组合出各种符号。如给:0b00110001显示p,0b1100011显示l,0b10010001显示h,00011001显示q等2、修改程序,控制一个8段数码管循环显示0f 16个字符,每个字符显示1s,并在显示的1s内,数码管的小数点要亮0.5s,灭0.5s。flash unsigned char led_716=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71;void display(void)char i; for(i=0;i=15;i+)porta = led_7i; porta |= 0x80;portc = position1; delay_ms(500); porta |= 0x00;delay_ms(500); portc = 0xff; 七、遇到的问题及解决方法进行实验内容2时,只有5个数码管显示,但是我每个数码管都是接了线的。经过仔细检查,我发现我是从mega16最下面的接口开始接的,于是错开了一位,第六根线接到另外的接口上了,于是便只显示五位。重新校对接线,问题便解决了。八、心得体会通过本次试验,我设计实现单个数码管字符显示,控制一个数码管循环显示“0”“f”16个字符功能的电路。同时了设计一个综合实验秒表系统。为了方便的再程序中使用显示的数码管的数值,我们制作了一个显示表,以方便之后的使用。flash unsigned char led_716=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71;关键字flash表示将数据存放到flash中,led_7数组中的量都是固定值,将它们存放到flash中不会占用有限的ram资源。本次实验,我学习到八段数码管的显示方法,并根据字型段码对照表,成功编写代码,实现实验要求。实验五 按键实验一、实验目的(1)掌握atmega16的i/o输出特性和使用。(2)了解按键的使用,及按键消抖的原理与实现。二、实验内容(1)单个按键实验,按键控制数码管显示0 9,每按一次按键key1,数码管显示的数值加1;每按一次按键key2,数码管显示的数值减1。三、实验所用仪表及设备硬件:pc机一台、avr_studyv1.1实验板软件:codevision avr集成开发软件、slisp下载软件四、实验步骤新建项目硬件连接图如图5.3所示。图5.3读取键值的函数:#define no_key 0#define key1 1#define key2 2#define key1_pin pind.2#define key2_pin pind.3unsigned char readkey(void) if(key1_pin) /判断key1是否按下 delay_ms(20); /延时20ms,屏蔽抖动区 if(key1_pin) /再次判断key1是否按下 while(key1_pin); /等待按键释放 return key1; /返回键值1 else if(key2_pin) /判断key2是否按下 delay_ms(20); /延时20ms,屏蔽抖动区 if(key2_pin) /再次判断key2是否按下 while(key2_pin); /等待按键释放 return key2; /返回键值2 return no_key; /没有按键按下,返回键值0说明:pind.2就表示pind的第二位,在头文件mega16.h中已给我们定义好,我们可以很方便地操作8位寄存器的每一位。如porta.7 = 1;/将porta的第7位置1,不影响其它位。它相当于porta |= (1 = 40) time_counter = 0; point_on = point_on; if (+time0 = 60) time0 = 0; if (+time1 = 60) time1 = 0; if (+time2 = 24) time2 = 0; time_to_disbuffer(); else if(readkey()=2) time_to_disbuffer(); delay_ms(13); / 延时13ms,可进行其它处理;(2)在按键的处理过程中,除了要进行消抖处理,还要判别按键的释放,如果不进行按键释放的判别,将会发生什么现象?由于按键是机械结构,人手在按键的时候,由于抖动和按键触点的原因会产生多个上升沿和下降沿,导致单片机误认为按键受到了多次操作。因此要进行消抖处理和检测按键释放。如果没有消抖处理,按键一次会响应多次。如果没有按键释放,单片机误认为已经完成一次按键操作便进行下一次,只要按键未放开就会一直当做有按键事件进行处理,因此也会响应多次。七、遇到的问题及解决方法1、一开始按键时示数并不是加一或者减一,纳闷为什么会这样,就检查源程序是不是出错了,后来就想起学数电时设计模拟电路时都要进行消抖处理,于是反应过来,程序中也要加入消抖处理的程序。八、心得体会通过实验,学习了对按键的查询读取方式,实现了显示的修改功能:按键控制数码管显示0 9,每按一次按键key1,数码管显示的数值加1;每按一次按键key2,数码管显示的数值减1。根据电路图,完成实物连接。编写代码时要注意考虑按键消抖,软件方式消抖的基本原理是在软件中对按键进行两次测试确认,既在第一次检测到按键按下后,间隔10ms左右再次检测该按键是否按下,只有在两次都测到按键按下时才最终确认有键按下,从而消除了抖动的影响。除了要考虑按键消抖外,一般还要判别按键的释放,只有检测到按键释放以后,才能确定为一次完整的按键动作完成。实验六 外部中断实验一、实验目的(1)了解中断的作用。(2)了解atmega16中断系统和中断源。(3)掌握atmega16的外部中断的使用方法。(4)掌握codevision avr中断程序的编写。二、实验内容(1)按键控制数码管显示0 9,每按一次按键key1,数码管显示的数值加1;每按一次按键key2,数码管显示的数值减1。(key1int0;key2int1)(2)外部中断唤醒cpu实验,使用外部中断0唤醒掉电模式下的cpu。三、实验所用仪表及设备硬件:pc机一台、avr_studyv1.1实验板软件:codevision avr集成开发软件、slisp下载软件四、实验步骤新建项目实现实验内容硬件连接如图6-2所示。图6-2建议使用codevision avr中的程序生成向导功能(codewizardavr)来帮助你建立中断程序的框架,图6-3为cvavr中利用程序生成向导功能配置产生外部中断初始化部分的界面。图6-3外部中断初始化部分:使能int0和int1,都是下降沿产生中断。/ external interrupt(s) initialization/ int0: on/ int0 mode: falling edge/ int1: on/ int1 mode: falling edge/ int2: offgicr|=0xc0;mcucr=0x0a;mcucsr=0x00;gifr=0xc0;int0中断服务函数:/ external interrupt 0 service routineinterrupt ext_int0 void ext_int0_isr(void)/ place your code hereif(+count 9) count = 0;int1中断服务函数:/ external interrupt 1 service routineinterrupt ext_int1 void ext_int1_isr(void)/ place your code hereif(count- = 0) count = 9;新建项目实现实验内容2硬件连接不变(如图6-2)。关于mcu睡眠模式:睡眠模式可以使应用程序关闭 mcu 中没有使用的模块,从而降低功耗。 avr 具有不同的睡眠模式,允许用户根据自己的应用要求实施剪裁。进入睡眠模式的条件是置位寄存器 mcucr 的 se,然后执行 sleep 指令。具体哪一种模式(空闲模式、adc噪声抑制模式、掉电模式、省电模式、standby模式和扩展standby模式 ) 由 mcucr 的 sm2、sm1 和 sm0 决定(具体参考数据手册电源管理及睡眠模式)。使能的中断可以将进入睡眠模式的 mcu 唤醒。经过启动时间,外加 4 个时钟周期后,mcu 就可以运行中断例程了。然后返回到 sleep 的下一条指令。唤醒时不会改变寄存器文件和 sram 的内容。如果在睡眠过程中发生了复位,则 mcu 唤醒后从中断向量开始执行。cvavr为我们提供了头文件sleep.h,供我配置不同的睡眠模式:void sleep_enable(void) 该函数使能mcu进入睡眠模式。void sleep_disable(void) 该函数禁止mcu进入睡眠模式。void idle(void) 该函数使mcu进入空闲模式。void powerdown(void) 该函数使mcu进入掉电模式。void powersave(void) 该函数使mcu进入节电模式。void standby(void) 该函数使mcu进入standby模式。void extended_standby(void) 该函数使mcu进入扩展standby模式。例如本例中我们配置mcu进入掉电模式:#include sleep_enable();powerdown();我们利用int0低电平中断来唤醒mcu。配置如下:/ external interrupt(s) initialization/ int0: on/ int0 mode: low level/ int1: off/ int2: offgicr|=0x40;mcucr=0x00;mcucsr=0x00;gifr=0x40;中断

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论