西安交通大学电子系统设计专题实验Word下载.docx

上传人:b****3 文档编号:18257145 上传时间:2022-12-14 格式:DOCX 页数:17 大小:465.57KB
下载 相关 举报
西安交通大学电子系统设计专题实验Word下载.docx_第1页
第1页 / 共17页
西安交通大学电子系统设计专题实验Word下载.docx_第2页
第2页 / 共17页
西安交通大学电子系统设计专题实验Word下载.docx_第3页
第3页 / 共17页
西安交通大学电子系统设计专题实验Word下载.docx_第4页
第4页 / 共17页
西安交通大学电子系统设计专题实验Word下载.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

西安交通大学电子系统设计专题实验Word下载.docx

《西安交通大学电子系统设计专题实验Word下载.docx》由会员分享,可在线阅读,更多相关《西安交通大学电子系统设计专题实验Word下载.docx(17页珍藏版)》请在冰豆网上搜索。

西安交通大学电子系统设计专题实验Word下载.docx

7.导入原理图,将元件合理放置,原则:

组合功能的元件(键盘开关)有序放置在一起,使得各个元件布线交叉尽可能的少。

8.对电路板自动布线,进行规则检查,注意检查PCB有没有缺线、缺元件的情况修改错误的地方,并注意印刷线路的宽度设置,不宜太宽。

9.重复步骤8,对电路板布局不断进行修改优化,直到PCB的规则检查没有警告、错误,电路板元件布局思路清晰,布线方式正确合理。

10.对工程文件进行保存,完成整个硬件设计流程。

五、实验结果

1.整体电路原理图如图

2.PCB图如下图(手动放置元件位置,自动布线):

六、实验总结

硬件是设计的基础,认真学习掌握硬件设计的原理有助于更好的在软件层面进行设计。

同时一个正确标准的项目设计方案,方便设计人员阅读的同时,可以更高效的实现加工。

将理论上的电路原理图真真实实的做成了可以加工生产的电路板,又一次真切的感受到了理论与实际的联系。

电路图不再仅仅是停留在纸面和考试中的分析对象,更是可以加工成为电路板,是设计实现实际功能的基础。

布线过程中,看着元件之间密密麻麻的线路,也深切体会到优秀的设计对于实际生产的重要性,对于实现的难易程度,容错能力,产品性能等多方面都有着重大的影响。

这就要求设计人员,不仅仅是能够实现产品的功能,而是尽可能将设计做到最好。

这也对我们学习提出了更高的要求,做一件事情不难,难的是做好一件事情。

实验二、按键灭灯软件程序设计

一.实验目的和任务要求

根据规则要求实现按键灭灯小游戏的基本功能,演示游戏过程并计算显示最终游戏结果。

规则:

1.LED灯随机地出现;

每次闪一个灯;

2.在1s内按键可以把灯灭掉;

3.超时没按键或按错键,则灯换一个位置;

4.每灭一个灯,马上会闪亮另外一个灯;

5.计算10次灯的分数。

比如按错一次-5;

超时一次-3;

及时灭一次+1-3分。

使用timer来计时比较准确。

显示结果。

二.实验设备及软件开发环境

1.单片机平台:

AVRATmega128实验开发板;

2.开发环境平台:

计算机,WindowsXP操作系统,软件开发平台:

AVRStudio4.16集成开发软件;

WinAVR(GCC)20080610C语言编译器;

下载编程工具:

JTAGICEmkII在线仿真器;

三.实验的电路原理

1.LED指示灯的硬件电路连接如下图所示。

2.数码管硬件电路连接如下图所示。

3.矩阵键盘硬件电路连接如图6-1所示。

按键灭灯程序由以上三大部分构成,将led灯与键盘按键编码对应起来,实现按键对led灯的控制,最后将总得分显示在数码管上。

软件设计的难度不大,主要在于led灯与键盘按键端口的对应。

四.软件设计及关键过程分析

PORTE|=(1<

<

PE3);

使PA3输出高电平,使蜂鸣器鸣叫

延迟一段时间之后关闭蜂鸣器

软件设计流程图

中断计时函数

SIGNAL(SIG_OUTPUT_COMPARE1A)

调用函数ledkeepping(){

PORTB=~random[number];

}

数码管显示

PORTB=code[calculate()(number)];

其中,calculate函数计算相应位码显示得分

五.程序运行结果

1.根据随机数组random[10]使得led灯“随机”亮起

2.十次亮灯结束,数码管显示总得分

六.实验总结

软件编程设计的难度不大,关键在于如何使得led灯与键盘按键端口对应,并实现按键正确时将对应的led灯“灭掉”。

具体实现时,采取当按键正确就切换到下一个随机led灯,而不是去改变按键对应的led灯的端口值,一定程度上使得问题简化。

程序采用将学过的知识模块联合,主要由led灯,键盘,数码管三部分构成。

实验中也发现了一些问题:

当按键时间过长时,可能使得下一个led灯亮时也判断到了该按键已经按下,错误的记录下该按键,得分记录不准确。

处理思路:

当下一个led灯亮起,且判断到有按键按下时,判断按键是否与之前按键编码相同,如果不同,则为一次独立的按键;

如果相同,则为上一个led灯的延迟按键,需重新对键盘进行一次scan。

附录1软件源代码

#include<

avr/io.h>

util/delay.h>

