当前位置:文档之家› 电子系统设计专题实验

电子系统设计专题实验

电子系统设计专题实验报告——AVR单片机基础实验学院:电信学院班级:计算机14学号:***********名:**一、实验目的和要求本实验课程的主要目的是通过一个新型嵌入式单片机为核心的应用系统设计,掌握微型计算机硬件系统结构基本原理,软件开发编程方法,外围接口电路的组成和应用编程技术,以及电子系统设计的相关技术。

通过课程实践训练,能够独立实现一个完整的计算机应用系统设计。

要求基本实验部分学习单片机系统的基本硬件组成原理和软件程序设计方法;综合设计实验要求根据题目需求自行设计系统硬件组成电路,并设计实现完成相应功能的应用程序调试任务。

二、实验设备及开发环境以AVR ATmega128单片机为核心的实验开发系统。

实验开发板采用技术性能优良的AVR ATmega128单片机作为核心器件,还特别设计了USB接口模块、Ethernet网络接口模块,还有MCU对外扩插槽,可为电路扩展模块提供必要的准备。

AVR单片机实验开发系统实验测试环境:1.软件开发平台: PC机WindowsXP操作系统;AVR Studio 4.16 集成开发软件;WinAVR 20080610 C语言编译器;2.下载编程工具: JTAG ICE mkII在线仿真器;3.测试目标板: ATmega128实验开发板;4.测试程序:用C语言编写电路功能测试程序,在WinAVR(GCC)+AVR Studio编译下通过。

三、实验设计题目及实现的功能实验一:单片机实验系统开发环境学习1. 熟悉实验电路的结构原理、元器件名称、作用及相应的接口连接;2. 学会使用C编译器编辑、编译、调试简单C源程序;3. 学会使用AVR Studio集成开发软件下载调试并得到正确结果;4. 熟悉蜂鸣器电路的编程原理实验程序源代码:#include <avr/io.h> // I/O端口寄存器配置文件,必须包含#include <util/delay.h> // 延时函数调用文件int main(void) // GCC中main文件必须为返回整形值的函数,没有// 参数{PORTE = 0X80; // PORTE输出高电平,使蜂鸣器不响DDRE = 0X08; // 配置端口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);_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. 学会外部显示部件LED灯的软件编程使用方法;4. 进一步熟悉单片机实验开发系统的使用。

实验程序源代码:#include <avr/io.h>#include <util/delay.h>#include "led.h"void LED_Init(){PORTB = PB_MASK;DDRB = PB_MASK;PORTC |= _BV(LED_CS);DDRC |= _BV(LED_CS);}int main(){int 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 == 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 = 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灯的软件编程使用方法;4. 学会单片机开发系统的软件调试方法。

实验程序源代码:#include <avr\io.h>#include <util\delay.h>#include "digitron.h"uint8_t code[10] = { 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_CS2);PORTG &= ~_BV(DIG_CS1);PORTB = code[i];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 s[8]){ 显示输出for(int i = 0; i < 100; ++i) {LED_Flash(s[7],128);LED_Flash(s[6],64);LED_Flash(s[5],32);LED_Flash(s[4],16);LED_Flash(s[3],8);LED_Flash(s[2],4);LED_Flash(s[1],2);LED_Flash(s[0],1);}}int main(){int sum[] = {0,0,0,0,0,0,0,0}; //存储显示数字DIG_Init();while(1){LED_display(sum);sum[7]++;for(int i=7;i>0;--i){ //循环进位if(sum[i]==10){sum[i]=0;sum[i-1]++;}}if(sum[0]==10){sum[0]=0;}}return 0;}实验四:定时/计数器中断应用程序设计熟悉单片机内部定时/计数器的工作原理;了解单片机中断机制工作原理;掌握单片机中断服务程序的设计方法;了解定时计数器的功能及应用。

实验程序源代码:#include <avr/io.h>#include <avr/interrupt.h>#include <avr\io.h>#include <util\delay.h>#include "digitron.h"uint8_t code[10] = { 0xC0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8, 0x80,0x90 };int sum[] = {0,0,0,0,0,0,0,0};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_CS2);PORTG &= ~_BV(DIG_CS1);PORTB = code[i];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 s[8]){for(int i = 0; i < 125; ++i) {LED_Flash(s[7],128);LED_Flash(s[6],64);LED_Flash(s[5],32);LED_Flash(s[4],16);LED_Flash(s[3],8);LED_Flash(s[2],4);LED_Flash(s[1],2);LED_Flash(s[0],1);}}SIGNAL(SIG_OUTPUT_COMPARE1A){TCNT1H = 0x00; //T/C1计数值清零TCNT1L = 0x00;//对PE3取反,0.5秒改变一次if(PORTE & _BV(PE3))PORTE &= ~_BV(PE3); //输出低电平elsePORTE |= (1<<PE3); //输出高电平DIG_Init();while(1){LED_display(sum);sum[7]++;for(int i=7;i>0;--i){if(sum[i]==10){sum[i]=0;sum[i-1]++;}}if(sum[0]==10){sum[0]=0;}if(sum[7]==0&&sum[6]==6){sum[7]=0;sum[6]=0;sum[5]++;}if(sum[5]==0&&sum[4]==6){sum[5]=0;sum[4]=0;sum[3]++;}if(sum[3]==0&&sum[2]==6){sum[3]=0;sum[2]=0;sum[1]++;}sum[0]=0;sum[1]=0;}}//主程序int main(void){DDRE = _BV(PE3); //初始化端口PE3为输出模式PORTE &= _BV(PE3); //输出高电平,蜂鸣器禁止发声TCCR1B = 0x00; //中断控制寄存器清零,停止T/Cl计数OCR1AH = 0x3D; //设置8MHz、256分频、定时0.5s的比较值,OCR1AL = 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. 学会单片机应用系统的人机界面软件设计方法。

相关主题