c语言实验报告_第1页
c语言实验报告_第2页
c语言实验报告_第3页
c语言实验报告_第4页
c语言实验报告_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、实验名称:单片机C语言程序结构和设计(实验2、3)姓名_ _ 学号实验班号 机器号1、 实验目的:1. 掌握单片机C语言程序结构;2. 掌握单片机C语言程序调试方法;3. 掌握MSP430FG2553基本I/O控制方法;4. 巩固编写和调试单片机C语言程序方法;5. 了解简单接口电路的控制方法;6. 了解MSP430汇编格式的寻址方式和指令系统2、 实验基本任务1、练习调试程序内容:用跳线将实验板上的8个发光二极管与单片机连接。编写的程序L2_debug.C如下,功能是控制与单片机相连接的8个发光二极管在全亮与全灭这两种状态下循环变换。 该程序没有语法上的错误, 但运行后不能实现上述现象, 请

2、上机调试其中的问题, 指出程序的问题,并修改程序。答: 将单片机P2端口的8个引脚与L1L8相连。电路如下:原有程序为:通过上机调试,发现原程序有以下错误:1 由于是P2端口上引脚与LED相接,所以应该设置P2而不是P12 应将P2端口调为基本I/O端口,仅通过DIR寄存器是不行的3 源程序没有对P2OUT进行初始化,无法达到全亮全灭的效果4 没有循环结构,无法达到全亮全灭的循环效果,可用for(;)或while(1)结构5 delay()函数延时过短,人眼几乎无法感受亮灭的变化正确的程序应为:#include "io430.h"void delay();int main(

3、 void ) WDTCTL = WDTPW + WDTHOLD; /关闭看门狗 P2SEL=0; /将P2端口设为基本I/O端口 P2SEL2=0; P2DIR=0Xff; /设置端口2为输出方向 P2OUT=0; /初始化P2端口引脚, For(;) P2OUT=P2OUT; delay();void delay() unsigned int j; for (j=0;j<0xffff;j+); /延时2 控制发光二极管的显示变化 在任务 1 的连线基础上,编程控制 8 个发光二极管按下面的 2 种规律循环变换,即规律 1à规律 2规律 1规律 2,如此循环反复。 1) 规律

4、 1:8 个 LED 灯顺时针一个一个单独点亮,即 L1 亮àL2L7 亮àL8 亮,每次只有一个灯亮,其他灯灭; 2) 规律 2:8 个LED灯两两点亮,顺序为 L1 和 L8,L2和 L7,L3 和 L6,L4 和 L5,每次只有两个灯亮,其他灯灭;答:程序如下:#include "io430.h"void delay();void rule1();void rule2();int main( void ) WDTCTL = WDTPW + WDTHOLD; /关闭看门狗 P2SEL=0; /将P2端口设为基本I/O端口 P2SEL2=0; P2DI

5、R=0Xff; /设置端口2为输出方向 P2OUT=0; /初始化P2端口引脚, for(;) rule1(); rule2(); void rule1() /规律1 unsigned char LED_0=0x01,LED_temp; LED_temp=LED_0; for(unsigned int i=0;i<8;i+) P2OUT=LED_temp; delay(); LED_temp=LED_temp<<1; void rule2() /规律2 unsigned char LED_data=0x81,0x42,0x24,0x18; for(unsigned int i

6、=0;i<4;i+) P2OUT=LED_datai; delay(); void delay() unsigned int j; for (j=0;j<0xffff;j+); /延时 思考:如果选择用单片机的 P1 端口控制 8 个发光二极管,如何在实验板上设计连线、并编程实现任务 2 的功能? 答: 设计连线:将P1端口的8个引脚与L1L8对应相连。程序设计:将原先程序中所有关于P2端口的操作都换为P1端口即可3. 用按键控制发光二极管的显示变化 在任务 2 基础上,增加 2 个按键与单片机的引脚相连,编程实现由按键控制发光二级管的显示变化:当按下实验板上的 K1 键时,8 个

7、发光二极管按任务 2 中的规律 1 变化;当按下实验板上的 K2 键时,8 个发光二极管按任务 2 中的规律 2 变化。 答:在实验1的连线基础上,将P1.0、P1.1分别于K1、K2相连。如下图程序如下:#include "io430.h"void delay();void rule1();void rule2();int main( void ) WDTCTL = WDTPW + WDTHOLD; /关闭看门狗 P2SEL=0; /将P2端口设为基本I/O端口 P2SEL2=0; P2DIR=0xff; /设置端口2为输出方向 P2OUT=0; /初始化P2端口引脚,