stdio.h>

avr/signal.h>

#include"

digitron.h"

#defineLINE1_SCAN()PORTC=(PORTC|_BV(PC7))&

~_BV(PC6)

#defineMASK0xFF

led.h"

uint8_tcode[10]={0xC0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,

0x80,0x90

};

uint8_trandom[11]={0x01,0x04,0x02,0x10,0x40,0x80,0x02,0x08,

0x80,0x20,0x40

uint8_tled_sel=0x01;

intnumber=1,grade=0,count=0;

intcom=1;

voidsystem_init()//系统初始化

{

//关闭8个LED灯

DDRB=0xff;

//设置PB端口为输出

DDRC|=_BV(PC5);

//设置PC5为输出

PORTC|=_BV(PC5);

//置PC5为高电平,使能led锁存

PORTB=0xff;

//关闭8个led灯

PORTC&

=~_BV(PC5);

//PC5置低,关闭led锁存器器

PORTB=PB_MASK;

DDRB=PB_MASK;

PORTC|=_BV(LED_CS);

DDRC|=_BV(LED_CS);

//关闭数码管显示

DDRG|=_BV(PG3);

//设置PG3为输出,PG3控制数码管的位选择锁存器;

DDRG|=_BV(PG4);

//设置PG4为输出,PG4控制数码管的段码锁存器;

PORTG|=_BV(PG3);

//使能数码管位选择锁存器

PORTG&

=~_BV(PG4);

//关闭字型码锁存器

//设置端口PB为输出

PORTB=0x00;

//送数码管位码

=~_BV(PG3);

//关闭数码管位选择锁存器

PORTG|=_BV(PG4);

//使能段码锁存器

//送段码

//关闭段码锁存器

//关闭蜂鸣器

DDRE|=_BV(PE3);

PORTE|=_BV(PE3);

//喇叭电路断开,喇叭停止鸣响

}

voidDIG_Init()

PORTB=~PB_MASK;

=0x00;

DDRG|=_BV(DIG_CS1)|_BV(DIG_CS2);

voidKP_Init()

//CHIP_Init();

系统端口初始化

DDRB=0xFF;

DDRC=0xFF;

DDRD=0xFF;

DDRE=0xFF;

DDRF=0xFF;

DDRG=0xFF;

PORTD=0x00;

PORTE=0x08;

PORTF=0x00;

PORTC|=0x20;

PORTB=0xFF;

PORTC=0x02;

PORTG|=0x18;

PORTG=0x00;

//键盘端口初始化

=0x3F;

DDRC|=0xC0;

DDRB=0x00;

uint8_tKP_read()

_delay_ms(10);

asm("

nop"

);

uint8_tread=PINB;

returnread;

uint8_tKP_scan()

uint8_tcode=MASK;

uint8_tkey=MASK;

//scanthefirstline

LINE1_SCAN();

code=KP_read();

if(code!

=MASK)

{

switch(code)

case0xFE:

key=0x01;

break;

case0xFD:

key=0x02;

case0xFB:

key=0x04;

case0xF7:

key=0x08;

case0xEF:

key=0x10;

case0xDF:

key=0x20;

case0xBF:

key=0x40;

case0x7F:

key=0x80;

//ifnokeyispressed,return0x00

returnkey;

voidLED_Init()

intcalculate(intnumber)

switch(number)

case0:

returngrade/10;

case1:

returngrade%10;

default:

return10;

//亮灯程序不变k;

voidledkeepping()

LED_Init();

PORTB=~random[number];

_delay_ms(5);

//亮灯程序

voidswitchLed()

TCNT1H=0x00;

//T/C1计数值清零

TCNT1L=0x00;

number=number+1;

count=count+1;

if(number==10)

number=1;

if(count>

10)

TCCR1B=0x00;

//中断程序

grade=grade+2;

switchLed();

voidDIG_Dispaly();

com=1;

for(number=0;

number<

2;

number++)

PORTG|=_BV(DIG_CS2);

=~_BV(DIG_CS1);

PORTB=code[calculate()(number)];

PORTG|=_BV(DIG_CS1);

=~_BV(DIG_CS2);

PORTB=com;

com*=2;

_delay_ms

(2);

intmain(void)

system_init();

//系统初始化

PORTE|=(1<

//使PA3输出高电平,使蜂鸣器鸣叫

_delay_ms(100);

//使PA3输出高电平,使蜂鸣器不响

//中断控制寄存器清零,停止T/Cl计数

OCR1AH=0xAA;

//设置8MHz、256分频、定时1s的比较值,

OCR1AL=0x12;

//与TCNTl的计数值进行比较,若匹配产生中断

TCCR1A=0x00;

//T/C1普通端口模式

TCCR1B=0x04;

//启动定时器T/C1,256分频

TIMSK|=0x10;

//使能C/Tl比较匹配中断

sei();

//允许全局中断

while

(1)

if(count<

KP_Init();

uint8_tled_press,led_temp;

led_press=KP_scan();

ledkeepping();

led_temp=KP_scan();

if(led_press!

=MASK)

=led_temp)

if(led_press==random[number])

grade=grade+5;

else

grade=grade+0;

_delay_ms

(1);

DIG_Init();

//数码管初始化

DIG_Dispaly();

//数码管显示得分

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

当前位置:首页 > 经管营销 > 人力资源管理

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

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