《电子系统设计专题实验.docx》由会员分享,可在线阅读,更多相关《电子系统设计专题实验.docx(18页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、电子系统设计专题试验报告AVR 单片机根底试验学院:电信学院班级:计算机 14学号:名:一、 试验目的和要求本试验课程的主要目的是通过一个型嵌入式单片机为核心的应用系统设计,把握微型 计算机硬件系统构造根本原理,软件开发编程方法,外围接口电路的组成和应用编程技术, 以及电子系统设计的相关技术。通过课程实践训练,能够独立实现一个完整的计算机应用系 统设计。要求根本试验局部学习单片机系统的根本硬件组成原理和软件程序设计方法;综合设计试验要求依据题目需求自行设计系统硬件组成电路,并设计实现完成相应功能的应用程序调试任务。二、试验设备及开发环境以 AVR ATmega128 单片机为核心的试验开发系统
2、。试验开发板承受技术性能优良的AVR ATmega128 单片机作为核心器件,还特别设计了USB 接口模块、Ethernet 网络接口模块,还有MCU 对外扩插槽,可为电路扩展模块供给必要的预备。AVR 单片机试验开发系统试验测试环境:1. 软件开发平台: PC 机 WindowsXP 操作系统;AVR Studio 4.16 集成开发软件; WinAVR 20230610 C 语言编译器;2. 下载编程工具: JTAG ICE mkII 在线仿真器;3. 测试目标板:ATmega128 试验开发板;4. 测试程序: 用 C 语言编写电路功能测试程序,在WinAVR(GCC)+AVR Stud
3、io 编译下通过。三、试验设计题目及实现的功能试验一:单片机试验系统开发环境学习1. 生疏试验电路的构造原理、元器件名称、作用及相应的接口连接;2. 学会使用C 编译器编辑、编译、调试简洁C 源程序;3. 学会使用AVR Studio 集成开发软件下载调试并得到正确结果;4. 生疏蜂鸣器电路的编程原理试验程序源代码:#include / I/O 端口存放器配置文件,必需包含#include / 延时函数调用文件int main(void)/ GCC 中 main 文件必需为返回整形值的函数,没有/ 参数PORTE = 0X80;/ PORTE 输出高电平,使蜂鸣器不响DDRE = 0X08;/
4、 配置端口PE3 为输出口while(1)PORTE &= (1 PE3); /PE3 置“0”,但是这种设置方法不转变PE 口其余位/的状态,寻常程序中推举这种使用方法_delay_ms(100);/ 延时 100 毫秒_delay_ms(100);_delay_ms(100);_delay_ms(100);_delay_ms(100);PORTE |= (1 PE3); /使 PE3 输出高电平,蜂鸣器不响_delay_ms(100);_delay_ms(100);_delay_ms(100);_delay_ms(100);_delay_ms(100);PORTE &= (1 PE3);_
5、delay_ms(100);_delay_ms(100);_delay_ms(50);PORTE |= (1 PE3);_delay_ms(100);_delay_ms(100);_delay_ms(50);PORTE &= (1 PE3);_delay_ms(100);_delay_ms(100);_delay_ms(50);PORTE |= (1 PE3);_delay_ms(100);_delay_ms(100);_delay_ms(50);试验二:LED 指示灯循环显示程序设计试验1. 生疏LED 指示灯电路原理图;2. 学会单片机C 语言I/O 端口编程掌握方法;3. 学会外部显示部
6、件LED 灯的软件编程使用方法;4. 进一步生疏单片机试验开发系统的使用。试验程序源代码:#include #include #include “led.h“void LED_InitPORTB = PB_MASK; DDRB = PB_MASK;PORTC |= _BV(LED_CS); DDRC |= _BV(LED_CS);int mainint i; int m;uint8_t led_sel; LED_Init; while(1) i = 0;led_sel = 0x01; while(i 3) PORTB = led_sel;_delay_ms(800); if(led_sel =
7、 0x80) led_sel = 0x01;+i;elseled_sel *= 2;i = 0;led_sel = 0x80; while(i 3) PORTB = led_sel;_delay_ms(800); if(led_sel = 0x01) led_sel = 0x80;+i;elseled_sel /= 2;i = 0;m = 0;led_sel = 0xaa; while(i 3) PORTB = led_sel;_delay_ms(800); if(m=8)m=0;+i;if(led_sel=0x00) led_sel=0xaa;led_sel /= 2;+m; i = 0;m
8、 = 0;led_sel = 0x55; while(i 3) PORTB = led_sel;_delay_ms(800); if(m=8)m=0;+i;if(led_sel=0x00) led_sel=0x55;led_sel *= 2;+m;for(i = 0; i 3; +i) PORTB |= PB_MASK;_delay_ms(500); PORTB &= PB_MASK;_delay_ms(500);return 0;试验三:数码管动态显示程序设计1. 生疏单片机数码管电路构造原理;2. 学会单片机C 语言I/O 端口编程掌握方法;3. 学会外部显示部件LED 灯的软件编程使用方
9、法;4. 学会单片机开发系统的软件调试方法。试验程序源代码:#include #include #include “digitron.h“uint8_t code10 = 0xC0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90 ;/存储 0 至 9 的显示代码void DIG_Init/初始化端口PORTB = PB_MASK; DDRB = PB_MASK;PORTG &= 0x00;DDRG |= _BV(DIG_CS1) | _BV(DIG_CS2);void LED_Flash(int i,int com) PORTG |= _BV(DIG_
10、CS2); PORTG &= _BV(DIG_CS1);PORTB = codei; PORTG |= _BV(DIG_CS1);PORTG &= _BV(DIG_CS2); PORTB = com;PORTG &= _BV(DIG_CS1); PORTG &= _BV(DIG_CS2);_delay_ms(1);/闪耀一个字符void LED_display(int s8) for(int i = 0; i 0;-i)if(sumi=10) sumi=0;sumi-1+;/存储显示数字/循环进位if(sum0=10) sum0=0;return 0;试验四:定时/计数器中断应用程序设计生疏单
11、片机内部定时/计数器的工作原理; 了解单片机中断机制工作原理;把握单片机中断效劳程序的设计方法; 了解定时计数器的功能及应用。试验程序源代码:#include #include #include #include #include “digitron.h“uint8_t code10 = 0xC0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90 ; int sum = 0,0,0,0,0,0,0,0;void DIG_InitPORTB = PB_MASK; DDRB = PB_MASK; PORTG &= 0x00;DDRG |= _BV(DIG_C
12、S1) | _BV(DIG_CS2);void LED_Flash(int i,int com) PORTG |= _BV(DIG_CS2); PORTG &= _BV(DIG_CS1);PORTB = codei; PORTG |= _BV(DIG_CS1);PORTG &= _BV(DIG_CS2); PORTB = com;PORTG &= _BV(DIG_CS1); PORTG &= _BV(DIG_CS2);_delay_ms(1);void LED_display(int s8) for(int i = 0; i 125; +i) LED_Flash(s7,128); LED_Fl
13、ash(s6,64);LED_Flash(s5,32);LED_Flash(s4,16);LED_Flash(s3,8);LED_Flash(s2,4);LED_Flash(s1,2);LED_Flash(s0,1);SIGNAL(SIG_OUTPUT_COMPARE1A)TCNT1H = 0x00;/T/C1 计数值清零TCNT1L = 0x00;/对 PE3 取反,0.5 秒转变一次if(PORTE & _BV(PE3)PORTE &= _BV(PE3); /输出低电平elsePORTE |= (10;-i)if(sumi=10) sumi=0;sumi-1+;if(sum0=10) su
14、m0=0;if(sum7=0&sum6=6) sum7=0;sum6=0;sum5+;if(sum5=0&sum4=6) sum5=0;sum4=0;sum3+;if(sum3=0&sum2=6) sum3=0;sum2=0;sum1+;sum0=0;sum1=0;/主程序int main(void)DDRE = _BV(PE3);/初始化端口 PE3 为输出模式PORTE &= _BV(PE3); /输出高电平,蜂鸣器制止发声TCCR1B = 0x00;/中断掌握存放器清零,停顿 T/Cl 计数OCR1AH = 0x3D;/设置 8MHz、256 分频、定时 0.5s 的比较值,OCR1AL
15、 = 0x09;/与 TCNTl 的计数值进展比较,假设匹配产生中断TCCR1A = 0x00;/T/C1 一般端口模式TCCR1B = 0x04;/启动定时器 T/C1,256 分频TIMSK |= 0x10;/使能 C/Tl 比较匹配中断sei;/允许全局中断while(1);/等待中断的发生return 0;试验五:LCD 字符图形显示程序设计1. 生疏单片机字符图形显示电路工作原理;2. 了解LCD12864 字符图形显示部件的工作原理;3. 学会单片机掌握字符图形显示的程序设计方法;4. 学会单片机应用系统的人机界面软件设计方法。试验程序源代码:#include /io 端口存放器配
16、置文件,必需包含#include /GCC 中的延时函数头文件/端口位定义#define RS PD5/数据/命令掌握端 0 命令,1 数据#define RW PD6/读/写选择掌握端 0 写,1 读#define E PD7/使能端下降沿读,高电平写/#define PSB PA3/数据传输方式选择端,H,8 位或 4 位并口方式;L,串口方式/全局变量声明unsigned char ucString2416=“ATMEGA-128 开发板“, “LCD12864 液晶测试“,“换屏显示“, “ 刘鑫 2110505093“,“五花马,“,“千金裘,“, “呼儿将出换美酒,“,“与尔同销万
17、古愁。“;double a4=0x80+0x00,0x90+0x00,0x88+0x00,0x98+0x00;/函数声明void LCD12864PortInit(void);/端口初始化void LCD12864Init(void);/LCD 初始化void LCD12864WriteCommand(unsigned char ucCommand);/LCD写指令void LCD12864WriteData(unsigned char ucData); /LCD写数据void LCD12864BusyCheck(void);/读写检测函数,每次对液晶操作前都要进/ 行读写检测int main
18、(void)while (1)unsigned char i; unsigned char j; unsigned char k;LCD12864PortInit; /端口初始化LCD12864Init; /LCD 初始化for(i = 0;i 4;i+)LCD12864WriteCommand(ai); for(k= 0;k 16;k+)LCD12864WriteData(ucString0ik);_delay_ms(15000);LCD12864Init;for(i = 0;i 4;i+)LCD12864WriteCommand(ai); for(k= 0;k 16;k+)LCD12864
19、WriteData(ucString1ik);_delay_ms(15000);LCD12864Init;for(i = 0;i 4;i+)LCD12864WriteCommand(ai); for(k= 0;k 16;k+)LCD12864WriteData(ucString0i+1k);_delay_ms(113000);LCD12864Init;for(i = 0;i 4;i+)LCD12864WriteCommand(ai); for(k= 0;k 16;k+)LCD12864WriteData(ucString0i+2k);_delay_ms(113000);LCD12864Init
20、;for(i = 0;i 4;i+)LCD12864WriteCommand(ai); for(k= 0;k 16;k+)LCD12864WriteData(ucString0i+3k);_delay_ms(113000);void LCD12864PortInit/LCD 数据端口设置PORTB = 0x00;/DDRB = 0xFF;/配置端口 PB 全部为输出口PORTD = 0x00;DDRD |= (1 RS) | (1 RW) | (1 E);_delay_ms(15);void LCD12864InitLCD12864WriteCommand(0x01); /清屏_delay_m
21、s(15); LCD12864WriteCommand(0x38); /显示模式_delay_ms(5);LCD12864WriteCommand(0x0f); /显示开关掌握,开显示,光标显示,光/ 标闪耀LCD12864WriteCommand(0x0c); /显示开关掌握,开显示,光标不显示,/光标不闪耀_delay_ms(5);LCD12864WriteCommand(0x06); /光标设置,读或写一个字符后,地址指/ 针加一,光标加一,整屏不移动void LCD12864WriteCommand(unsigned char ucCommand)LCD12864BusyCheck;P
22、ORTD &= (1 RS);/RS=0,写命令PORTD &= (1 RW);/RW=0,写指令PORTD |= (1 E);/E=1,写操作_delay_ms(2);PORTB = ucCommand;/指令送数据端口PORTD &= (1 E);/E=0,停顿写操作_delay_ms(5);void LCD12864WriteData(unsigned char ucData)LCD12864BusyCheck;PORTD |= (1 RS);/RS=1,写数据PORTD &= (1 RW);/RW=0,写指令PORTD |= (1 E);/E=1,写操作_delay_ms(50);PO
23、RTB = ucData;/ 数据送数据端口PORTD &= (1 E);/E=0,停顿写操作_delay_ms(5);void LCD12864BusyCheck(void)unsigned int uiTemp; uiTemp = 3000;DDRB = 0x00;/PB 口置为输入口,预备读取数据PORTD &= (1 RS);/RS=0,读命令PORTD |= (1 RW);/RW=1,读指令PORTD |= (1 E);/E=1,使能while(0x80 & PINB) & (uiTemp-);/监测忙信号,直到忙信号为 0,才能进展读写操作PORTD &= (1 E);/E=0DD
24、RB = 0xFF;/PA 口置为输出口,预备向端口发送数据试验六:键盘掌握程序设计1. 生疏单片机键盘电路工作原理;2. 学会单片机键盘掌握程序设计使用方法;3. 学会单片机矩阵键盘扫描程序的设计;4. 学会键盘掌握与显示部件的联合应用。试验程序源代码:/* 文件名:keypad.c* 功能:行列式键盘扫描,并输出键值* 说明:程序需要调用串口输出程序在PC 机显示键值*/* 文件名:led.h#ifndef LED_H #define LED_H #define LED_CS PC5 #define PB_MASK 0xFF void LED_Init; #endif#include #i
25、nclude #include #include / #include “uart.h“/ #include “led.h“#define LINE1_SCAN PORTC = (PORTC | _BV(PC7) & _BV(PC6) #define LINE2_SCAN PORTC = (PORTC | _BV(PC6) & _BV(PC7)#define MASK 0xFF/端口位定义#define RS PD5/数据/命令掌握端 0 命令,1 数据#define RW PD6/读/写选择掌握端 0 写,1 读#define E PD7/使能端下降沿读,高电平写/#define PSB P
26、A3/数据传输方式选择端,H,8 位或 4 位并口方式;L,串口方式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; PORTB = 0x00; PORTG = 0x00;/ 键盘端口初始化PORTC &= 0x3F; DDRC |= 0x
27、C0; PORTB = 0xFF; DDRB = 0x00;uint8_t KP_readasm(“nop“);uint8_t retb = PINB; return retb;uint8_t KP_scanuint8_t code = MASK; uint8_t key = 0x00;/scan the first line LINE1_SCAN; LINE1_SCAN;code = KP_read; if(code != MASK) _delay_ms(10); code = KP_read; if(code != MASK) switch(code) case 0xFE: key = ”
28、0”; break; case 0xFD: key = ”1”; break; case 0xFB: key = ”2”; break; case 0xF7: key = ”3”; break; case 0xEF: key = ”4”; break; case 0xDF: key = ”5”; break; case 0xBF: key = ”6”; break; case 0x7F: key = ”7”; break;while(1) code = KP_read; if(code = MASK) _delay_ms(10); code = KP_read; if(code = MASK)
29、;break;/scan the second line LINE2_SCAN; LINE2_SCAN;code = KP_read;if(code != MASK) _delay_ms(10); code = KP_read; if(code != MASK) switch(code) case 0xFE: key = ”8”; break; case 0xFD: key = ”9”; break; case 0xFB: key = ”A”; break;/case 0xFB: key = 0x0A; break; case 0xF7: key = ”B”; break;/case 0xF7
30、: key = 0x0B; break; case 0xEF: key = ”C”; break;/case 0xEF: key = 0x0C; break; case 0xDF: key = ”D”; break;/case 0xDF: key = 0x0D; break; case 0xBF: key = ”E”; break;/case 0xBF: key = 0x0E; break; case 0x7F: key = ”F”; break;/case 0x7F: key = 0x0F; break;while(1) code = KP_read; if(code = MASK) _de
31、lay_ms(10); code = KP_read; if(code = MASK);break;/if no key is pressed, return 0x00 return key;/函数声明void LCD12864PortInit(void);/端口初始化void LCD12864Init(void);/LCD 初始化void LCD12864WriteCommand(unsigned char ucCommand);/LCD写指令void LCD12864WriteData(unsigned char ucData); /LCD写数据void LCD12864BusyCheck
32、(void);/读写检测函数,每次对液晶操作前都要进展读写检测void LCD12864PortInit/LCD 数据端口设置PORTB = 0x00;/DDRB = 0xFF;/配置端口 PB 全部为输出口PORTD = 0x00;DDRD |= (1 RS) | (1 RW) | (1 E);_delay_ms(15);void LCD12864InitLCD12864WriteCommand(0x01); /清屏_delay_ms(15); LCD12864WriteCommand(0x38); /显示模式_delay_ms(5);LCD12864WriteCommand(0x0f);
33、/显示开关掌握,开显示,光标显示,光标闪耀LCD12864WriteCommand(0x0c); /显示开关掌握,开显示,光标不显示,光标不闪耀_delay_ms(5);LCD12864WriteCommand(0x06); /光标设置,读或写一个字符后,地址指针加一,光标加一,整屏不移动_delay_ms(5);void LCD12864WriteCommand(unsigned char ucCommand)LCD12864BusyCheck;PORTD &= (1 RS); /RS=0,写命令PORTD &= (1 RW); /RW=0,写指令PORTD |= (1 E); /E=1,写
34、操作_delay_ms(2);PORTB = ucCommand;/指令送数据端口PORTD &= (1 E);/E=0,停顿写操作_delay_ms(5);void LCD12864WriteData(unsigned char ucData)LCD12864BusyCheck;PORTD |= (1 RS);/RS=1,写数据PORTD &= (1 RW);/RW=0,写指令PORTD |= (1 E);/E=1,写操作_delay_ms(2);PORTB = ucData;/ 数据送数据端口PORTD &= (1 E);/E=0,停顿写操作_delay_ms(5);void LCD128
35、64BusyCheck(void)unsigned int uiTemp;uiTemp = 3000;DDRB = 0x00;/PB 口置为输入口,预备读取数据PORTD &= (1 RS);/RS=0,读命令PORTD |= (1 RW);/RW=1,读指令PORTD |= (1 E);/E=1,使能while(0x80 & PINB) & (uiTemp-);/监测忙信号,直到忙信号为 0,才能进展读写操作PORTD &= (1 E);/E=0DDRB = 0xFF;/PA 口置为输出口,预备向端口发送数据unsigned char ucString416; unsigned char r
36、ow=0;unsigned char i=0;uint8_t PorNum4=0x80, 0x90, 0x88, 0x98; unsigned char PorNumP=0;void ResstucS int m, k;for (m=0; m4; m+)for (k=0; k16; k+)ucStringmk=” ”;int mainuint8_t keysc; KP_Init; ResstucS;/UART_Init; / 串口输出/printf(“Press a Key:n“); while(1) KP_Init;keysc = KP_scan; if(keysc != 0)/printf
37、(“You pressed key: %cn“, keysc);/输出键值unsigned char j; ucStringrowi=keysc; i+;LCD12864PortInit;/端口初始化LCD12864Init;/LCD 初始化LCD12864WriteCommand(0x80+0x00); for(j = 0;j 16;j+)LCD12864WriteData(ucString0j);LCD12864WriteCommand(0x90+0x00); for(j = 0;j 16;j+)LCD12864WriteData(ucString1j);LCD12864WriteComm
38、and(0x88+0x00); for(j = 0;j 16;j+)LCD12864WriteData(ucString2j);LCD12864WriteCommand(0x98+0x00); for(j = 0;j 16;j+)LCD12864WriteData(ucString3j);if (i=16)if(row=3)ResstucS;i=0;row = ( row + 1 ) % 4;/PorNumP = ( PorNumP + 1 ) % 4;_delay_ms(20);六、试验感想试验中遇到了很多的问题,不过都在教师和同学的争论中得到解决,对于一门的语言经受了由生疏到生疏的过程,虽然还不是很娴熟但收获已是不小。在试验 5 是用 led 显示时钟的过程中,遇到了很大麻烦,不过在争论和探究中难题都得到了解决。虽然LCD 显示原理较为简单,只能到初步理解的地步,但通过对例如程序的阅读,修改显示内容是比较简洁的。通过本次试验,对于简洁单片机的的功能设计的过程有了初步了解,对于相应的软件实现也有了娴熟的把握,尤其是硬件方面的简洁编程。对于单片机的工作原理实现也很好的把握了,试验过程很好的熬炼了我的动手力量, 操作力量,团队合作力量以及专研精神,收获很大,也很珍惜这样的时机。