西安交通大学电子系统设计专题实验Word下载.docx
《西安交通大学电子系统设计专题实验Word下载.docx》由会员分享,可在线阅读,更多相关《西安交通大学电子系统设计专题实验Word下载.docx(17页珍藏版)》请在冰豆网上搜索。
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();
//数码管显示得分