太原理工大学单片机实验报告 下载本文

内容发布更新时间 : 2024/6/1 8:35:18星期一 下面是文章的全部内容请认真阅读。

实验名称 一、实验目的 1.掌握IAR的配置、程序代码的编写,以及编译及调试的过程; 2.学会如何运用 IAR 编写并在线调试程序LED灯闪烁实验; 3. 学会按键的基本原理。 普通I/O口操作 二、实验内容 在IAR开发环境中建设LED灯闪烁、按键轮询实验工程项目,并完成程序编写和调试。 三、主要仪器和设备 1.中软国际ETC-WSN物联网实验平台一套;2. 装有IAR8.10软件的PC机一台; 3. CC2530仿真器一台。 四、操作方法和实验步骤 1 IAR的配置 IAR是一个强大的嵌入式开发平台,支持非常多种类的芯片。IAR中的每一个Project,都可以拥有自己的配置,具体包括Device类型、堆/栈、Linker、Debugger等。 1.1新建 Workspace 和 Project 首先新建文件夹 ledtest。打开IAR,选择主菜单File -> New -> Workspace建立新的工作区域。选择Project -> Create New Project -> Empty Project,点击OK,把此工程文件保存到文件夹 ledtest 中,命名为:ledtest.ewp。 1.2配置General Options Target设置:Device:CC2530F256; Data model:Large; Calling convention:XDATAstack reetrant 1.3 Debugger设置 Driver:Texas Instruments 2程序代码的编写 2.1新建程序文件:选择File->New->File,新建文件main.c。 2.2引入头文件:基于CC2530的程序,必须包含对ioCC2530.h的引用,此文件定义了CC2530的各类特殊功能寄存器(SFR)的地址映射。 #include //引入CC2530所对应的头文件(包含各SFR的定义) 2.3定义LED引脚 查看开发板电路图,如下所示: 可知led1~2分别受引脚P1_0~P1_1的控制,因此可以定义 led1、led2 为引脚 P1_0、P1_1。 #define led1 P1_0 LED1 //定义LED1为P1_0口控制 #define led2 P1_1 LED2 //定义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(unsigned char n): void Delay(unsigned char n) { unsigned char i; unsigned int j; for(i = 0; i < n; i++) for(j = 1; j; j++); } 2.5实验源码 将上述代码合并为一个整体。本实验主要用到的寄存器: 3. 按键轮询 将CPU处在循环的状态中,当按下按键后,会使与按键相关的I/O口的电平拉低,此时我们检测 I/O 的电压高低来控制相应的小灯亮灭。 3.1程序流程图 3.2代码分析 (1)获取按键的值 uchar KeyScan(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)主函数功能 主函数实现了一按键被按下后,使相应的小灯点亮,同时清除标志位。本实验主要用到的寄存器: 五、实验结果