8、P1SEL&=(BIT0+BIT1);/设置P1为基本I/O P1SEL2&=(BIT0+BIT1); P1DIR&=(BIT0+BIT1);/设置P1.0和P1.1为输入状态 P1REN=0x03;/使P1.0和P1.1能上拉电阻 P1OUT=0x03; int key=2; for(;) if(P1IN&BIT0)=0) key=0; else if(P1IN&BIT1)=0) key=1; if(key=0) rule1(); else if(key=1) rule2(); void rule1() /规律1 unsigned char LED_0

9、=0x01,LED_temp; LED_temp=LED_0; for(unsigned int i=0;i<8;i+) P2OUT=LED_temp; delay(); LED_temp=LED_temp<<1; void rule2() /规律2 unsigned char LED_data=0x81,0x42,0x24,0x18; for(unsigned int i=0;i<4;i+) P2OUT=LED_datai; delay(); void delay() unsigned int j; for (j=0;j<0xffff;j+); /延时4. 并行

10、方式控制数码管的显示 参看附录A, 掌握 MSP430G2553 扩展板上 4 个数码管的工作原理, 用单片机的 8 个 I/O引脚并行控制数码管的控制端 ShSa,设计相关连线。编程完成下面任务: 1) 画出单片机与 4 个数码管连接的原理图,分析控制方法; 2) 编程控制四个数码管从右到左、依次每个数码管分别循环显示 09、AF。 3) 用 4 个数码管做一个电子表,高两位数码管显示分钟值,低两位数码管显示秒值。每计数到 5分钟时,控制蜂鸣器发出一报警声,然后又从 0 开始重新计时。 其中 1秒时间可通过延时完成,如执行 for (i=0; i<0x1FFFF;i+) ,约为 1 秒

11、。本次实验对秒值长短精确度不要求。 思考:每个数码管显示的时间不能太长,也不能太短,为什么? 答:1) 原理图如下:控制方法:P2.0P2.7与S aS h相连,控制LED灯的亮灭,P1.0P1.3控制选择哪一个数码管进行输出。2) 编程控制四个数码管从右到左、依次每个数码管分别循环显示 09、AF。程序如下:#include "io430.h"void delay();const char LEDtab16=0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71;int

12、 main( void ) WDTCTL = WDTPW + WDTHOLD;/关闭看门狗 P1SEL=0;/设置P1为基本I/O P1SEL2=0; P1DIR=0xff;/设置P1为输出出口 P1OUT=0; P2SEL=0;/设置P2为基本I/O P2SEL2=0; P2DIR=0xff;/设置P2为输出出口 P2OUT=0xff; unsigned int i; for(;) P1OUT=BIT0; /第一个数码管开始输出 for(i=0;i<16;i+) P2OUT=LEDtabi; delay(); P1OUT=BIT1; /第二个数码管开始输出 for(i=0;i<1

13、6;i+) P2OUT=LEDtabi; delay(); P1OUT=BIT2; /第三个数码管开始输出 for(i=0;i<16;i+) P2OUT=LEDtabi; delay(); P1OUT=BIT3; /第四个数码管开始输出 for(i=0;i<16;i+) P2OUT=LEDtabi; delay(); void delay() /延时函数 unsigned int j; for(j=0;j<0xffff;j+);/延时3) 用 4 个数码管做一个电子表,高两位数码管显示分钟值,低两位数码管显示秒值。每计数到 5分钟时,控制蜂鸣器发出一报警声,然后又从 0 开始

14、重新计时。 其中 1秒时间可通过延时完成,如执行 for (i=0; i<0x1FFFF;i+) ,约为 1 秒。本次实验对秒值长短精确度不要求。 答:在上述连线的基础上,将P1.7与BUZZ相连,程序如下#include "io430.h"void delay();void second();const char LEDtab10=0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F;unsigned char a,b,c,d;int main( void ) / 关闭看门狗 WDTCTL = WDTPW + WDTHO

15、LD; P1SEL=0; P1SEL2=0; P1DIR=0xff; P1OUT=0+BIT7; P2SEL=0; P2SEL2=0; P2DIR=0xff; P2OUT=0xff; /初始化 for(;) a=b=c=d=0x3F; for(int k=0;k<5;k+) /分钟 c=LEDtabk; for(int j=0;j<6;j+) /秒钟十位 b=LEDtabj; for(int i=0;i<10;i+) /秒钟个位 a=LEDtabi; second(); P1OUT=BIT7; /报警器报警 for(int j=0;j<0xffff;j+); void

