单片机实验报告Word文档格式.docx
《单片机实验报告Word文档格式.docx》由会员分享,可在线阅读,更多相关《单片机实验报告Word文档格式.docx(29页珍藏版)》请在冰点文库上搜索。
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?
……,如此循环反复。
1)规律1:
8个LED灯顺时针一个一个单独点亮,即L1亮?
L2……L7亮?
L8亮,
每次只有一个灯亮,其他灯灭;
2)规律2:
8个LED灯两两点亮,顺序为L1和L8,L2和L7,L3和L6,L4和L5,
每次只有两个灯亮,其他灯灭;
程序如下:
voidrule1();
voidrule2();
for(;
rule1();
rule2();
}
voidrule1()//规律1
unsignedcharLED_0=0x01,LED_temp;
LED_temp=LED_0;
for(unsignedinti=0;
i<
8;
i++)
{
P2OUT=~LED_temp;
LED_temp=LED_temp<
<
1;
voidrule2()//规律2
unsignedcharLED_data[]={0x81,0x42,0x24,0x18};
4;
P2OUT=~LED_data[i];
}
思考:
如果选择用单片机的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相连。
如下图
P2DIR=0xff;
P1SEL&
=~(BIT0+BIT1);
//设置P1为基本I/O
P1SEL2&
P1DIR&
//设置P1.0和P1.1为输入状态
P1REN=0x03;
//使P1.0和P1.1能上拉电阻
P1OUT=0x03;
intkey=2;
)
if((P1IN&
BIT0)==0)
key=0;
elseif((P1IN&
BIT1)==0)
key=1;
if(key==0)
elseif(key==1)
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。
constcharLEDtab[16]={~0x3F,~0x06,~0x5B,~0x4F,~0x66,~0x6D,~0x7D,~0x07,~0x7F,~0x6F,~0x77,~0x7C,~0x39,~0x5E,~0x79,~0x71};
//关闭看门狗
P1SEL=0;
P1SEL2=0;
P1DIR=0xff;
//设置P1为输出出口
P1OUT=0;
//设置P2为基本I/O
//设置P2为输出出口
P2OUT=0xff;
unsignedinti;
P1OUT=BIT0;
//第一个数码管开始输出
for(i=0;
16;
i++){
P2OUT=LEDtab[i];
P1OUT=BIT1;
//第二个数码管开始输出
P1OUT=BIT2;
//第三个数码管开始输出
P1OUT=BIT3;
//第四个数码管开始输出
voiddelay(){//延时函数
for(j=0;
//延时
在上述连线的基础上,将P1.7与BUZZ相连,程序如下
voidsecond();
constcharLEDtab[10]={~0x3F,~0x06,~0x5B,~0x4F,~0x66,~0x6D,~0x7D,~0x07,~0x7F,~0x6F};
unsignedchara,b,c,d;
//关闭看门狗
P1OUT=0+BIT7;
//初始化
a=b=c=d=~0x3F;
for(intk=0;
k<
5;
k++)//分钟
c=LEDtab[k];
for(intj=0;
6;
j++)//秒钟十位
b=LEDtab[j];
for(inti=0;
10;
i++)//秒钟个位
a=LEDtab[i];
second();
P1OUT=~BIT7;
//报警器报警
voiddelay()//延时函数
0x100;
voidsecond()//读秒函数,同时以很快的速度显示4个数码管的读数
40;
j++)
P2OUT=a;
P1OUT=BIT0+BIT7;
P2OUT=b;
P1OUT=BIT1+BIT7;
P2OUT=c;
P1OUT=BIT2+BIT7;
P2OUT=d;
P1OUT=BIT3+BIT7;
时间过长,没有连续的效果;
时间过短,不利于观察读数。
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
相连.
P2SEL&
=0xf0;
P2SEL2&
P2OUT|=0x0f;
P1REN=0xff;
P1OUT=0xff;
P1DIR=0x00;
BIT0)==0)//按下K1
P2OUT=0x07;
//LED灯显示为000,蜂鸣器响
P2OUT+=BIT3;
//蜂鸣器停止响
};
P2OUT=0x06;
BIT2)==0)
P2OUT=0x05;
BIT3)==0)
P2OUT=0x04;
BIT4)==0)
P2OUT=0x03;
BIT5)==0)
P2OUT=0x02;
BIT6)==0)
P2OUT=0x01;
BIT7)==0)
P2OUT=0x00;
voiddelay(){
i++);
2.(选做)增加按键控制功能:
按下K1键开始计时(或称继续计时);
按下K2键暂停计时,计时保持不变,此后若按下K1键将继续计时;
按下K3键将计时归零,并停止计时,若此后按下K1键,将开始计时。
在前面并行电路制作电子表连线的基础上,将P1.4~P1.6与K1~K3相连
unsignedcharkey=0;
P1DIR=0x8f;
//设置P1引脚的输入输出状态
P1REN=0x70;
//使P1.4~P1.6能上拉电阻
P1OUT=BIT4+BIT5+BIT6+BIT7;
while
(1){
while(key!
=1){//等待按K1键开始计时
BIT4)==0)key=1;
a=b=c=d=~0x3f;
unsignedcharflag=1;
k++)
BIT5)==0)key=2;
while(key==2)//等待按K2键暂停计时
BIT6)==0)key=3;
if(key==1)
if(key==3)//清零操作开始
flag=0;
break;
if(flag==0)break;
P1OUT=BIT4+BIT5+BIT6;
//蜂鸣器响
voiddelay()
0x500;
voidsecond()
P1OUT=BIT0+BIT4+BIT5+BIT6+BIT7;
P1OUT=BIT1+BIT4+BIT5+BIT6+BIT7;
P1OUT=BIT2+BIT4+BIT5+BIT6+BIT7;
P1OUT=BIT3+BIT4+BIT5+BIT6+BIT7;
3.(选做)串行方式控制数码管的显示
答:
连线方式:
将P1.0~P1.3与S1~S4相连,P1.4与DS相连,P1.5与SHCP相连,P1.6与STCP相连,Sa~Sh与Q0~Q7相连。
voidoutput(charData);
P1DIR=0XFF;
P1OUT=BIT7;
while
(1)
//第一个数码管输出
output(LEDtab[i]);
voidoutput(charData)//串行方式输出指定信号
if((Data&
P1OUT&
=~BIT4;
else
P1OUT|=BIT4;
Data=Data<