1、西安交通大学电子系统设计专题实验DOC电子系统设计专题实验报告 实验一、基于AVR ATMega128的硬件(PCB)设计一、 实验目的和要求目的:(1)掌握印制电路板设计的基本原则及印制电路板的设计制作流程。(2)掌握Protel DXP 2004 SP2软件的基本功能。(3)在Protel DXP 2004 SP2软件平台,完成电路图到PCB图的设计制作过程。要求:(1)根据实验要求,完成原理图的设计,并在Protel DXP 2004 SP2软件平台上设计制作出相应的PCB图。(2)要求PCB图布局布线美观,抗干扰性能强。图中所用到的元件封装必须符合实际的元件尺寸。二、 实验设备及设计开
2、发环境 操作系统: XP 软件:Protel DXP 2004 SP 2三、 实验内容根据ATMega128的电路图设计一个单片机电路板,其中包括基本电路、复位电路、时钟振荡器(ISP、键盘、RT Clock)。 MCU原理图如图四、 实验步骤1. 创建新的工程项目,并新建原理图图纸2. 设置工程参数,包括基本原理图参数设置。3. 绘制原理图:在元件库中查找所用元件,并进行必要说明,如标签、总线、端口等。4. 放置各个模块与图纸合适位置,方便之后端口的对接及导入。5. 对原理图进行电气检查,编译查错时,直至消除后保存原理图。6. 创建新的PCB文件,并对PCB进行正确合理的参数设置(注意:在设
3、置尺寸时,不宜设置太小,不利于元件布局及布线),保存文件。7. 导入原理图,将元件合理放置,原则:组合功能的元件(键盘开关)有序放置在一起,使得各个元件布线交叉尽可能的少。8. 对电路板自动布线,进行规则检查,注意检查PCB有没有缺线、缺元件的情况修改错误的地方,并注意印刷线路的宽度设置,不宜太宽。9. 重复步骤8,对电路板布局不断进行修改优化,直到PCB的规则检查没有警告、错误,电路板元件布局思路清晰,布线方式正确合理。10. 对工程文件进行保存,完成整个硬件设计流程。五、 实验结果1.整体电路原理图如图2.PCB图如下图(手动放置元件位置,自动布线):六、 实验总结 硬件是设计的基础,认真
4、学习掌握硬件设计的原理有助于更好的在软件层面进行设计。同时一个正确标准的项目设计方案,方便设计人员阅读的同时,可以更高效的实现加工。 将理论上的电路原理图真真实实的做成了可以加工生产的电路板, 又一次真切的感受到了理论与实际的联系。电路图不再仅仅是停留在纸面和考试中的分析对象,更是可以加工成为电路板,是设计实现实际功能的基础。 布线过程中,看着元件之间密密麻麻的线路,也深切体会到优秀的设计对于实际生产的重要性,对于实现的难易程度,容错能力,产品性能等多方面都有着重大的影响。这就要求设计人员,不仅仅是能够实现产品的功能,而是尽可能将设计做到最好。这也对我们学习提出了更高的要求,做一件事情不难,难
5、的是做好一件事情。实验二、按键灭灯软件程序设计一 实验目的和任务要求 根据规则要求实现按键灭灯小游戏的基本功能,演示游戏过程并计算显示最终游戏结果。规则:1. LED灯随机地出现;每次闪一个灯;2. 在1s内按键可以把灯灭掉;3. 超时没按键或按错键,则灯换一个位置;4. 每灭一个灯,马上会闪亮另外一个灯;5. 计算10次灯的分数。比如 按错一次 -5;超时一次-3;及时灭一次 +1-3分。使用timer来计时比较准确。显示结果。二 实验设备及软件开发环境1. 单片机平台:AVR ATmega128实验开发板;2. 开发环境平台:计算机,Windows XP操作系统,软件开发平台:AVR St
6、udio 4.16 集成开发软件;WinAVR(GCC) 20080610 C语言编译器;下载编程工具:JTAGICE mkII在线仿真器;三 实验的电路原理1.LED指示灯的硬件电路连接如下图所示。2.数码管硬件电路连接如下图所示。3.矩阵键盘硬件电路连接如图6-1所示。 按键灭灯程序由以上三大部分构成,将led灯与键盘按键编码对应起来,实现按键对led灯的控制,最后将总得分显示在数码管上。 软件设计的难度不大,主要在于led灯与键盘按键端口的对应。四 软件设计及关键过程分析PORTE |= (1 PE3);使PA3输出高电平,使蜂鸣器鸣叫延迟一段时间之后关闭蜂鸣器软件设计流程图中断计时函数
7、SIGNAL(SIG_OUTPUT_COMPARE1A) 调用函数ledkeepping()PORTB = randomnumber; 数码管显示PORTB = codecalculate()(number);其中,calculate函数计算相应位码显示得分五 程序运行结果1.根据随机数组random10使得led灯“随机”亮起2.十次亮灯结束,数码管显示总得分六 实验总结软件编程设计的难度不大,关键在于如何使得led灯与键盘按键端口对应,并实现按键正确时将对应的led灯“灭掉”。具体实现时,采取当按键正确就切换到下一个随机led灯,而不是去改变按键对应的led灯的端口值,一定程度上使得问题简
8、化。程序采用将学过的知识模块联合,主要由led灯,键盘,数码管三部分构成。实验中也发现了一些问题:当按键时间过长时,可能使得下一个led灯亮时也判断到了该按键已经按下,错误的记录下该按键,得分记录不准确。处理思路: 当下一个led灯亮起,且判断到有按键按下时,判断按键是否与之前按键编码相同,如果不同,则为一次独立的按键;如果相同,则为上一个led灯的延迟按键,需重新对键盘进行一次scan。附录1软件源代码#include #include #include #include #include digitron.h#define LINE1_SCAN() PORTC = (PORTC | _BV
9、(PC7) & _BV(PC6)#define MASK 0xFF#include led.huint8_t code10 = 0xC0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8, 0x80,0x90 ;uint8_t random11 = 0x01,0x04,0x02,0x10,0x40,0x80,0x02,0x08, 0x80,0x20,0x40 ;uint8_t led_sel=0x01;int number=1,grade=0,count=0;int com = 1;void system_init() /系统初始化 /关闭8个LED灯 DDRB = 0xf
10、f; /设置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
11、控制数码管的段码锁存器; 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); /喇叭电路断开,喇叭停止鸣响void DIG_Init()
12、 PORTB = PB_MASK; DDRB = PB_MASK; PORTG &= 0x00; DDRG |= _BV(DIG_CS1) | _BV(DIG_CS2);void KP_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;
13、PORTB = 0x00; PORTG = 0x00; / 键盘端口初始化 PORTC &= 0x3F; DDRC |= 0xC0; PORTB = 0xFF; DDRB = 0x00;uint8_t KP_read() _delay_ms(10); asm(nop); uint8_t read = PINB; return read;uint8_t KP_scan() uint8_t code = MASK; uint8_t key = MASK; /scan the first line LINE1_SCAN(); LINE1_SCAN(); code = KP_read(); if(co
14、de != MASK) _delay_ms(10); code = KP_read(); if(code != MASK) switch(code) case 0xFE:key = 0x01;break; case 0xFD:key = 0x02;break; case 0xFB:key = 0x04;break; case 0xF7:key = 0x08;break; case 0xEF:key = 0x10;break; case 0xDF:key = 0x20;break; case 0xBF:key = 0x40;break; case 0x7F:key = 0x80;break; /
15、if no key is pressed, return 0x00 return key;void LED_Init() PORTB = PB_MASK; DDRB = PB_MASK; PORTC |= _BV(LED_CS); DDRC |= _BV(LED_CS);int calculate(int number) switch (number) case 0:return grade/10;break; case 1:return grade%10;break; default:return 10; /亮灯程序不变k;void ledkeepping() LED_Init(); POR
16、TB = randomnumber; _delay_ms(5);/亮灯程序void switchLed() TCNT1H = 0x00; /T/C1计数值清零 TCNT1L = 0x00; LED_Init(); PORTB = randomnumber; number=number+1; count=count+1; _delay_ms(5); if(number=10) number=1; if(count10) TCCR1B = 0x00; /中断程序SIGNAL(SIG_OUTPUT_COMPARE1A) TCNT1H = 0x00; /T/C1计数值清零 TCNT1L = 0x00;
17、 grade=grade+2; switchLed();void DIG_Dispaly(); com=1; for(number = 0; number 2; number+) PORTG |= _BV(DIG_CS2); PORTG &= _BV(DIG_CS1); PORTB = codecalculate()(number); PORTG |= _BV(DIG_CS1); PORTG &= _BV(DIG_CS2); PORTB = com; com *= 2; PORTG &= _BV(DIG_CS1); PORTG &= _BV(DIG_CS2); _delay_ms(2); in
18、t main(void) system_init(); /系统初始化 PORTE |= (1 PE3); /使PA3输出高电平,使蜂鸣器鸣叫 _delay_ms(100); _delay_ms(100); PORTE |= (1 PE3); /使PA3输出高电平,使蜂鸣器不响 TCCR1B = 0x00; /中断控制寄存器清零,停止T/Cl计数 OCR1AH = 0xAA; /设置8MHz、256分频、定时1s的比较值, OCR1AL = 0x12; /与TCNTl的计数值进行比较,若匹配产生中断 TCCR1A = 0x00; /T/C1普通端口模式 TCCR1B = 0x04; /启动定时器
19、T/C1,256分频 TIMSK |= 0x10; /使能C/Tl比较匹配中断 sei(); /允许全局中断 while(1) if(count10) KP_Init(); uint8_t led_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=randomnumber) grade=grade+5; else grade=grade+0; switchLed(); _delay_ms(5); else ledkeepping(); _delay_ms(1); else DIG_Init();/数码管初始化 DIG_Dispaly();/数码管显示得分
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1