AVR单片机期末报告.docx

上传人:b****7 文档编号:16454445 上传时间:2023-07-13 格式:DOCX 页数:19 大小:154.45KB
下载 相关 举报
AVR单片机期末报告.docx_第1页
第1页 / 共19页
AVR单片机期末报告.docx_第2页
第2页 / 共19页
AVR单片机期末报告.docx_第3页
第3页 / 共19页
AVR单片机期末报告.docx_第4页
第4页 / 共19页
AVR单片机期末报告.docx_第5页
第5页 / 共19页
AVR单片机期末报告.docx_第6页
第6页 / 共19页
AVR单片机期末报告.docx_第7页
第7页 / 共19页
AVR单片机期末报告.docx_第8页
第8页 / 共19页
AVR单片机期末报告.docx_第9页
第9页 / 共19页
AVR单片机期末报告.docx_第10页
第10页 / 共19页
AVR单片机期末报告.docx_第11页
第11页 / 共19页
AVR单片机期末报告.docx_第12页
第12页 / 共19页
AVR单片机期末报告.docx_第13页
第13页 / 共19页
AVR单片机期末报告.docx_第14页
第14页 / 共19页
AVR单片机期末报告.docx_第15页
第15页 / 共19页
AVR单片机期末报告.docx_第16页
第16页 / 共19页
AVR单片机期末报告.docx_第17页
第17页 / 共19页
AVR单片机期末报告.docx_第18页
第18页 / 共19页
AVR单片机期末报告.docx_第19页
第19页 / 共19页
亲,该文档总共19页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

AVR单片机期末报告.docx

《AVR单片机期末报告.docx》由会员分享,可在线阅读,更多相关《AVR单片机期末报告.docx(19页珍藏版)》请在冰点文库上搜索。

AVR单片机期末报告.docx

AVR单片机期末报告

AVR单片机的USB下载器设计开放实验报告

姓名:

盛勇学号:

101180102院系:

电子科学与工程学院

一、背景材料

单片机简介

单片机又称单片控制器,它是把一个计算机系统集成到一个芯片上,概括的讲:

一块芯片就成了一台计算机。

单片机技术是计算机技术的一个分支,是简易机器人的核心元件。

1997年,由ATMEL公司挪威设计中心的A先生与V先生利用ATMEL公司的Flash新技术,共同研发出RISC精简指令集的高速8位单片机,简称AVR。

相对于出现较早也较为成熟的51系列单片机,AVR系列单片机片内资源更为丰富,接口也更为强大,同时由于其价格低等优势,在很多场合可以替代51系列单片机。

AVR单片机特点

 高可靠性、功能强、高速度、低功耗和低价位,一直是衡量单片机性能的重要指标,也是单片机占领市场、赖以生存的必要条件。

早期单片机主要由于工艺及设计水平不高、功耗高和抗干扰性能差等原因,所以采取稳妥方案:

即采用较高的分频系数对时钟分频,使得指令周期长,执行速度慢。

以后的CMOS单片机虽然采用提高时钟频率和缩小分频系数等措施,但这种状态并未被彻底改观(51以及51兼容)。

此间虽有某些精简指令集单片机(RISC)问世,但依然沿袭对时钟分频的作法。

AVR单片机的推出,彻底打破这种旧设计格局,废除了机器周期,抛弃复杂指令计算机(CISC)追求指令完备的做法;采用精简指令集,以字作为指令长度单位,将内容丰富的操作数与操作码安排在一字之中(指令集中占大多数的单周期指令都是如此),取指周期短,又可预取指令,实现流水作业,故可高速执行指令。

当然这种速度上的升跃,是以高可靠性为其后盾的。

AVR单片机硬件结构采取8位机与16位机的折中策略,即采用局部寄存器存堆(32个寄存器文件)和单体高速输入/输出的方案(即输入捕获寄存器、输出比较匹配寄存器及相应控制逻辑)。

提高了指令执行速度(1Mips/MHz),克服了瓶颈现象,增强了功能;同时又减少了对外设管理的开销,相对简化了硬件结构,降低了成本。

故AVR单片机在软/硬件开销、速度、性能和成本诸多方面取得了优化平衡,是高性价比的单片机。

AVR单片机内嵌高质量的Flash程序存储器,擦写方便,支持ISP和IAP,便于产品的调试、开发、生产、更新。

内嵌长寿命的EEProm可长期保存关键数据,避免断电丢失。

片内大容量的RAM不仅能满足一般场合的使用,同时也更有效的支持使用高级语言开发系统程序,并可像MCS-51单片机那样扩展外部RAM。

AVR单片机的I/O线全部带可设置的上拉电阻、可单独设定为输入/输出、可设定(初始)高阻输入、驱动能力强(可省去功率驱动器件)等特性,使的得I/O口资源灵活、功能强大、可充分利用。

