流水灯控制实验报告

  • 格式:docx
  • 大小:112.12 KB
  • 文档页数:8

《电子与控制系统设计》实验报告 实验项目名称: LED 灯的移动控制

指导老师: 元泽怀 完成时间: 2015年 9月 22日

姓名: 刘文开 班级: 12 电气 1班 学号: 201224122116

成绩:

电子信息与机电工程学院 编制 实验 项目 LED 灯的移动控制

验证 实验项目类型 演示 综合 设计 其他 * 一、实验目的 1. 熟悉 IO 接口的设置与应用; 2. 进一步熟悉编译软件和下载软件的使用; 3. 熟悉单片机 C 语言中移位、延时、数组等语句的应用; 4. 熟悉单片机 C 语言开发过程。

二、实验内容 1. 编写一程序, 实现如下功能: 每按一次 S1 键, 8 个发光二极管顺序点亮 1 个; 同样每按下 S2 键一次, 8 个发光二极管逆序点亮 1 个, 实验电路原理 图如下图 1 所示。实现发光二极管循环点亮的按键控制。

2. 设计一个完整程序 (另建一个 project ) , 实现 8 个 led 灯的自动顺序

(加法) 点亮和逆序(减法)点亮。

图 1 实验原理图 三、使用仪器设备及材料 1、安装 windows xp 操作系统的微型计算机 1 台

2、AVR单片机 C语言集成开发环境 ICCAVR6.31A

3、单片机仿真平台 proteus7.5

4、AVR单片机下载软件 progisp

5、AVR单片机实验板 1 套(含下载器)

四、实验过程原始记录 1、硬件仿真电路 ( 1)在实验室电脑 E 盘“ 12 电气 1 班 刘文开”文件夹里新建一个文件名为 “ test1 ”的文件夹。 ( 2)打开 protues 仿真软件,根据图 1 设计出试验仿真图, 命名为“test1.DSN ” 保存到上述“ test 的文件夹里”。

U1 9 RESET PC0/SCL 22 23 PC1/SDA 12 24 XTAL1 PC2/TCK

13 25 XTAL2 PC3/TMS 26 PC4/TDO 40 27

PA0/ADC0 PC5/TDI 39 28 PA1/ADC1 PC6/TOSC1 38 29 PA2/ADC2 PC7/TOSC2 37 PA3/ADC3 36 14 PA4/ADC4 PD0/RXD

35 15 PA5/ADC5 PD1/TXD 34 16 PA6/ADC6 PD2/INT0 33 17 U2 PA7/ADC7 PD3/INT1 18

PD4/OC1B 1 20 1 19 PB0/T0/XCK PD5/OC1A 2 19 2 20 PB1/T1 PD6/ICP1 3 18 3 21

PB2/AIN0/INT2 PD7/OC2 4 17 4 PB3/AIN1/OC0 5 16 5 PB4/SS 6 15 6 PB5/MOSI 7 14 7 32 PB6/MISO AREF

8 13 8 30 PB7/SCK AVCC

9 12 10 11ATMEGA16

LED-BARGRAPH-RED

图 2 实验仿真电路图

9 U1 22 RESET PC0/SCL

23 PC1/SDA 12 24 XTAL1 PC2/TCK

13 25 XTAL2 PC3/TMS 26

PC4/TDO 40 27 PA0/ADC0 PC5/TDI 39 28 PA1/ADC1 PC6/TOSC1 38 29 PA2/ADC2 PC7/TOSC2 37 PA3/ADC3 36 14 PA4/ADC4 PD0/RXD 35 15 PA5/ADC5 PD1/TXD

34 16 PA6/ADC6 PD2/INT0

33 17 U2 PA7/ADC7 PD3/INT1 18 PD4/OC1B

1 20 1 19 PB0/T0/XCK PD5/OC1A

2 19 2 20 PB1/T1 PD6/ICP1

3 18 3 21 PB2/AIN0/INT2 PD7/OC2

4 17 4 PB3/AIN1/OC0 5 16 5 PB4/SS 6 15 6 PB5/MOSI

7 14 7 32 PB6/MISO AREF 8 13 8 30 PB7/SCK AVCC 9 12

10 11 ATMEGA16

LED-BARGRAPH-RED

图 3 实验仿真电路图 2、程序流程图 (1) .LED 控制移动流程图:

开始

初始化、定义 I/O 端口

Y N S1 按下? Y 计数器 counter++ Counter>8? Y 第一个 LED 灯点亮 是否有按键按 Y 下? S2 按下? Y 计数器 counter-- Counter<0? N Y 最后一个 下一个 LED 灯点亮 LED 灯点亮 N

上一个 LED灯

点亮 2).LED 自动循环流程图: 开始 初始化、定义 I/O 口 i = 0 i = i+1 N i<8?

Y PORTB=~(1< #define uchar unsigned char #define uint unsigned int uchar temp; //******* 延时函数 ********// void delay_ms(uint k) { i = i - 1

N i>0?

Y PORTB=~(1

//***************** 端口设置函数 ********************//

void port_init(void) { DDRB = 0xFF; //B 端口设置为输出

PORTD = 0XFF; // 输出高电平

DDRD = 0x00; //D

PORTD = 0XFF; // 端口设置为输入

输出高电平 }

//********* 主函数 *********// void main(void) { char counter=0; // port_init(); while(1)

计数器 // 调用端口函数

{ if((PIND&0x10)==0) { if(++counter>8) counter=1; delay_ms(300); } if((PIND&0x20)==0) { counter = counter--; if(--counter<1) counter=8; delay_ms(300); } switch(counter) { case 1: PORTB=0xfe;break; case 2: PORTB=0xfd;break; case 3: PORTB=0xfb;break; case 4: PORTB=0xf7;break; case 5: PORTB=0xef;break; case 6: PORTB=0xdf;break; case 7: PORTB=0xbf;break; case 8: PORTB=0x7f;break; default:break; } } } (2). 自动循环程序:

#include #define uchar unsigned char #define uint unsigned int

//********** 延时函数 **********// void delay_ms(uint k) { uint i,j; for(i=0;i{ for(j=0;j<1140;j++); } }

//***************** 端口设置函数 ********************//

void port_init(void) { DDRB = 0xFF; //B 端口设置为输出

PORTD = 0XFF; // 输出高电平

DDRD = 0x00; //D

PORTD = 0XFF; // 端口设置为输入

输出高电平 }

//********* 主函数 *********// void main(void) { unsigned char i; char counter=0; // port_init(); // 计数器

调用端口函数

while(1){ for(i=0;i<8;i++){ PORTB =~(10;i--){ PORTB =~(1