北科大单片机实验报告.docx
《北科大单片机实验报告.docx》由会员分享,可在线阅读,更多相关《北科大单片机实验报告.docx(81页珍藏版)》请在冰豆网上搜索。
北科大单片机实验报告
北京科技大学
《微机原理及应用》实验报告
实验内容:
单片机及应用
班级:
智能12
姓名:
2015年1月5日
实验一AVR单片机硬件开发平台
一、实验目的
1.了解ATmega16单片机的组成。
2.认识AVR_StudyV1.1实验板的功能模块。
二、实验内容
1.了解AVR系列单片机。
2.认识AVR_StudyV1.1实验板的组成模块。
三、实验所用仪表及设备
硬件:
PC机一台、AVR_StudyV1.1实验板
四、实验步骤
了解AVR系列单片机
AVR单片机是Atmel公司1997年推出的RISC单片机。
RISC(精简指令系统计算机)是相对于CISC(复杂指令系统计算机)而言的。
RISC优先选取使用频率最高的简单指令,避免复杂指令;并固定指令宽度,减少指令格式和寻址方式的种类,从而缩短指令周期,提高运行速度。
由于AVR采用了RISC指令,使AVR系列单片机具备1MIPS/MHz(百万条指令每秒/兆赫兹)的高速处理能力。
AVR单片机吸收了DSP双总线的特点,采用Harvard总线结构,因此单片机的程序存储器和数据存储器是分离的,并且可对具有相同地址的程序存储器和数据存储器进行独立的寻址。
AVR单片机具有良好的集成性能。
AVR系列的单片机都具备在线编程接口,其中的Mega系列还具备JTAG仿真和下载功能;都含有片内看门狗电路、片内程序Flash、同步串行接口SPI;多数AVR单片机还内嵌了AD转换器、EEPROM、摸拟比较器、定时计数器等多种功能;AVR片机的I/O接口具有很强的驱动能力,灌电流可直接驱动继电器、LED等器件,从而省去驱动电路,节约系统成本。
AVR单片机还支持Basic、C等高级语言编程。
采用高级语言是单片机开发的发展趋势。
对单片机用高级语言编程可很容易地实现系统移植,更加灵活并加快软件的开发进程。
AVR单片机具有多个系列,包括ATtiny、AT90、ATmega。
每个系列又包括多个产品,它们在功能和存储器容量等方面有很大的不同,但基本结构和原理都类似,而且编程方也相同。
认识AVR_StudyV1.1实验板的组成模块
A区——电源
A区采用AMS1117-5.0低压降三端线性稳压器,输入电压范围为6.5~12V,输出为5V,为整个实验板的其它模块供电。
为方便做实验,将+5V和GND用排针分别引出。
B区——LCD1602
B区为字符型液晶1602接口模块,只需要将1602液晶插到J12孔内,使用杜邦线从J10处将相关接口与单片机端口相连即可。
注意,使用液晶时应将J11短路,为液晶供电。
C区——八段数码管
C区为八段共阴型数码管模块,J1为数码管的八段,高电平点亮。
J2和J3为八个数码管的位选,低电平使能。
D区——LED发光二极管
D区为8个LED发光二极管,采用共阳接法,即低电平点亮。
其中电阻为保护LED的限流电阻。
使用时只需从J7处使用杜邦线引出即可。
E区——按键
按键采用外部上拉电阻,平时J4为高电平,当按键按下时,输出低电平。
其中,电容为滤波电容,滤除按键按下时产生的尖峰毛刺。
F区——DS18B20
DS18B20是DALLAS公司生产的单总线数字温度传感器,具有3引脚TO-92小体积封装形式;温度测量范围为-55℃~+125℃,可编程为9位~12位A/D转换精度,测温分辨率可达0.0625℃,被测温度用符号扩展的16位数字量方式串行输出;其工作电源既可在远端引入,也可采用寄生电源方式产生;多个DS18B20可以并联到3根或2根线上,CPU只需一根端口线就能与诸多DS18B20通信,占用微处理器的端口较少,可节省大量的引线和逻辑电路。
以上特点使DS18B20非常适用于远距离多点温度检测系统。
G区——ADC区
G区通过一个滑动变阻器改变J14输出电压,可通过单片机片内AD进行采集。
H区——E2PROM
AT24C02是美国ATMEL公司的低功耗CMOS串行EEPROM,采用I2C总线通信,内含256×8位存储空间,具有工作电压宽(2.5~5.5V)、擦写次数多(大于10000次)、写入速度快(小于10ms)等特点。
I区——蜂鸣器
I区为一个无源蜂鸣器。
无源蜂鸣器与有源蜂鸣器相比,没有内部驱动电路,如果直接加直流电压,蜂鸣器不会发声。
它的理想工作信号为方波信号,且随着频率不同发出不同的声调。
大约1K~2K,蜂鸣器最响。
J区——串口
J区位串口通信模块,采用Maxim公司的MAX232实现电平转换,以满足RS232标准电平与PC机标准串口连接。
其中,两个LED为状态指示灯。
ATmega16最小系统
主要包括复位电路、外部晶振、ISP下载接口、ADC外部参考电压。
五、思考题
1.总结ATMega16的特点和性能。
AVR单片机吸收了DSP双总线的特点,采用Harvard总线结构,因此单片机的程序存储器和数据存储器是分离的,并且可对具有相同地址的程序存储器和数据存储器进行独立的寻址。
1)先进的RISC结构,131条指令,大多数指令执行时间为单个时钟周期,32个8位通用工作寄存器;采用CMOS技术,实现高速(50ns)、低功耗(μA)、具有SLEEP(休眠)功能;
2)非易失性程序和数据存储器,16K字节的系统内可编程Flash,擦写寿命:
10,000次真正的同时读写操作,512字节的EEPROM,擦写寿命:
100,000次,1K字节的片内SRAM,可以对锁定位进行编程以实现用户程序的加密,高度保密。
3)工业级产品。
具有大电流10~20mA(输出电流)或40mA(吸电流)的特点,可直接驱动LED、SSR或继电器。
有看门狗定时器(WDT)安全保护,可防止程序走飞,提高产品的抗干扰能力;
4)超功能精简指令,具有32个通用工作寄存器,克服了单一累加器数据处理造成的瓶颈现象;
5)程序写入器件时,可以使用并行方式写入,也可使用串行在线下载(ISP)、在应用下载(IAP)方法下载写入;
6)通用数字I/O口的输入输出特性与PIC的HI/LOW输出及三态高阻抗HI-Z输入类同,同时可设定类同与8051结构内部有上拉电阻的输入端功能,便于作为各种应用特性所需(多功能I/O口),AVR的I/O口是真正的I/O口,能正确反映I/O口的输入/输出的真实情况;
7)许多AVR单片机具有内部的RC振荡器,提供1/2/4/8MHz的工作时钟,使该类单片机无需外加时钟电路元器件即可工作,非常简单和方便;
8)有多个带预分频器的8位和16位功能强大的计数器/定时器(C/T),除了实现普通的定时和计数功能外,还具有输入捕获、产生PWM输出等更多的功能;
2.AVR单片机存储器有哪几种类型?
有何作用?
Flash可编程存储,主要用来存放程序。
SRAM,即随机存储器RAM,SRAM数据存储器是以8位(字节)为一个存储单元,编址方式采用与工作寄存器组、I/O寄存器和SRAM统一寻址的方式。
EEPROM即电可擦除可编程存储器,EEPROM的寿命大于10万次,具有掉电后不丢失数据的特点,并且通过系统程序可以随时修改。
EEPROM数据存储器也是以8位(字节)为一个存储单元,对其的读写操作都以字节为单位。
SRAM存储单片机运行过程中产生的了临时数据;EEPROM视用户的需要而定,EEPROM存储器一般用于存放一些永久或比较固定的系统参数。
3.AVR单片机是如何实现高达1MIPS/MHz的处理能力的?
先进的RISC结构131条指令大多数指令执行时间为单个时钟周期,AVR采用了Harvard结构,具有独立的数据和程序总线。
程序存储器里的指令通过一级流水线运行。
CPU在执行一条指令的同时读取下一条指令。
4.分析A区电容种类和作用。
A区电容分为有极性和无极性电容,分别对电源起稳压和滤波的作用。
六、心得体会
通过本次实验我了解了AVR的单片机的基本情况,学习了AVR的基本特性。
对实验中使用的开发板有了基本的认识,了解了使用的电路板中有哪些外围设备,可以实现什么功能。
为今后的单片机学习打下了基础。
实验二AVR单片机软件开发环境
一、实验目的
1.熟悉CodeVisionAVR集成开发环境
2.掌握单片机C语言开发
二、实验内容
1.在CodeVisionAVR软件开发平台下创建一个工程并编译下载。
三、实验所用仪表及设备
硬件:
PC机一台、AVR_StudyV1.1实验板
软件:
CodeVisionAVR集成开发软件、SLISP下载软件
四、实验步骤
使用CodeVisionAVR软件的CodeWizardAVR功能,创建一个简单的工程,编译并下载。
新建项目
(1)打开CodeVisionAVR(版本V2.03.4),打开File->New,选择Project->OK,弹出一个Confirm对话框,选择Yes。
如图2.1所示。
图2.1
(2)在弹出的CodeWizardAVR窗口中进行选择。
在Chip选项卡中:
Chip->ATmega16,Clock->4MHz。
在Port选项卡中:
选择PortA,修改Bit0为Out,OutputValue改为1。
如图2.2所示。
图2.2
(3)在CodeWizardAVR窗口中,File->Generate,SaveandExit,创建新工程。
如图2.3所示。
图2.3
将新生成的源程序(.c),工程文件(.prj),CodeWizardAVR文件(.cwp),保存在一个新建文件夹下。
如图2.4所示新生成的源程序。
图2.4
(4)修改源程序
在源程序在开始处添加#include。
在while
(1)处添加四句语句。
如图2.5所示。
图2.5
(5)保存。
编译项目
选择Project->BuildAll(Ctrl+F9),弹出Information窗口,其中Noerrors,Nowarnings表示编译成功。
如果出现错误,根据错误提示修改源程序。
下载程序
由于CodeVisionAVR自带的下载软件CodeProgrammer修改熔丝位不够灵活,我们选用双龙公司的SLISP进行程序下载。
(1)打开SLISP,在通信参数设置及器件选择项目中,按照图2.7进行设置。
图2.7
(2)点击Flash选项,在工程文件夹下找到Exe文件夹,选择xx.hex文件。
在弹出的空闲存贮器填充对话框,点击确定。
(3)编程选项修改。
图2.9
(4)配置熔丝位:
点击编程选项中配置熔丝。
切换到设置设置导航模式,如图2.10所示。
图2.10
选择Int.RCOsc.4MHz;Start-uptime:
6CK+64ms这一项;其余项不要修改。
此时右上角配置位数值变为:
E399FF。
点击确定。
(5)检查实验板J5、J6短路帽是否插上,没有要插上。
将下载器与PC机并口相连,另一端连接实验板ISP接口。
使用杜邦线将D区任意一个LED灯与PA0相连。
检查无误后上电。
(6)点击编程,如图2.11所示为编程成功。
观察LED,发现它在一闪一闪。
图2.11
五、思考题
1用CodeWizardAVR创建工程的有什么优点?
CodeWIzardAVR有特定功能的头文件,可以直接调用,不用再去编写一些程序,比如delay.h等。
CodeWizardAVR中的工程向导可以省去很多的初始化的代码,以及程序的框架。
CodeWizardAVR中的中断函数可以提供自动的现场保护和断点回复功能,可以方便的使用中断。
2创建工程的过程中应注意哪些问题?
应注意正确配置各参数,以及目标芯片,防止配置错误,导致程序无法正常工作,甚至损坏电路板。
3AVR熔丝位有哪些作用?
编程时应注意哪些问题?
(特别注意时钟及加密)
熔丝是一个保护知识产权的设计。
烧断熔丝后,片内的程序就不可以被读出来也不能被改写,只能用来运行。
AVR芯片使用熔丝来设定时钟、启动时间、一些功能的使能、BOOT区设定、当然还有最让初学者头疼的保密位,烧录程序时需要设定好熔丝位,不然设不好会锁芯片。
六、实验现象
LED灯一闪一灭,间隔时间为半秒钟
七、遇到的问题及解决方法
1、我的电脑是64位,安装codeversion总是失败,于是我安装的AtmelStudio,编程的时候需要设置CPU频率,头文件也与Codeversion不同,比如。
具体如下:
2、下载器和烧录软件也与实验室不同:
下载器:
USBASP
烧录器:
八、心得体会
本次实验,我学习了单片机的软件环境。
使用CodeVisionAVR软件的工程创建向导功能,创建了一个简单的工程,编译并下载。
在此过程中的设置是:
Chip->ATmega16,
Clock->4MHz。
按照需要配置各IO端以及定时器等。
编译后,要注意观察Information窗口,观察是否有错误或警告以及它们所在的位置。
下载过程中,一定要保证单片机与PC机连接正确,即串口连接好且单片机上电。
实验三I/O口操作实验
一、实验目的
1.掌握ATmega16I/O口操作相关寄存器
2.掌握CodeVisionAVR软件的使用
3.复习C语言,总结单片机C语言的特点
二、实验内容
1.设计一个简单控制程序,功能是8个LED逐一循环发光0.5s,构成“流水灯”。
2.设计一个4种闪烁方式交替循环的彩灯,闪烁方式如图3.1所示:
图3.14种不同控制方式的转换图
三、实验所用仪表及设备
硬件:
PC机一台、AVR_StudyV1.1实验板
软件:
CodeVisionAVR集成开发软件、SLISP下载软件
四、实验步骤
硬件接线图:
根据图3.2所示,使用杜邦线将AVR_StudyV1.1实验板PA口与LED相连。
图3.2
新建工程,实现实验内容1。
根据电路图,LED属于共阳接法,所以PORTA输出低电平时灯点亮。
PORTA初始化:
DDRA=0xFF;//PA口工作为输出方式
PORTA=0xFF;//PA口输出全1,LED全灭
“流水灯”程序控制:
1、PA0=0点亮LED0PORTA=0b11111110=~(1<<0)
2、PA1=0点亮LED1PORTA=0b11111101=~(1<<1)
3、PA2=0点亮LED2PORTA=0b11111011=~(1<<2)
……
7、PA6=0点亮LED6PORTA=0b10111111=~(1<<6)
8、PA7=0点亮LED7PORTA=0b01111111=~(1<<7)
9、PA0=0点亮LED0PORTA=0b11111110=~(1<<0)
……
根据控制流程,总结出:
可以利用移位运算实现“流水灯”的设计。
主函数:
voidmain(void)
{
unsignedcharposition=0;//position为控制位的位置
PORTA=0xFF;//PA口输出全1,LED全灭
DDRA=0xFF;//PA口工作为输出方式
while
(1)
{
PORTA=~(1<if(++position>=8)position=0;
delay_ms(500);
};
}
新建工程,实现实验内容2。
提示:
在CVAVR中,提供intrand(void)和voidsrand(intseed)函数,产生随机数。
函数包含在头文件stdlib.h中,具体内容查阅CVAVR帮助文档。
其中task1(),task2(),task3(),task4()分别完成框图中要求的功能。
voidtask1(void)
{
unsignedcharposition,i;
position=0;
i=16;
while(i--)
{
PORTA=~(0x80>>position);
if(++position>=8)
position=0;
delay_ms(500);
}
PORTA=0xFF;
}
voidtask2(void)
{
unsignedcharposition,i;
position=0;
i=16;
while(i--)
{
PORTA=~(1<if(++position>=8)
position=0;
delay_ms(500);
}
PORTA=0xFF;
}
voidtask3(void)
{
bitposition;
unsignedchari;
position=1;
i=16;
while(i--)
{
if(position)
{
PORTA=0b10101010;
}
else
{
PORTA=0b01010101;
}
position=!
position;
delay_ms(500);
}
PORTA=0xFF;
}
voidtask4(void)
{
unsignedchari;
i=16;
while(i--)
{
PORTA=(unsignedchar)rand();
delay_ms(500);
}
PORTA=0xFF;
}
voidmain(void)
{
PORTA=0xFF;
DDRA=0xFF;
while
(1)
{
task1();delay_ms(500);
task2();delay_ms(500);
task3();delay_ms(500);
task4();delay_ms(500);
};
}
下载程序,观察实验现象。
注意熔丝位的配置,选择内部4MHz时钟。
五、实验现象
实验内容1
流水灯从左往右依次亮和熄灭
实验内容2
四种状态交替
六、思考题
1、总结AVRI/O口的特点及编程流程。
作为通用数字I/O使用时,所有AVRI/O端口都具有真正的读-修改-写功能。
这意味着用SBI或CBI指令改变某些管脚的方向(或者是端口电平、禁止/使能上拉电阻)时不会无意地改变其他管脚的方向(或者是端口电平、禁止/使能上拉电阻)。
输出缓冲器具有对称的驱动能力,可以输出或吸收大电流,直接驱动LED。
所有的端口引脚都具有与电压无关的上拉电阻。
用户程序需要首先对要使用的I/O口进行初始化设置,根据实际需要设定使用I/O口的工作方式(输出还是输入)。
数据寄存器PORTx:
当DDRx为1,作为输出引脚时,写入引脚要输出的电平状态,作为输出引脚可输出高低电平。
当DDRx为0作为输入引脚时,可配置上拉电阻.
端口输入引脚PINx:
只读寄存器。
可以用来读取外部电平的变化。
2)当DDRx=1时,I/O口处于输出工作方式,PORTx=1,输出高电平;PORTx=1,输出低电平;
3)当DDRx=0时,I/O口处于输入工作方式,PORTx=1,输入,使能内部上拉电阻,PORTx=0,高阻态。
PINx的值代表端口输入值。
2、复习C语言位运算相关内容。
3、查阅相关资料,总结随机数、伪随机数,并举例说明在实际中的应用。
真随机数是使用物理现象产生的,伪随机数通过一个固定的、可以重复的计算方法产生。
如使用随机数表等方式产生,其中在C语言中,使用的是伪随机数,产生时如果没有进行随机数种子的设置,将会在不同次的运行中产生相同的随机序列。
随机数在一些概率模拟,随机算法,如遗传算法,随机重新开始的爬山法等算法中有很多应用。
4、修改实验内容一,实现从左到右依次先点亮一个发光二极管,再点亮两个,……,八个全部点亮,然后一个一个依次熄灭。
while
(1)
{
//Placeyourcodehere
PORTA=0b11111110;
while(PORTA)
{
delay_ms(500);
PORTA=PORTA<<1;
}
PORTA=0b11111110;
while(PORTA!
=0xFF)
{
PORTA=~(PORTA<<1);
}
};
}
七、遇到的问题及解决方法
在寝室自己电脑上做实验时,LED灯亮和灭切换非常慢,我始终没搞清是怎么回事,于是将源程序中的delay_ms=500,改得很小,这样就切换得快了。
后来发现是因为在使用自己电脑的烧录软件时没有配置熔丝位,
八、心得体会
通过实验实现8个LED逐一循环发光的“流水灯”,以及设计出了一个4种闪烁方式交替循环的彩灯。
在完成了硬件部分的连接工作后,在软件环境下,进行程序的改写。
由于LED属于共阳极接法,所以PORTA输出低电平时灯点亮,“流水”效果由移位运算实现。
实验二,对四种显示方法分别编写相应的子函数代码,并在主函数中一次调用。
下载程序过程中,选择内部4MHz时钟。
本次实验,着重对各端口使用部分的操作练习。
通过实验指导书的讲解,我了解到使用端口使LED灯闪亮的操作原理,并在实验操作中,对实验内容二增加了新的闪烁方式。
空白页
实验四数码管显示实验
一、实验目的
(1)掌握ATMega16的I/O输出特性和使用。
(2)了解数码管的内部结构,掌握数码管动态扫描的原理和设计方法。
二、实验内容
(1)单个数码管字符显示,控制一个数码管循环显示显示“0”-“F”16个字符。
(2)综合实验:
设计一个秒表系统。
三、实验所用仪表及设备
硬件:
PC机一台、AVR_StudyV1.1实验板
软件:
CodeVisionAVR集成开发软件、SLISP下载软件
四、实验步骤
新建项目,实现实验内容1。
建立数码管字型字段编码表(共阴数码管):
flashunsignedchar
led_7[16]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,
0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};
关键字flash表示将数据存放到Flash中,LED_7数组中的量都是固定值,将它们存放到Flash中不会占用有限的Ram资源。
数码管要显示0,使用下面语句:
PORTA=LED_7[0];
建立新项目,实现实验内容2。
硬件连接图如图4.3所示。
图4.3
数码管的动态显示函数:
voiddisplay(void)//扫描显示函数,执行时间12ms
{
chari;
for(i=0;i<=5;i++)
{
PORTA=led_7[dis_buff[i]];
if(point_on&&(i==2||i==4))PORTA|=0x80;
PORTC=position[i];
delay_ms
(2);