综合实验一按键控制流水灯实验查询方式Word下载.docx

上传人:b****6 文档编号:16265678 上传时间:2022-11-22 格式:DOCX 页数:12 大小:43.46KB
下载 相关 举报
综合实验一按键控制流水灯实验查询方式Word下载.docx_第1页
第1页 / 共12页
综合实验一按键控制流水灯实验查询方式Word下载.docx_第2页
第2页 / 共12页
综合实验一按键控制流水灯实验查询方式Word下载.docx_第3页
第3页 / 共12页
综合实验一按键控制流水灯实验查询方式Word下载.docx_第4页
第4页 / 共12页
综合实验一按键控制流水灯实验查询方式Word下载.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

综合实验一按键控制流水灯实验查询方式Word下载.docx

《综合实验一按键控制流水灯实验查询方式Word下载.docx》由会员分享,可在线阅读,更多相关《综合实验一按键控制流水灯实验查询方式Word下载.docx(12页珍藏版)》请在冰豆网上搜索。

综合实验一按键控制流水灯实验查询方式Word下载.docx

硬件:

PC机一台、AVR_StudyV1.1实验板

软件:

CodeVisionAVR集成开发软件、SLISP下载软件

四、实验原理

ATmega16芯片有PORTA、PORTB、PORTC、PORTD(简称PA、PB、PC、PD)4组8位,共32路通用I/O接口,分别对应于芯片上32根I/O引脚。

所有这些I/O口都是双(有的为3)功能复用的。

其中第一功能均作为数字通用I/O接口使用,而复用功能则分别用于中断、时钟/计数器、USRAT、I2C和SPI串行通信、模拟比较、捕捉等应用。

这些I/O口同外围电路的有机组合,构成各式各样的单片机嵌入式系统的前向、后向通道接口,人机交互接口和数据通信接口,形成和实现了千变万化的应用。

每组I/O口配备三个8位寄存器,它们分别是方向控制寄存器DDRx,数据寄存器PORTx,和输入引脚寄存器PINx(x=A\B\C\D)。

I/O口的工作方式和表现特征由这3个I/O口寄存器控制。

AVR通用I/O端口的引脚配置情况:

I/O口引脚配置表

DDRXn

PORTXn

PUD

I/O方式

内部上拉电阻

引脚状态说明

X

输入

无效

三态(高阻)

1

有效

外部引脚拉低时输出电流(uA)

输出

推挽0输出,吸收电流(20mA)

推挽1输出,输出电流(20mA)

表中的PUD为寄存器SFIOR中的一位,它的作用相当AVR全部I/O口内部上拉电阻的总开关。

当PUD=1时,AVR所有I/O内部上拉电阻都不起作用(全局内部上拉无效);

而PUD=0时,各个I/O口内部上拉电阻取决于DDRXn的设置。

小结:

(1)使用AVR的I/O口,首先要正确设置其工作方式,确定其工作在输出方式还是输入方式。

(2)当I/O工作在输入方式,要读取外部引脚上的电平时,应读取PINxn的值,而不是PORTxn的值。

(3)当I/O工作在输入方式,要根据实际情况使用或不使用内部的上拉电阻。

(4)一旦将I/O口的工作方式由输出设置成输入方式后,必须等待一个时钟周期后才能正确的读到外部引脚PINxn的值。

(5)正确使用AVR的I/O口要注意:

先正确设置DDRx方向寄存器,再进行I/O口的读写操作。

(6)AVR的I/O口复位后的初始状态全部为输入工作方式,内部上拉电阻无效。

所以,外部引脚呈现三态高阻输入状态。

因此,用户程序需要首先对要使用的I/O口进行初始化设置,根据实际需要设定使用I/O口的工作方式(输出还是输入),当设定为输入方式时,还要考虑是否使用内部的上拉电阻。

(7)在硬件电路设计时,如能利用AVR内部I/O口的上拉电阻,可以节省外部的上拉电阻。

五、实验步骤

1、硬件接线图:

根据图3.2所示,使用杜邦线将AVR_StudyV1.1实验板PA口与LED相连。

图3.2

2、新建工程,实现实验内容1。

根据电路图,LED属于共阳接法,所以PORTA输出低电平时灯点亮。

PORTA初始化:

DDRA=0xFF;

//PA口工作为输出方式

PORTA=0xFF;

//PA口输出全1,LED全灭

“流水灯”程序控制:

1、PA0=0点亮LED0PORTA=0b11111110=~(1<

<

0)

2、PA1=0点亮LED1PORTA=0b11111101=~(1<

1)

3、PA2=0点亮LED2PORTA=0b11111011=~(1<

2)

……

7、PA6=0点亮LED6PORTA=0b10111111=~(1<

6)

8、PA7=0点亮LED7PORTA=0b01111111=~(1<

7)

9、PA0=0点亮LED0PORTA=0b11111110=~(1<

根据控制流程,总结出:

可以利用移位运算实现“流水灯”的设计。

主函数:

voidmain(void)

{

unsignedcharposition=0;

//position为控制位的位置

//PA口输出全1,LED全灭

//PA口工作为输出方式

while

(1)

PORTA=~(1<

position);

if(++position>

=8)position=0;

delay_ms(500);

};

}