AVR单片机片内具备多种独立的时钟分频器,分别供URAT、I2C、SPI使用。

其中与8/16位定时器配合的具有多达10位的预分频器,可通过软件设定分频系数提供多种档次的定时时间。

AVR单片机独有的“以定时器/计数器(单)双向计数形成三角波,再与输出比较匹配寄存器配合,生成占空比可变、频率可变、相位可变方波的设计方法(即脉宽调制输出PWM)”更是令人耳目一新。

增强性的高速同/异步串口,具有硬件产生校验码、硬件检测和校验侦错、两级接收缓冲、波特率自动调整定位(接收时)、屏蔽数据帧等功能,提高了通信的可靠性,方便程序编写,更便于组成分布式网络和实现多机通信系统的复杂应用,串口功能大大超过MCS-51/96单片机的串口,加之AVR单片机高速,中断服务时间短,故可实现高波特率通讯。

面向字节的高速硬件串行接口TWI、SPI。

TWI与I2C接口兼容,具备ACK信号硬件发送与识别、地址识别、总线仲裁等功能,能实现主/从机的收/发全部4种组合的多机通信。

SPI支持主/从机等4种组合的多机通信。

AVR单片机有自动上电复位电路、独立的看门狗电路、低电压检测电路BOD,多个复位源(自动上下电复位、外部复位、看门狗复位、BOD复位),可设置的启动后延时运行程序,增强了嵌入式系统的可靠性。

AVR单片机具有多种省电休眠模式,且可宽电压运行(5-1.8V),抗干扰能力强,可降低一般8位机中的软件抗干扰设计工作量和硬件的使用量。

AVR单片机技术体现了单片机集多种器件(包括FLASH程序存储器、看门狗、EEPROM、同/异步串行口、TWI、SPI、A/D模数转换器、定时器/计数器等)和多种功能(增强可靠性的复位系统、降低功耗抗干扰的休眠模式、品种多门类全的中断系统、具输入捕获和比较匹配输出等多样化功能的定时器/计数器、具替换功能的I/O端口)于一身,充分体现了单片机技术的从“片自为战”向“片上系统SoC”过渡的发展方向。

  引脚配置

二、实验设备

硬件开发系统:

AVR单片机开发板,Microchip单片机开发板,USB连接线,计算机,IDC3编译器。

软件开发系统:

Maplab开发软件,VC++开发软件,AVRstudio。

三、开放实验内容

设计要求:

AVR单片机的编程时序

开发软件—>目标文件—>写到单片机程序存储器PM

用另一块单片机(或者叫烧录单片机A)写到目标单片机B上,用PC通过USB数据线写到烧录单片机上。

第一任务:

计算机上程序的编写

第二任务:

烧录单片机程序的编写

备注:

烧录单片机A采用Microchip公司的单片机,而目标单片机B采用Atmel公司的AVR单片机。

开发设计部分:

采用模块化设计思想,分步完成。

开发语言用C++以及C。

编写代码核心思想:

类和对象。

基础知识部分:

(1)AVR单片机编程对象

锁定位,可锁定编程或锁定Boot

熔丝位,用于配置单片机,如选择时钟源

标识字节,标识芯片的厂家和型号等

校准字节,用于校准振荡器

Flash程序存储器

EEPROM

(2)AVR单片机编程方式

并行,使用端口较多,在线编程一般不适用并行方式

串行,用于在线编程,实验中采取串行编程方式

(3)串行编程使用的引脚

(4)串行编程电路

(5)串行编程时序

(6)编程协议

通过SPI端口收发数据

以字节为一个数据传送单位以4个字节为一个指令单位

基本语句部分:

发送一个字节至AVR

unsignedcharsend(unsignedcharsend_data)

{

unsignedcharreci_data=0;inti;

for(i=7;i>=0;i--)

{

if(MISO==1)

reci_data|=0x01;

if(i!

=0)

reci_data=reci_data<<1;

delay_nus();MOSI=(send_data>>i);SCK=1;

delay_nus();SCK=0;

delay_nus();

}

returnreci_data;

}

编程使能

unsignedcharprog_enable(void)

{

unsignedchari=0,data_temp,reci_data=0;

MOSI=0;SCK=0;

do

{SCK=0;delay_nus();RESET=1;delay_nus();RESET=0;delay_nms(20);

//上电之后等待至少20ms,然后向MOSI引脚输入串行编程使能指令。

reci_data=send(0xac);

reci_data=send(0x53);

reci_data=send(0xaa);

i++;

}while((reci_data!

=0x53)&&(i<=5));

data_temp=reci_data;reci_data=send(0x00);//发送第四个字节

if(data_temp!

=0x53)

return(0);

else

return

(1);

}

