单片机实验报告.docx
- 文档编号:23149978
- 上传时间:2023-05-08
- 格式:DOCX
- 页数:29
- 大小:466.08KB
单片机实验报告.docx
《单片机实验报告.docx》由会员分享,可在线阅读,更多相关《单片机实验报告.docx(29页珍藏版)》请在冰豆网上搜索。
单片机实验报告
实验名称:
单片机C语言程序结构和设计(实验2、3)
姓名___学号_
实验班号_机器号__
1、实验目的:
1.掌握单片机C语言程序结构;
2.掌握单片机C语言程序调试方法;
3.掌握MSP430FG2553基本I/O控制方法;
4.巩固编写和调试单片机C语言程序方法;
5.了解简单接口电路的控制方法;
6.了解MSP430汇编格式的寻址方式和指令系统
2、实验基本任务
1、练习调试程序
内容:
用跳线将实验板上的8个发光二极管与单片机连接。
编写的程序L2_debug.C如下,功能是控制与单片机相连接的8个发光二极管在全亮与全灭这两种状态下循环变换。
该程序没有语法上的错误,但运行后不能实现上述现象,请上机调试其中的问题,指出程序的问题,并修改程序。
答:
将单片机P2端口的8个引脚与L1~L8相连。
电路如下:
原有程序为:
通过上机调试,发现原程序有以下错误:
1 由于是P2端口上引脚与LED相接,所以应该设置P2而不是P1
2 应将P2端口调为基本I/O端口,仅通过DIR寄存器是不行的
3 源程序没有对P2OUT进行初始化,无法达到全亮全灭的效果
4 没有循环结构,无法达到全亮全灭的循环效果,可用for(;;)或while
(1)结构
5 delay()函数延时过短,人眼几乎无法感受亮灭的变化
正确的程序应为:
#include"io430.h"
voiddelay();
intmain(void)
{
WDTCTL=WDTPW+WDTHOLD;//关闭看门狗
P2SEL=0;//将P2端口设为基本I/O端口
P2SEL2=0;
P2DIR=0Xff;//设置端口2为输出方向
P2OUT=0;//初始化P2端口引脚,
For(;;){
P2OUT=~P2OUT;
delay();}
}
voiddelay()
{
unsignedintj;
for(j=0;j<0xffff;j++);//延时
}
2.控制发光二极管的显示变化
在任务1的连线基础上,编程控制8个发光二极管按下面的2种规律循环变换,即规
律1?
?
规律2?
规律1?
规律2?
……,如此循环反复。
1)规律1:
8个LED灯顺时针一个一个单独点亮,即L1亮?
L2……L7亮?
L8亮,
每次只有一个灯亮,其他灯灭;
2)规律2:
8个LED灯两两点亮,顺序为L1和L8,L2和L7,L3和L6,L4和L5,
每次只有两个灯亮,其他灯灭;
答:
程序如下:
#include"io430.h"
voiddelay();
voidrule1();
voidrule2();
intmain(void)
{
WDTCTL=WDTPW+WDTHOLD;//关闭看门狗
P2SEL=0;//将P2端口设为基本I/O端口
P2SEL2=0;
P2DIR=0Xff;//设置端口2为输出方向
P2OUT=0;//初始化P2端口引脚,
for(;;){
rule1();
rule2();
}
}
voidrule1()//规律1
{
unsignedcharLED_0=0x01,LED_temp;
LED_temp=LED_0;
for(unsignedinti=0;i<8;i++)
{
P2OUT=~LED_temp;
delay();
LED_temp=LED_temp<<1;
}
}
voidrule2()//规律2
{
unsignedcharLED_data[]={0x81,0x42,0x24,0x18};
for(unsignedinti=0;i<4;i++)
{
P2OUT=~LED_data[i];
delay();
}
}
voiddelay()
{
unsignedintj;
for(j=0;j<0xffff;j++);//延时
}
思考:
如果选择用单片机的P1端口控制8个发光二极管,如何在实验板上设计连线、
并编程实现任务2的功能?
答:
设计连线:
将P1端口的8个引脚与L1~L8对应相连。
程序设计:
将原先程序中所有关于P2端口的操作都换为P1端口即可
3.用按键控制发光二极管的显示变化
在任务2基础上,增加2个按键与单片机的引脚相连,编程实现由按键控制发光二级管
的显示变化:
当按下实验板上的K1键时,8个发光二极管按任务2中的规律1变化;
当按下实验板上的K2键时,8个发光二极管按任务2中的规律2变化。
答:
在实验1的连线基础上,将P1.0、P1.1分别于K1、K2相连。
如下图
程序如下:
#include"io430.h"
voiddelay();
voidrule1();
voidrule2();
intmain(void)
{
WDTCTL=WDTPW+WDTHOLD;//关闭看门狗
P2SEL=0;//将P2端口设为基本I/O端口
P2SEL2=0;
P2DIR=0xff;//设置端口2为输出方向
P2OUT=0;//初始化P2端口引脚,
P1SEL&=~(BIT0+BIT1);//设置P1为基本I/O
P1SEL2&=~(BIT0+BIT1);
P1DIR&=~(BIT0+BIT1);//设置P1.0和P1.1为输入状态
P1REN=0x03;//使P1.0和P1.1能上拉电阻
P1OUT=0x03;
intkey=2;
for(;;)
{
if((P1IN&BIT0)==0)
key=0;
elseif((P1IN&BIT1)==0)
key=1;
if(key==0)
rule1();
elseif(key==1)
rule2();
}
}
voidrule1()//规律1
{
unsignedcharLED_0=0x01,LED_temp;
LED_temp=LED_0;
for(unsignedinti=0;i<8;i++)
{
P2OUT=~LED_temp;
delay();
LED_temp=LED_temp<<1;
}
}
voidrule2()//规律2
{
unsignedcharLED_data[]={0x81,0x42,0x24,0x18};
for(unsignedinti=0;i<4;i++)
{
P2OUT=~LED_data[i];
delay();
}
}
voiddelay()
{
unsignedintj;
for(j=0;j<0xffff;j++);//延时
}
4.并行方式控制数码管的显示
参看附录A,掌握MSP430G2553扩展板上4个数码管的工作原理,用单片机的8个I/O
引脚并行控制数码管的控制端Sh~Sa,设计相关连线。
编程完成下面任务:
1)画出单片机与4个数码管连接的原理图,分析控制方法;
2)编程控制四个数码管从右到左、依次每个数码管分别循环显示0~9、A~F。
3)用4个数码管做一个电子表,高两位数码管显示分钟值,低两位数码管显示秒值。
每计数到5分钟时,控制蜂鸣器发出一报警声,然后又从0开始重新计时。
其中1
秒时间可通过延时完成,如执行for(i=0;i<0x1FFFF;i++),约为1秒。
本次实验对
秒值长短精确度不要求。
思考:
每个数码管显示的时间不能太长,也不能太短,为什么?
答:
1)原理图如下:
控制方法:
P2.0~P2.7与Sa~Sh相连,控制LED灯的亮灭,P1.0~P1.3控制选择哪一个数码管进行输出。
2)编程控制四个数码管从右到左、依次每个数码管分别循环显示0~9、A~F。
程序如下:
#include"io430.h"
voiddelay();
constcharLEDtab[16]={~0x3F,~0x06,~0x5B,~0x4F,~0x66,~0x6D,~0x7D,~0x07,~0x7F,~0x6F,~0x77,~0x7C,~0x39,~0x5E,~0x79,~0x71};
intmain(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;
unsignedinti;
for(;;){
P1OUT=BIT0;//第一个数码管开始输出
for(i=0;i<16;i++){
P2OUT=LEDtab[i];
delay();}
P1OUT=BIT1;//第二个数码管开始输出
for(i=0;i<16;i++){
P2OUT=LEDtab[i];
delay();}
P1OUT=BIT2;//第三个数码管开始输出
for(i=0;i<16;i++){
P2OUT=LEDtab[i];
delay();}
P1OUT=BIT3;//第四个数码管开始输出
for(i=0;i<16;i++){
P2OUT=LEDtab[i];
delay();}
}
}
voiddelay(){//延时函数
unsignedintj;
for(j=0;j<0xffff;j++);//延时
}
3)用4个数码管做一个电子表,高两位数码管显示分钟值,低两位数码管显示秒值。
每计数到5分钟时,控制蜂鸣器发出一报警声,然后又从0开始重新计时。
其中1
秒时间可通过延时完成,如执行for(i=0;i<0x1FFFF;i++),约为1秒。
本次实验对
秒值长短精确度不要求。
答:
在上述连线的基础上,将P1.7与BUZZ相连,程序如下
#include"io430.h"
voiddelay();
voidsecond();
constcharLEDtab[10]={~0x3F,~0x06,~0x5B,~0x4F,~0x66,~0x6D,~0x7D,~0x07,~0x7F,~0x6F};
unsignedchara,b,c,d;
intmain(void)
{
//关闭看门狗
WDTCTL=WDTPW+WDTHOLD;
P1SEL=0;
P1SEL2=0;
P1DIR=0xff;
P1OUT=0+BIT7;
P2SEL=0;
P2SEL2=0;
P2DIR=0xff;
P2OUT=0xff;//初始化
for(;;){
a=b=c=d=~0x3F;
for(intk=0;k<5;k++)//分钟
{
c=LEDtab[k];
for(intj=0;j<6;j++)//秒钟十位
{
b=LEDtab[j];
for(inti=0;i<10;i++)//秒钟个位
{
a=LEDtab[i];
second();
}
}
}
P1OUT=~BIT7;//报警器报警
for(intj=0;j<0xffff;j++);
}
}
voiddelay()//延时函数
{
for(intj=0;j<0x100;j++);
}
voidsecond()//读秒函数,同时以很快的速度显示4个数码管的读数
{
for(intj=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();
}
}
思考:
每个数码管显示的时间不能太长,也不能太短,为什么?
答:
时间过长,没有连续的效果;时间过短,不利于观察读数。
5.汇编格式指令和寻址方式的学习(可在simulator下完成)
L2_2.c源程序见下,建立C项目,进入DEBUG状态,点击view/disassembly,在反汇编
窗口得到L2_2.c汇编格式指令的程序代码,如图2-1和图2-2,阅读该程序的汇编格
式代码。
1)程序用到了哪些指令?
答:
数据传送指令;调用指令;逻辑运算指令;跳转指令;堆栈操作指令;减法运算指令;加法运算指令;返回指令;无条件转移指令。
2)程序用到了哪几种寻址方式?
答:
立即数寻址;寄存器寻址;绝对地址寻址;符号地址寻址。
3)修改l2_2.C,将变量i定义为全局变量,通过反汇编的代码,比较与定义为局部变
量的不同;
答:
定义为全局变量时寻址方式为绝对寻址;而定义为局部变量时为寄存器寻址;?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
4)修改L2_2.C,将变量i的类型从unsignedint类型,改为unsignedlong类型,
反汇编看看函数delay的代码发生了什么变化?
程序执行的结果有什么不同?
为什
么?
(需在实验板上运行)。
答:
1 代码增加了。
unsignedint类型下
Unsignedlong类型下:
2 程序执行时,发光二极管亮灭的时间间隔增大
3 delay程序执行时间增长
三、已完成的选做任务
1.(选做)用蜂鸣器、发光二极管显示按键信息
设计在实验板上用3个相邻发光二极管、8个按键、1个蜂鸣器与单片机的连接,编程
完成每按下某一个键,8个发光二极管以二进制形式显示该键值,K1~K8的键值分别
为000~111B,同时每按下一次键,蜂鸣器响一下,用声音提示接收到按键信息。
答:
连线:
将P2.0~P2.2分别于L1~L3相连,P2.3与BUZZ相连,P1.0~P1.7分别与K1~K8
相连.
程序如下:
#include"io430.h"
voiddelay();
intmain(void)
{
WDTCTL=WDTPW+WDTHOLD;
P2SEL&=0xf0;
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();
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;
};
};
}
voiddelay(){
unsignedinti;
for(i=0;i<0xffff;i++);//延时
}
2.(选做)增加按键控制功能:
按下K1键开始计时(或称继续计时);按下K2键暂停计时,计时保持不变,此后若按下K1键将继续计时;按下K3键将计时归零,并停止计时,若此后按下K1键,将开始计时。
答:
在前面并行电路制作电子表连线的基础上,将P1.4~P1.6与K1~K3相连
程序如下:
#include"io430.h"
voiddelay();
voidsecond();
constcharLEDtab[10]={~0x3F,~0x06,~0x5B,~0x4F,~0x66,~0x6D,~0x7D,~0x07,~0x7F,~0x6F};
unsignedchara,b,c,d;
unsignedcharkey=0;
intmain(void)
{
//关闭看门狗
WDTCTL=WDTPW+WDTHOLD;
P1SEL=0;
P1SEL2=0;
P1DIR=0x8f;//设置P1引脚的输入输出状态
P1REN=0x70;//使P1.4~P1.6能上拉电阻
P1OUT=BIT4+BIT5+BIT6+BIT7;
P2SEL=0;
P2SEL2=0;
P2DIR=0xff;
P2OUT=0xff;//初始化
while
(1){
while(key!
=1){//等待按K1键开始计时
if((P1IN&BIT4)==0)key=1;}
a=b=c=d=~0x3f;
unsignedcharflag=1;
for(intk=0;k<5;k++)
{
c=LEDtab[k];
for(intj=0;j<6;j++)
{
b=LEDtab[j];
for(inti=0;i<10;i++)
{
a=LEDtab[i];
if((P1IN&BIT5)==0)key=2;
while(key==2)//等待按K2键暂停计时
{
second();
if((P1IN&BIT4)==0)key=1;
if((P1IN&BIT6)==0)key=3;
}
if(key==1)
second();
if(key==3)//清零操作开始
{
flag=0;break;
}
}
if(flag==0)break;}
if(flag==0)break;}
P1OUT=BIT4+BIT5+BIT6;//蜂鸣器响
for(intj=0;j<0xffff;j++);
P1OUT=BIT4+BIT5+BIT6+BIT7;//蜂鸣器停止响
}
}
voiddelay()
{
for(intj=0;j<0x500;j++);
}
voidsecond()
{
for(intj=0;j<40;j++)
{
P2OUT=a;
P1OUT=BIT0+BIT4+BIT5+BIT6+BIT7;
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)编程控制四个数码管从右到左、依次每个数码管分别循环显示0~9、A~F。
3)用4个数码管做一个电子表,高两位数码管显示分钟值,低两位数码管显示秒值。
每计数到5分钟时,控制蜂鸣器发出一报警声,然后又从0开始重新计时。
其中1
秒时间可通过延时完成,如执行for(i=0;i<0x1FFFF;i++),约为1秒。
本次实验对
秒值长短精确度不要求。
答:
1)原理图如下:
2)编程控制四个数码管从右到左、依次每个数码管分别循环显示0~9、A~F。
答:
连线方式:
将P1.0~P1.3与S1~S4相连,P1.4与DS相连,P1.5与SHCP相连,P1.6与STCP相连,Sa~Sh与Q0~Q7相连。
程序如下:
#include"io430.h"
voidoutput(charData);
voiddelay();
constcharLEDtab[16]={~0x3F,~0x06,~0x5B,~0x4F,~0x66,~0x6D,~0x7D,~0x07,~0x7F,~0x6F,~0x77,~0x7C,~0x39,~0x5E,~0x79,~0x71};
intmain(void)
{
WDTCTL=WDTPW+WDTHOLD;
P1SEL=0;
P1SEL2=0;
P1DIR=0XFF;
P1OUT=BIT7;//初始化
while
(1)
{
P1OUT=BIT0+BIT7;//第一个数码管输出
for(inti=0;i<16;i++)
{
output(LEDtab[i]);
for(inti=0;i<0xffff;i++);}
P1OUT=BIT1+BIT7;
for(inti=0;i<16;i++)
{
output(LEDtab[i]);
for(inti=0;i<0xffff;i++);}
P1OUT=BIT2+BIT7;
for(inti=0;i<16;i++)
{
output(LEDtab[i]);
for(inti=0;i<0xffff;i++);}
P1OUT=BIT3+BIT7;
for(inti=0;i<16;i++)
{
output(LEDtab[i]);
for(inti=0;i<0xffff;i++);}
}
}
voidoutput(charData)//串行方式输出指定信号
{
for(inti=0;i<8;i++)
{
if((Data&BIT7)==0)
P1OUT&=~BIT4;
else
P1OUT|=BIT4;
Data=Data<<1;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 实验 报告