西安交通大学电子系统设计专题实验DOC.docx
《西安交通大学电子系统设计专题实验DOC.docx》由会员分享,可在线阅读,更多相关《西安交通大学电子系统设计专题实验DOC.docx(17页珍藏版)》请在冰豆网上搜索。
![西安交通大学电子系统设计专题实验DOC.docx](https://file1.bdocx.com/fileroot1/2023-1/3/23a3099a-8d98-41d8-adf5-1e1206310f62/23a3099a-8d98-41d8-adf5-1e1206310f621.gif)
西安交通大学电子系统设计专题实验DOC
电子系统设计专题实验报告
实验一、基于AVRATMega128的硬件(PCB)设计
一、实验目的和要求
目的:
(1)掌握印制电路板设计的基本原则及印制电路板的设计制作流程。
(2)掌握ProtelDXP2004SP2软件的基本功能。
(3)在ProtelDXP2004SP2软件平台,完成电路图到PCB图的设计制作过程。
要求:
(1)根据实验要求,完成原理图的设计,并在ProtelDXP2004SP2软件平台上设计制作出相应的PCB图。
(2)要求PCB图布局布线美观,抗干扰性能强。
图中所用到的元件封装必须符合实际的元件尺寸。
二、实验设备及设计开发环境
操作系统:
XP软件:
ProtelDXP2004SP2
三、实验内容
根据ATMega128的电路图设计一个单片机电路板,其中包括基本电路、复位电路、时钟振荡器(ISP、键盘、RTClock)。
MCU原理图如图
四、实验步骤
1.创建新的工程项目,并新建原理图图纸
2.设置工程参数,包括基本原理图参数设置。
3.绘制原理图:
在元件库中查找所用元件,并进行必要说明,如标签、总线、端口等。
4.放置各个模块与图纸合适位置,方便之后端口的对接及导入。
5.对原理图进行电气检查,编译查错时,直至消除后保存原理图。
6.创建新的PCB文件,并对PCB进行正确合理的参数设置(注意:
在设置尺寸时,不宜设置太小,不利于元件布局及布线),保存文件。
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<使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
#include
#include
#include
#include"digitron.h"
#defineLINE1_SCAN()PORTC=(PORTC|_BV(PC7))&~_BV(PC6)
#defineMASK0xFF
#include"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);//关闭字型码锁存器
DDRB=0xff;//设置端口PB为输出
PORTB=0x00;//送数码管位码
PORTG&=~_BV(PG3);//关闭数码管位选择锁存器
PORTG|=_BV(PG4);//使能段码锁存器
PORTB=0xff;//送段码
PORTG&=~_BV(PG4);//关闭段码锁存器
//关闭蜂鸣器
DDRE|=_BV(PE3);
PORTE|=_BV(PE3);//喇叭电路断开,喇叭停止鸣响
}
voidDIG_Init()
{
PORTB=~PB_MASK;
DDRB=PB_MASK;
PORTG&=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;
PORTB=0x00;
PORTG=0x00;
//键盘端口初始化
PORTC&=0x3F;
DDRC|=0xC0;
PORTB=0xFF;
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();
LINE1_SCAN();
code=KP_read();
if(code!
=MASK)
{
_delay_ms(10);
code=KP_read();
if(code!
=MASK)
{
switch(code)
{
case0xFE:
key=0x01;break;
case0xFD:
key=0x02;break;
case0xFB:
key=0x04;break;
case0xF7:
key=0x08;break;
case0xEF:
key=0x10;break;
case0xDF:
key=0x20;break;
case0xBF:
key=0x40;break;
case0x7F:
key=0x80;break;
}
}
}
//ifnokeyispressed,return0x00
returnkey;
}
voidLED_Init()
{
PORTB=PB_MASK;
DDRB=PB_MASK;
PORTC|=_BV(LED_CS);
DDRC|=_BV(LED_CS);
}
intcalculate(intnumber)
{
switch(number)
{
case0:
returngrade/10;break;
case1:
returngrade%10;break;
default:
return10;
}
}
//亮灯程序不变k;
voidledkeepping()
{
LED_Init();
PORTB=~random[number];
_delay_ms(5);
}
//亮灯程序
voidswitchLed()
{
TCNT1H=0x00;//T/C1计数值清零
TCNT1L=0x00;
LED_Init();
PORTB=~random[number];
number=number+1;
count=count+1;
_delay_ms(5);
if(number==10)
{
number=1;
}
if(count>10)
{
TCCR1B=0x00;
}
}
//中断程序
SIGNAL(SIG_OUTPUT_COMPARE1A)
{
TCNT1H=0x00;//T/C1计数值清零
TCNT1L=0x00;
grade=grade+2;
switchLed();
}
voidDIG_Dispaly();
{
com=1;
for(number=0;number<2;number++)
{
PORTG|=_BV(DIG_CS2);
PORTG&=~_BV(DIG_CS1);
PORTB=code[calculate()(number)];
PORTG|=_BV(DIG_CS1);
PORTG&=~_BV(DIG_CS2);
PORTB=com;
com*=2;
PORTG&=~_BV(DIG_CS1);
PORTG&=~_BV(DIG_CS2);
_delay_ms
(2);
}
}
intmain(void)
{
system_init();//系统初始化
PORTE|=(1<_delay_ms(100);
_delay_ms(100);
PORTE|=(1<TCCR1B=0x00;//中断控制寄存器清零,停止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<10)
{
KP_Init();
uint8_tled_press,led_temp;
led_press=KP_scan();
ledkeepping();
KP_Init();
led_temp=KP_scan();
if(led_press!
=MASK)
{
if(led_press!
=led_temp)
{
if(led_press==random[number])
{
grade=grade+5;
}
else
{
grade=grade+0;
}
switchLed();
_delay_ms(5);
}
}
else
{
ledkeepping();
_delay_ms
(1);
}
}
else
{
DIG_Init();//数码管初始化
DIG_Dispaly();//数码管显示得分
}
}
}