16、delay() /延时函数 for(int j=0;j<0x100;j+);void second() /读秒函数,同时以很快的速度显示4个数码管的读数 for(int j=0;j<40;j+) P2OUT=a; P1OUT=BIT0+BIT7; delay(); P2OUT=b; P1OUT=BIT1+BIT7; delay(); P2OUT=c; P1OUT=BIT2+BIT7; delay(); P2OUT=d; P1OUT=BIT3+BIT7; delay(); 思考:每个数码管显示的时间不能太长,也不能太短,为什么? 答:时间过长,没有连续的效果;时间过短,不利于观察读数

17、。5. 汇编格式指令和寻址方式的学习(可在simulator下完成) L2_2.c源程序见下,建立C项目,进入DEBUG状态,点击view/disassembly,在反汇编窗口得到L2_2.c汇编格式指令的程序代码,如图2-1和图2-2,阅读该程序的汇编格式代码。1) 程序用到了哪些指令?答:数据传送指令;调用指令;逻辑运算指令;跳转指令;堆栈操作指令;减法运算指令;加法运算指令;返回指令;无条件转移指令。2) 程序用到了哪几种寻址方式? 答:立即数寻址;寄存器寻址;绝对地址寻址;符号地址寻址。 3) 修改l2_2.C,将变量i定义为全局变量,通过反汇编的代码,比较与定义为局部变量的不同;答:

18、定义为全局变量时寻址方式为绝对寻址;而定义为局部变量时为寄存器寻址;全局变量在分配内存是是分配在数据区的,所以所有的程序代码都可以访问,但是局部变量是在堆栈段,所以局部变量在使用完成之后就消失了的 4) 修改L2_2.C, 将变量i的类型从 unsigned int 类型,改为unsigned long 类型,反汇编看看函数delay的代码发生了什么变化?程序执行的结果有什么不同?为什么?(需在实验板上运行) 。 答:1 代码增加了。unsigned int类型下Unsigned long 类型下:2 程序执行时,发光二极管亮灭的时间间隔增大3 delay程序执行时间增长 三、已完成的选做任务

19、1. (选做)用蜂鸣器、发光二极管显示按键信息 设计在实验板上用 3 个相邻发光二极管、8 个按键、1 个蜂鸣器与单片机的连接,编程完成每按下某一个键,8个发光二极管以二进制形式显示该键值, K1K8 的键值分别为 000111B,同时每按下一次键,蜂鸣器响一下,用声音提示接收到按键信息。答:连线:将P2.0P2.2分别于L1L3相连,P2.3与BUZZ相连,P1.0P1.7分别与K1K8相连.程序如下:#include "io430.h"void delay();int main( void ) WDTCTL = WDTPW + WDTHOLD; P2SEL&=0

20、xf0; P2SEL2&=0xf0; P2OUT|=0x0f; P2DIR=0xff; P1REN=0xff; P1OUT=0xff; P1SEL=0; P1SEL2=0; P1DIR=0x00; /初始化 for(;) if(P1IN&BIT0)=0) /按下K1 P2OUT=0x07; /LED灯显示为000,蜂鸣器响 delay(); P2OUT+=BIT3; /蜂鸣器停止响 ; if(P1IN&BIT1)=0) P2OUT=0x06; delay(); P2OUT+=BIT3; ; if(P1IN&BIT2)=0) P2OUT=0x05; delay()

21、; P2OUT+=BIT3; ; if(P1IN&BIT3)=0) P2OUT=0x04; delay(); P2OUT+=BIT3; ; if(P1IN&BIT4)=0) P2OUT=0x03; delay(); P2OUT+=BIT3; ; if(P1IN&BIT5)=0) P2OUT=0x02; delay(); P2OUT+=BIT3; ; if(P1IN&BIT6)=0) P2OUT=0x01; delay(); P2OUT+=BIT3; ; if(P1IN&BIT7)=0) P2OUT=0x00; delay(); P2OUT+=BIT3;

22、; ;void delay() unsigned int i; for(i=0;i<0xffff;i+); /延时2. (选做)增加按键控制功能:按下 K1 键开始计时(或称继续计时) ;按下 K2 键暂停计时,计时保持不变, 此后若按下 K1 键将继续计时;按下 K3 键将计时归零,并停止计时,若此后按下 K1 键,将开始计时。答:在前面并行电路制作电子表连线的基础上,将P1.4P1.6与K1K3相连程序如下:#include "io430.h"void delay();void second();const char LEDtab10=0x3F,0x06,0x5B

