太原理工大学单片机实验报告.docx
- 文档编号:268583
- 上传时间:2023-04-28
- 格式:DOCX
- 页数:22
- 大小:1.03MB
太原理工大学单片机实验报告.docx
《太原理工大学单片机实验报告.docx》由会员分享,可在线阅读,更多相关《太原理工大学单片机实验报告.docx(22页珍藏版)》请在冰点文库上搜索。
实验名称
普通I/O口操作
一、实验目的
1.掌握IAR的配置、程序代码的编写,以及编译及调试的过程;
2.学会如何运用IAR编写并在线调试程序LED灯闪烁实验;
3.学会按键的基本原理。
二、实验内容
在IAR开发环境中建设LED灯闪烁、按键轮询实验工程项目,并完成程序编写和调试。
三、主要仪器和设备
1.中软国际ETC-WSN物联网实验平台一套;2.装有IAR8.10软件的PC机一台;3.CC2530仿真器一台。
四、操作方法和实验步骤
1IAR的配置
IAR是一个强大的嵌入式开发平台,支持非常多种类的芯片。
IAR中的每一个Project,都可以拥有自己的配置,具体包括Device类型、堆/栈、Linker、Debugger等。
1.1新建Workspace和Project
首先新建文件夹ledtest。
打开IAR,选择主菜单File->New->Workspace建立新的工作区域。
选择Project->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
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);
led1=1;
Delay(10);
led2=0;//led2闪烁
Delay(10);
led2=1;
Delay(10);
其中涉及到一个延时子函数Delay(unsignedcharn):
voidDelay(unsignedcharn)
{unsignedchari;unsignedintj;
for(i=0;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) {while(! 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.掌握外部中断原理。 二、实验内容 理解中断的概念、熟悉中断的基本流程和中断处理函数的书写格式。 三、主要仪器和设备 1.中软国际ETC-WSN物联网实验平台一套; 2.装有IAR8.10软件的PC机一台; 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&=0x00;P0IFG是中断标志位,当该位为1时说明已产生过一次中断,为0还未产生中断。 所以初始化我们将它清零,要不然我们怎么知道是否来了中断了呢? 以后我们要想知道是否来了中断我们就可以来查它。 2)中断服务程序 函数代码如下: #pragmavector=P0INT_VECTOR __interruptvoidP0_ISR(void) { if(P0IFG&0x02)//按键中断 { P0IFG=0; led1=! led1; } P0IFG=0;//清中断标志 } (1)中断服务程序 什么意思呢? 简单来说中断来了,你想要干什么。 (2)CC2530中断格式 格式如下: #pragmavector=P0INT_VECTOR __interruptvoidP0_ISR(void) a)P0INT_VECTOR——设定的中断向量名 本实验主要用到的寄存器: 五、实验结果 实验现象: 按键S1可以控制LED1灯亮灭 六、讨论、心得 通过本实验,学会了如何运用IAR编写并在线调试程序外部中断实验;掌握了外部中断原理。 理解中断的概念、熟悉中断的基本流程和中断处理函数的书写格式。 通过中断来控制按钮的操作。 实验名称 定时器 一、实验目的 1.学会使用定时器; 2.运用IAR编写并在线调试程序定时器中断实验。 二、实验内容 掌握16位定时器基本使用方法。 三、主要仪器和设备 1.中软国际ETC-WSN物联网实验平台一套; 2.装有IAR8.10软件的PC机一台; 3.CC2530仿真器一台。 四、操作方法和实验步骤 1.实验内容: CC2530共有4个定时器,可分3类: 定时器1、定时器2、定时器3/4(3与4的用法一致)。 定时器1是一个16位定时器,具有定时器/计数器/脉宽调制功能。 它有3个单独可编程输入捕获/输出比较信道,每一个信道都可以用来当做PWM输出或用来捕获输入信号的边沿时间(关于什么是输入捕获/输出比较,以及如何实现PWM输出,可自行查阅CC2530数据手册)。 定时器有一个很重要的概念: 操作模式。 操作模式包含: 自由运行模式(free-running)、模模式(modulo)和正计数/倒计数模式(up-down)。 2.定时器T1的使用 自由运行模式的溢出值为0xFFFF不可变;而其他两种模式则可通过对T1CC0赋值,以精确控制定时器的溢出值。 本实验正是利用此特性,通过特定的T1CC0,使定时器每隔1s触发一次中断,从而精确控制LED灯的闪烁间隔为1s。 在定时器的modulo模式下,精确控制LED灯的闪烁间隔为1s,即: 亮0.5s→暗0.5s→亮0.5s→暗0.5s......→亮0.5s→暗0.5s(即从暗转亮的时刻间隔为1s)。 亮/暗的反转通过溢出中断来实现。 2.1实验流程图 2.2、计数值计算 LED灯的状态为: 亮0.5s→暗0.5s→亮0.5s→暗0.5s......→亮0.5s→暗0.5s,而且需用溢出中断实现,因此要求定时器的溢出周期为0.5s。 为此,需要计算出相应的溢出值(暂设为N)。 系统时钟频率选为32MHz,提供给定时器的时钟频率默认为16MHz(两者都由特殊功能寄存器CLKCON来配置,具体可查阅CC2530数据手册)。 对于定时器1,设置其时钟分频为128分频。 综上所述,可列式如下: 求出N=62500,其十六进制为0xF424,即需要设置T1CC0H=0xF4,T1CC0L=0x24即可。 2.3代码分析 本实验用到的主要寄存器: 3定时器T4中断 定时器3和定时器4都是8位的定时器,每个定时器都与两个独立的输入捕获、输出比较的定时器通道,每通道都有一个独立I/O接口。 在定时器的Up/down模式下,精确控制LED灯的闪烁间隔为1s,即: 亮0.5s→暗0.5s→亮0.5s→暗0.5s......→亮0.5s→暗0.5s(即从暗转亮的时刻间隔为1s)。 亮/暗的反转通过溢出中断来实现。 3.1程序流程图 3.2代码分析 (1)T4和LED的初始化函数 voidInit_T4_AND_LED(void) 该函数实现了对各个功能函数的调用,并向有参函数提供实参的值。 (2)初始化T4 #defineTIMER34_INIT(timer)/*T4CTL: 定时器控制;0x06setCLR,MODE*/ do { T##timer##CTL=0x06;/*T4CCTL0: 定时器4通道0捕获比较控制;*/ T##timer##CCTL0=0x00;/*T4CC0: 定时器4通道零捕获比较值设定;*/ T##timer##CC0=0x00;/*T4CC0: 定时器4通道零捕获比较值设定;*/ T##timer##CCTL1=0x00;/*T4CCTL1: 定时器4通道1比较捕获控制*/ T##timer##CC1=0x00;/*TTCC1: 定时器4通道0捕获比较值设定*/\ }while(0) 这个宏就是对定时器的初始化,大家看,这里这么多的##,看起来有点不明白,其实说白了它就只是简单的连接符而已;比如说: T##timer##CTL=0x06;这个程序中我们用实参传进来的timer=4,所以这句话的意思就是T4CTL=0x06. (3)启动定时器4 #defineTIMER34_START(timer,val) (T##timer##CTL=(val)? T##timer##CTL|0X10: T##timer##CTL&~0X10) 通过检测T4CTL的值是否等于val的来决定是否启动定时器4. (4)设置系统时钟 #defineTIMER34_SET_CLOCK_DIVIDE(timer,val) do{ T##timer##CTL&=~0XE0; (val==2)? (T##timer##CTL|=0X20): (val==4)? (T##timer##CTL|=0x40): (val==8)? (T##timer##CTL|=0X60): (val==16)? (T##timer##CTL|=0x80): (val==32)? (T##timer##CTL|=0xa0): (val==64)? (T##timer##CTL|=0xc0): (val==128)? (T##timer##CTL|=0XE0): (T##timer##CTL|=0X00);/*1*/ }while(0) 通过传进来的val,我们在这里选择的是128分频。 (5)定时器4模式的设定 #defineTIMER34_SET_MODE(timer,val) do{ T##timer##CTL&=~0X03; (val==1)? (T##timer##CTL|=0X01): /*DOWN*/ (val==2)? (T##timer##CTL|=0X02): /*Modulo*/ (val==3)? (T##timer##CTL|=0X03): /*UP/DOWN*/ (T##timer##CTL|=0X00);/*freeruning*/ }while(0)通过传进来的参数,这里我们设定T4为自动重装模式即freerunning。 五、实验结果 实验现象: 编译程序并在线调试,开发板上的LED1如期闪烁起来,闪烁间隔大概在1s。 六、讨论、心得 本节主要学习了定时器1的计数轮询的方法,实现了精确控制LED灯闪烁间隔为1s。 通过定时器操作就可以获得较为精确的计数值。 实验名称 串口收发数据 一、实验目的 1.学会如何运用IAR编写并在线调试串口通信实验,实现开发板与PC机的通信; 2..掌握串口通信的基本原理。 二、实验内容 掌握UART工作模式、波特率的设置等操作、建立基本的串口通信平台。 三、主要仪器和设备 1.中软国际ETC-WSN物联网实验平台一套; 2.装有IAR8.10软件的PC机一台; 3.CC2530仿真器一台。 四、操作方法和实验步骤 1.实验内容: CC2530包括2个串行通信接口USART0与USART1,每个串口包括两个模式: UART(异步)模式、SPI(同步)模式)。 2.串口通信 2.1程序流程图 2.2实验分析 首先配置USART0所对应的I/O口: 通过对PECFRG.0清零来设置UART0为可选位置1,即RXD对应P0.2,TXD对应P0.3。 然后配置P0.2和P0.3为外部设备I/O。 然后选择UART模式,并使能接收器。 接着配置USART0的参数: 波特率57600,无奇偶校验、停止位为1。 2.3代码分析 (1)初始化串口 voidinitUARTtest(void) { CLKCONCMD&=~0x40;//晶振 while(! (SLEEPSTA&0x40));//等待晶振稳定 CLKCONCMD&=~0x47;//TICHSPD128分频,CLKSPD不分频 PERCFG=0x00;//位置1P0口 P0SEL=0x3c;//P0用作串口 P2DIR&=~0XC0;//P0优先作为串口0 U0CSR|=0x80;//UART方式 U0GCR|=10;//baud_e U0BAUD|=216;//波特率设为57600 UTX0IF=0; } 前面四句话,设置系统的时钟,以及等待时钟稳定;接下来3句话将—P0口初始化为串口;然后设置总线模式为UART方式,然后设置波特率为57600;最后清中断标志位。 (2)发送字符串函数 voidUartTX_Send_String(char*Data,intlen) { intj; for(j=0;j { U0DBUF=*Data++; while(UTX0IF==0); UTX0IF=0; } } 通过向U0DBUF寄存器写入数据,然后硬件自动将其发送出去;所以我们可以将我们的数据写入U0DBUF中,这样就可以发出我们的数据了。 2.4实验现象 通过串口来控制Led灯 3.1实验分析 (1)设置号相应的寄存器。 (2)然后选择UART模式,并使能接收器。 接着配置USART0的参数: 波特率57600,无奇 偶校验、停止位为1。 (3)相应的控制命令 10#关REDLED 11#开REDLED 20#关GREENLED 21#开GREENLED 3.2程序流程图 3.3代码分析 (1)UART初始化函数 voidinitUARTtest(void) { CLKCONCMD&=~0x40;//晶振 while(! (SLEEPSTA&0x40));//等待晶振稳定 CLKCONCMD&=~0x47;//TI
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 太原 理工大学 单片机 实验 报告