擦除

voidearse(void)

{

unsignedcharreci_data=0;

reci_data=send(0xac);

reci_data=send(0x80);

reci_data=send(0x00);

reci_data=send(0x00);

}

加载程序存储页

voidwrite_flash(unsignedcharflashpage)

{

unsignedcharreci_data=0;

reci_data=send(0x4C);

reci_data=send((flashpage>>3)&0x0f);

reci_data=send(flashpage<<5);

reci_data=send(0x00);

}

写程序存储器页

voidwrite_flash(unsignedcharflashpage)

{

unsignedcharreci_data=0;

reci_data=send(0x4C);

reci_data=send((flashpage>>3)&0x0f);

reci_data=send(flashpage<<5);

reci_data=send(0x00);

}

模块化部分:

AVR_Programmer模块:

USB识别模块:

步骤如下一、新建一个工程,在其中创建用于管理USB的类,并输入部分代码。

Step1建一个基于MFC的工程:

AVR_Programmer

1File菜单->New

2.1Projects页->MFCAppWizard(exe)

2.2Projectsname>>AVR_Programmer

2.3OK!

3.1选择Dialogbased

3.2Finish!

Step2创建一个类:

MyUSB

1ClassView视图

2右击AVR_Programmerclasses->NewClass

3.1Classtype->GenericClass

3.2Name>>MyUSB

3.3OK!

Step3拷贝USB相关的头文件和库文件至工程所在的路径

1拷贝

hidpi.h

hidsdi.h

hidusage.h

setupapi.lib

HIDUSB.lib

hid.lib

至工程所在的路径

Step4包含头文件

1在至MyUSB.h和MyUSB.c的头部都加入这段代码:

extern"C"{

#include"hidsdi.h"

#include

#include

}

Step5设置Link的库文件

1Project菜单->Settings

2.1Link页

2.2Object/librarymodules>>HID.libHIDUSB.libsetupapi.lib

2.3OK!

Step6建MyUSB类的成员函数:

FindMyHID()

1ClassView视图

2右击MyUSB类名->AddMemberFunction

3.1FunctionType>>BOOL

3.2FunctionDeclaration>>MyUSB:

:

FindMyHID()

3.3OK

Step7完成函数FindMyHID()

1将FindMyHID.txt的内容拷贝至函数FindMyHID()

二、在对话框中建一个MyUSB类的对象,并完成USB设备的识别任务。

Step1在AVR_ProgrammerDlg.h中加入类和相应对象的声明

1ClassView视图->双击AVR_ProgrammerDlg类名

FileView视图->双击AVR_ProgrammerDlg.h文件名

2.1在classCAVR_ProgrammerDlg:

publicCDialog的上一行,输入:

classMyUSB;

2.2在public:

下一行输入:

MyUSB*m_MyUSB;

2.3保存

Step2在AVR_ProgrammerDlg.cpp中生成对象

1FileView视图->双击AVR_ProgrammerDlg.cpp文件名

2.1在CAVR_ProgrammerDlg:

:

CAVR_ProgrammerDlg(CWnd*pParent/*=NULL*/)

:

CDialog(CAVR_ProgrammerDlg:

:

IDD,pParent)