23、,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F;unsigned char a,b,c,d;unsigned char key=0;int main( void ) / 关闭看门狗 WDTCTL = WDTPW + WDTHOLD; P1SEL=0; P1SEL2=0; P1DIR=0x8f; /设置P1引脚的输入输出状态 P1REN=0x70; /使P1.4P1.6能上拉电阻 P1OUT=BIT4+BIT5+BIT6+BIT7; P2SEL=0; P2SEL2=0; P2DIR=0xff; P2OUT=0xff; /初始化 while(1) while(key!=1)

24、 /等待按K1键开始计时 if(P1IN&BIT4)=0) key=1; a=b=c=d=0x3f; unsigned char flag=1; for(int k=0;k<5;k+) c=LEDtabk; for(int j=0;j<6;j+) b=LEDtabj; for(int i=0;i<10;i+) a=LEDtabi; if(P1IN&BIT5)=0) key=2; while(key=2) /等待按K2键暂停计时 second(); if(P1IN&BIT4)=0) key=1; if(P1IN&BIT6)=0) key=3; i

25、f (key=1) second(); if (key=3) /清零操作开始 flag=0; break; if(flag=0) break; if(flag=0) break; P1OUT=BIT4+BIT5+BIT6; /蜂鸣器响 for(int j=0;j<0xffff;j+); P1OUT=BIT4+BIT5+BIT6+BIT7; /蜂鸣器停止响 void delay() for(int j=0;j<0x500;j+);void second() for(int j=0;j<40;j+) P2OUT=a; P1OUT=BIT0+BIT4+BIT5+BIT6+BIT7;

26、 delay(); P2OUT=b; P1OUT=BIT1+BIT4+BIT5+BIT6+BIT7; delay(); P2OUT=c; P1OUT=BIT2+BIT4+BIT5+BIT6+BIT7; delay(); P2OUT=d; P1OUT=BIT3+BIT4+BIT5+BIT6+BIT7; delay(); 3. (选做) 串行方式控制数码管的显示 1) 画出单片机与 4 个数码管连接的原理图,分析控制方法; 2) 编程控制四个数码管从右到左、依次每个数码管分别循环显示 09、AF。 3) 用 4 个数码管做一个电子表,高两位数码管显示分钟值,低两位数码管显示秒值。每计数到 5分钟时

27、,控制蜂鸣器发出一报警声,然后又从 0 开始重新计时。 其中 1秒时间可通过延时完成,如执行 for (i=0; i<0x1FFFF;i+) ,约为 1 秒。本次实验对秒值长短精确度不要求。答:1) 原理图如下: 2) 编程控制四个数码管从右到左、依次每个数码管分别循环显示 09、AF。答:连线方式:将P1.0P1.3与S1S4相连,P1.4与DS相连,P1.5与SHCP相连,P1.6与STCP相连,SaSh与Q0Q7相连。程序如下:#include "io430.h"void output(char Data);void delay();const char LED

28、tab16=0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71;int main( void ) WDTCTL = WDTPW + WDTHOLD; P1SEL=0; P1SEL2=0; P1DIR=0XFF; P1OUT=BIT7; /初始化 while(1) P1OUT=BIT0+BIT7; /第一个数码管输出 for(int i=0;i<16;i+) output(LEDtabi); for(int i=0;i<0xffff;i+); P1OUT=BIT1+BIT7;

29、for(int i=0;i<16;i+) output(LEDtabi); for(int i=0;i<0xffff;i+); P1OUT=BIT2+BIT7; for(int i=0;i<16;i+) output(LEDtabi); for(int i=0;i<0xffff;i+); P1OUT=BIT3+BIT7; for(int i=0;i<16;i+) output(LEDtabi); for(int i=0;i<0xffff;i+); void output(char Data) /串行方式输出指定信号 for(int i=0;i<8;i+

30、) if(Data&BIT7)=0) P1OUT&=BIT4; else P1OUT|=BIT4; Data=Data<<1; P1OUT|=BIT5; delay(); P1OUT&=BIT5; P1OUT|=BIT6; delay(); P1OUT&=BIT6;void delay() /延时函数 for(int i=0;i<0xff;i+);3) 用 4 个数码管做一个电子表,高两位数码管显示分钟值,低两位数码管显示秒值。每计数到 5分钟时,控制蜂鸣器发出一报警声,然后又从 0 开始重新计时。答:在上述连线的基础上,将P1.7与BUZZ相

31、连,程序如下#include "io430.h"void delay();void second();void output(char Data);const char LEDtab10=0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F;unsigned char a,b,c,d;int main( void ) / Stop watchdog timer to prevent time out reset WDTCTL = WDTPW + WDTHOLD; P1SEL=0; P1SEL2=0; P1DIR=0XFF; P1OUT=BIT7; /初始化 while(1) a=b=c=

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论