3、新建工程,实现实验内容2。

提示:

在CVAVR中,提供intrand(void)和voidsrand(intseed)函数,产生随机数。

函数包含在头文件stdlib.h中,具体内容查阅CVAVR帮助文档。

在每一次读取流水灯程序前检测按键是否按下。

主程序如下

{

//Placeyourcodehere

//PORTA=led_7[count];

//数码管更新显示

switch(readkey())//检测一次按键是否按下,并读取相应的按键程序

caseNO_KEY:

break;

caseKEY1:

//第一种情况

position=0;

i=16;

while(i--)

PORTA=~(0x80>

>

position);

if(++position>

=8)

delay_ms(50);

}

PORTA=0x00;

break;

caseKEY2:

//第二种情况

PORTA=~(0xef<

//若改为PORTA=0xfe<

positionk可实

//现从一个点亮到逐步全部点亮

delay_ms(200);

//延时程序

break;

default:

};

4、下载程序,观察实验现象。

注意熔丝位的配置,选择内部4MHz时钟。

附件:

原程序代码

/*****************************************************

Thisprogramwasproducedbythe

CodeWizardAVRV2.03.4Standard

AutomaticProgramGenerator

Copyright1998-2008PavelHaiduc,HPInfoTechs.r.l.

Project:

Version:

Date:

2009-9-22

Author:

Company:

Comments:

Chiptype:

ATmega16

Programtype:

Application

Clockfrequency:

4.000000MHz

Memorymodel:

Small

ExternalRAMsize:

0

DataStacksize:

256

*****************************************************/

#include<

mega16.h>

delay.h>

//Declareyourglobalvariableshere

flashunsignedcharled_7[16]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,

0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};

unsignedcharposition,i;

#defineNO_KEY0

#defineKEY11

#defineKEY22

#defineKEY1_PIN~PIND.2

#defineKEY2_PIN~PIND.3

unsignedcharreadkey(void)

if(KEY1_PIN)//判断KEY1是否按下

delay_ms(20);

//延时20ms,屏蔽抖动区

if(KEY1_PIN)//再次判断KEY1是否按下

while(KEY1_PIN);

//等待按键释放

returnKEY1;

//返回键值1

elseif(KEY2_PIN)//判断KEY2是否按下

if(KEY2_PIN)//再次判断KEY2是否按下

while(KEY2_PIN);

returnKEY2;

//返回键值2

returnNO_KEY;

//没有按键按下,返回键值0

unsignedcharcount;

//Declareyourlocalvariableshere

//Input/OutputPortsinitialization

//PortAinitialization

//Func7=OutFunc6=OutFunc5=OutFunc4=OutFunc3=OutFunc2=OutFunc1=OutFunc0=Out

//State7=1State6=1State5=1State4=1State3=1State2=1State1=1State0=1

PORTA=0xFF;

DDRA=0xFF;

//PortBinitialization

//Func7=InFunc6=InFunc5=InFunc4=InFunc3=InFunc2=InFunc1=InFunc0=In

//State7=TState6=TState5=TState4=TState3=TState2=TState1=PState0=P

PORTB=0x03;

DDRB=0x00;

//PortCinitialization

//State7=TState6=TState5=TState4=TState3=TState2=TState1=TState0=T

PORTC=0x00;

DDRC=0x00;

//PortDinitialization

PORTD=0x00;

DDRD=0x00;

//Timer/Counter0initialization

//Clocksource:

SystemClock

//Clockvalue:

Timer0Stopped

//Mode:

Normaltop=FFh

//OC0output:

Disconnected

TCCR0=0x00;

TCNT0=0x00;

OCR0=0x00;

//Timer/Counter1initialization

Timer1Stopped

Normaltop=FFFFh

//OC1Aoutput:

Discon.

//OC1Boutput:

//NoiseCanceler:

Off

//InputCaptureonFallingEdge

//Timer1OverflowInterrupt:

//InputCaptureInterrupt:

//CompareAMatchInterrupt:

//CompareBMatchInterrupt:

TCCR1A=0x00;

TCCR1B=0x00;

TCNT1H=0x00;

TCNT1L=0x00;

ICR1H=0x00;

ICR1L=0x00;

OCR1AH=0x00;

OCR1AL=0x00;

OCR1BH=0x00;

OCR1BL=0x00;

//Timer/Counter2initialization

Timer2Stopped

//OC2output:

ASSR=0x00;

TCCR2=0x00;

TCNT2=0x00;

OCR2=0x00;

//ExternalInterrupt(s)initialization

//INT0:

//INT1:

//INT2:

MCUCR=0x00;

MCUCSR=0x00;

//Timer(s)/Counter(s)Interrupt(s)initialization

TIMSK=0x00;

//AnalogComparatorinitialization

//AnalogComparator:

//AnalogComparatorInputCapturebyTimer/Counter1:

ACSR=0x80;

SFIOR=0x00;

count=0;

switch(readkey())

//现从一个点亮到逐步全部点亮

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 其它

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1