太原理工大学单片机实验报告Word格式.docx
《太原理工大学单片机实验报告Word格式.docx》由会员分享,可在线阅读,更多相关《太原理工大学单片机实验报告Word格式.docx(22页珍藏版)》请在冰豆网上搜索。
CreateNewProject->
EmptyProject,点击OK,把此工程文件保存到文件夹ledtest中,命名为:
ledtest.ewp。
1.2配置GeneralOptions
Target设置:
Device:
CC2530F256;
Datamodel:
Large;
Callingconvention:
XDATAstackreetrant
1.3Debugger设置
Driver:
TexasInstruments
2程序代码的编写
2.1新建程序文件:
选择File->
New->
File,新建文件main.c。
2.2引入头文件:
基于CC2530的程序,必须包含对ioCC2530.h的引用,此文件定义了CC2530的各类特殊功能寄存器(SFR)的地址映射。
#include<
ioCC2530.h>
//引入CC2530所对应的头文件(包含各SFR的定义)
2.3定义LED引脚
查看开发板电路图,如下所示:
可知led1~2分别受引脚P1_0~P1_1的控制,因此可以定义led1、led2为引脚P1_0、P1_1。
#defineled1P1_0LED1//定义LED1为P1_0口控制
#defineled2P1_1LED2//定义LED2为P1_1口控制
2.4main函数
接下来,开始编写main函数。
首先,在使用P1_0~P1_1端口前,需对其工作方式以及输入/输出方向进行设置,其中涉及到两个SFR:
P1SEL、P1DIR。
P1SEL=0x00;
//设置P1为普通I/O口
P1DIR|=0x03;
//设置P1_0、P1_1为输出
CC2530具有P0_0~P0_7,P1_0~P1_7,P2_0~P2_7共21个I/O口。
它们可作为通用数字I/O,也可用于连接ADC、定时/计数器或USART等外设IO。
CC2530的SFR中有三类寄存器可用于配置这些IO口:
①PxSEL(x为0/1/2):
P0/P1/P2口功能选择0:
通用数字IO,1:
外设IO,缺省默认为0
②PxDIR(x为0/1/2):
P0/P1/P2口方向0:
输入,1:
输出,缺省默认为0
③PxINP(x为0/1):
P0/P1口输入模式0:
上拉/下拉,1:
三态,缺省默认为0
在使用IO口时需配置,若缺省,则取系统默认值。
然后初始化2个LED灯,设为全灭:
led1=1;
led2=1;
最后,编写LED灯闪烁效果代码:
led1=0;
//led1闪烁
Delay(10);
led2=0;
//led2闪烁
led2=1;
其中涉及到一个延时子函数Delay(unsignedcharn):
voidDelay(unsignedcharn)
{unsignedchari;
unsignedintj;
for(i=0;
i<
n;
i++)
for(j=1;
j;
j++);
}
2.5实验源码
将上述代码合并为一个整体。
本实验主要用到的寄存器:
3.按键轮询
将CPU处在循环的状态中,当按下按键后,会使与按键相关的I/O口的电平拉低,此时我们检测I/O的电压高低来控制相应的小灯亮灭。
3.1程序流程图
3.2代码分析
(1)获取按键的值
ucharKeyScan(void)
{
if(K1==0)//低电平有效
{
Delay(100);
//检测到按键
if(K1==0)
{while(!
K1);
//直到松开按键
return
(1);
}
}
if(K2==0)
{Delay(100);
if(K2==0)
K2);
return
(2);
return(0);
}
该函数实现了识别到底是哪个按键被按下的功能,首先检测K1是否等于0,如果一旦检测到等于0,说明有相应的按键被按下,延时一段时间,又来判断(if(K1==0))这个判断
是为了防止按键抖动。
同理检测按键K2是否被按下。
(2)主函数功能
主函数实现了一按键被按下后,使相应的小灯点亮,同时清除标志位。
五、实验结果
2.6实验现象
LED1灯先闪烁隔一会熄灭,一会儿LED2灯闪烁,隔一会也熄灭。
3.3实验现象
按下K1键,LED1灯亮,按下K2键,LED2灯亮
六、讨论、心得
通过本实验,我们掌握了IAR的配置、程序代码的编写,以及编译及调试的过程;
学会了如何运用IAR编写并在线调试程序LED灯闪烁实验;
学会了按键的基本原理。
在代码编写过程中,对于按键的接口不是很清楚,最后请教同学解决了。
两个按钮分别是P0_1和P0_0。
外部中断
1.学会如何运用IAR编写并在线调试程序外部中断实验;
2.掌握外部中断原理。
理解中断的概念、熟悉中断的基本流程和中断处理函数的书写格式。
3.CC2530仿真器一台。
1.实验内容:
外部中断发生,控制灯的亮灭。
开发板上已把S1按键与P0.1相连,本实验想要达到的效果就是,通过按键S1触发P0.1的中断,进而在中断服务子程序中控制LED1的亮/灭。
2.实验流程图
3.实验涉及的主要寄存器
初始化LED:
设置P1为通用I/O口,设置P1.0~P1.1方向为输出,然后关闭2个LED灯。
再来配置外部中断的相关SFR寄存器,开启各级中断使能,涉及3个SFR:
EA、IEN1、PICTL(各SFR详细介绍请查阅《CC2530中文手册》):
EA——总中断使能;
IEN1.5——P0中断使能;
PICTL.3——P0.1口中断使能;
PICTL.0——设置P0.1口输入下降沿引起中断触发。
然后在主函数中使用while
(1)等待中断即可。
4.代码分析
1)中断及I/O初始化
中断及I/O初始化函数入下:
voidInit_IO_AND_LED(void)
P1DIR=0x03;
//0为输入(默认),1为输入
led1=1;
led2=1;
P0IEN|=0x02;
//P01口中断使能
PICTL|=0x01;
//P01下降沿
EA=1;
IEN1|=0X20;
//P0口中断使能
P0IFG&
=0x00;
//P0口中断状态,如果有中断发生,相应位置1
}
(1)设置P0_1口中断使能
P0IEN|=0x02;
CC2530单片机共有18个中断源,每一个中断都有一个相应的中断使能特殊功能寄存器,当对应位设置为1,使能中断位,当设置为0屏蔽相应的中断位;
这里我们使用的是P0_1,所以我们通过P0IEN|=0x02将p0_1置一。
(2)中断的触发方式
中断的触发方式不外乎这样两种,高低电平触发和边沿触发。
这里我们通过设置PICTL设置了P0_1为下降沿触发,也即当P0_1引脚由高电平到低电平变化时即产生了一次中断。
(3)打开中断总开关和使能P0_1口中断
EA=1;
这个是总开关,18个中断源对应着有18个独自的中断开关,只有将总开关打开,然后再打开相应的小开关,这样你想要允许的总开关才能奏效。
(4)清除中断标志位
P0IFG&
P0IFG是中断标志位,当该位为1时说明已产生过一次中断,为0还未产生中断。
所以初始化我们将它清零,要不然我们怎么知道是否来了中断了呢?
以后我们要想知道是否来了中断我们就可以来查它。
2)中断服务程序
函数代码如下:
#pragmavector=P0INT_VECTOR
__interruptvoidP0_ISR(void)
{
if(P0IFG&
0x02)//按键中断
{
P0IFG=0;
led1=!
led1;
}
P0IFG=0;
//清中断标志
(1)中断服务程序
什么意思呢?
简单来说中断来了,你想要干什么。
(2)CC2530中断格式
格式如下:
a)P0INT_VECTOR——设定的中断向量名
实验现象:
按键S1可以控制LED1灯亮灭
通过本实验,学会了如何运用IAR编写并在线调试程序外部中断实验;
掌握了外部中断原理。
通过中断来控制按钮的操作。
定时器
1.学会使用定时器;
2.运用IAR编写并在线调试程序定时器中断实验。
掌握16位定时器基本使用方法。
1.实验内容:
CC2530共有4个定时器,可分3类:
定时器1、定时器2、定时器3/4(3与4的用法一致)。
定时器1是一个16位