{

的下一行,输入:

m_MyUSB=newMyUSB;

2.2保存

三、完成USB设备的识别任务。

Step1在对话框中新建一个静态文本控件

1.1ResourceView视图

1.2展开AVR_Programmerresources->Dialog

1.3双击IDD_AVR_PROGRAMMER_DIALOG

2.1 删除对话框中原有的控件

2.2新建一个静态文本控件

2.3 右击控件,弹出对话栏

2.4 General页

2.5 ID>>IDC_USBSTATUS

2.6关闭对话栏

Step2静态文本控件的初始化

1.4ClassView视图

1.5展开CAVR_ProgrammerDlg,双击OnInitDialog()

1.6在//TODO:

Addextrainitializationhere的下一行,输入:

this->SetDlgItemText(IDC_USBSTATUS,"Programmernotconnected");

Step3在AVR_ProgrammerDlg类中建一个数据成员m_PreDeviceDetected并初始化之

1.1FileView视图->双击AVR_ProgrammerDlg.h文件名

1.2在MyUSB*m_MyUSB;的下一行,输入:

BOOLm_PreDeviceDetected;

1.3保存

2.1FileView视图->双击AVR_ProgrammerDlg.cpp文件名

2.2在

m_MyUSB=newMyUSB;

 //{{AFX_DATA_INIT(CAVR_ProgrammerDlg)

的下一行,输入:

m_PreDeviceDetected=FALSE;

2.4保存

Step4在AVR_ProgrammerDlg类中建一个系统定时函数OnTimer()

1.1View菜单->ClassWizard

1.2MessageMaps页

1.3Classname–>CAVR_ProgrammerDlg

1.4ObjectIDs->CAVR_ProgrammerDlg

1.5Messages->WM_TIMER

1.6单击AddFunction

1.7OK!

2.1FileView视图->双击AVR_ProgrammerDlg.cpp文件名

2.2在函数CAVR_ProgrammerDlg:

:

OnTimer(UINTnIDEvent)中,输入:

if(nIDEvent==1)

{

BOOLDeviceDetected=m_MyUSB->FindMyHID();

if((DeviceDetected==TRUE)&&(this->m_PreDeviceDetected==FALSE))

this->SetDlgItemText(IDC_USBSTATUS,"Programmerconnected");

elseif((DeviceDetected==FALSE)&&(this->m_PreDeviceDetected==TRUE))

this->SetDlgItemText(IDC_USBSTATUS,"Programmernotconnected");

this->m_PreDeviceDetected=DeviceDetected;

}

2.3保存

Step5初始化系统定时函数OnTimer()

1.1FileView视图->双击AVR_ProgrammerDlg.cpp文件名

1.2在this->SetDlgItemText(IDC_USBSTATUS,"Programmernotconnected");

的下一行,输入:

SetTimer(1,300,NULL);

1.3保存

PIC_USB(使用myUSB类重写)

HEX文件解析模块

步骤如下

一、完成打开一个Hex文件的功能。

Step1在对话框内,建一个PushButton控件

1ResourceView->AVRprogrammerResources->Dialog

2.1双击IDD_AVRPROGRAMMER_DIALOG

2.2在对话框上,将几个不用的控件删除

2.3拖动一个PushButton控件到对话框内

3.1右击控件->Properties

3.2General->ID>>”IDC_OPENHEXFILE”

3.3General->Caption>>“OpenHexFile”

Step2为PushButton控件添加函数

1右击该控件->ClassWizard

2.1MessageMaps页->ClassName->CAVRprogrammerDlg

2.2ObjectIDs->IDC_OPENHEXFILE

2.3Messages->BN_CLICKED

2.4右侧->AddFunction->默认

2.5OK!

Step3将以下内容拷贝至函数体:

1CFileHexFile;

DWORDreadlen=0,filelen=0,pos=0;

unsignedcharbuf[256]={0};

intrecordlength=0,startAddr=0;

intk,page,grid;

CFileDialogfile(true,NULL,NULL,NULL,"文件(*.hex)|*.hex||");

if(file.DoModal()==IDOK)

{

strname=file.GetPathName();

if(!

strname.IsEmpty())

bopen=TRUE;

Invalidate();

}

else

bopen=FALSE;

Step4声明成员变量(CAVRprogrammerDlg类)

CStringstrname;

BOOLbopen;

二、在对话框中建一个Edit控件。

Step1在对话框内,建一个Edit控件

1ResourceView->AVRprogrammerResources->Dialog

2.1双击IDD_AVRPROGRAMMER_DIALOG

2.2拖动一个Edit控件到对话框内

3.1右击控件->Properties

3.2General页->ID>>”IDC_BUFFER”

Step2修改Edit控件的属性

1.1Styles页->勾选:

Multiline,

Verticalscroll,

AutoVSroll,

Wantreturn,

Read-only。

三、完成对Hex文件的解析工作。

Step1将以下代码拷贝至AVRprogrammerDlg:

:

OnOpenhexfile()函数体:

(紧接原有代码之后)

if(bopen)

{

HexFile.Open(strname,CFile:

:

modeRead);

filelen=HexFile.GetLength();

while(pos

{

readlen=HexFile.Read(buf,1);//读一个字符

pos+=readlen;

if(buf[0]==0x3a)//如果是冒号

{

readlen=HexFile.Read(buf,2);//再读两字符,记录长度

pos+=readlen;

recordlength=Cal10(2,buf);

readlen=HexFile.Read(buf,4);//读四字符,起始地址

pos+=readlen;

startAddr=Cal10(4,buf);

readlen=HexFile.Read(buf,2);

pos+=readlen;

if(buf[1]==48)

{

page=startAddr/64;

grid=startAddr%64;

for(i=0;i

{

readlen=HexFile.Read(buf,2);

pos+=readlen;

data_buffer[page][grid]=Cal10(2,buf);

grid++;

if(grid>63)

{

page++;

grid=0;

}

}

page_length=page;

lpage_length=grid;

readlen=HexFile.Read(buf,4);

pos+=readlen;

}

else

{

readlen=HexFile.Read(buf,4);

pos+=readlen;

}

}

}

HexFile.Close();

}

CStringdisplayP,displayG,DispAddr;

DispAddr.Empty();

displayG.Empty();

for(k=0;k<128;k++)

{

for(i=0;i<4;

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2