实验2单片机C语言程序结构Word格式文档下载.docx
《实验2单片机C语言程序结构Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《实验2单片机C语言程序结构Word格式文档下载.docx(18页珍藏版)》请在冰豆网上搜索。
实验板线路连接情况如下
在运行了讲义所提供的L2_debug.C后,发现如下问题:
(1)代码中“P1”应该改为“P2”,因为这里我们用端口2来连接发光二极管。
(2)代码中缺少循环语句,应该加入循环体来使程序不断运行。
(3)程序延时的时间过短,导致难以观察到发光二极管的发光现象,应该将延时时间调长,若要如此做,应该变量j的类型也应该设置为int型,以使其可取到更大的值。
(4)程序未将P2设置为基本IO,应该将P2SEL与P2SEL2设为0x00。
(5)未初始化P2OUT的值,可能出现隐患(虽然在该程序中未出现)。
(修改后的实验1程序代码见程序清单)
调试程序的方法:
(1)利用GO直接运行程序,同时查看实验的现象,检查程序中用到的端口寄存器、变量等的变化,查找程序中的问题。
(2)设置断点,再使用GO,使程序运行到断点处,同时查看实验的现象,检查程序运行到断点处后程序中用到的端口寄存器、变量等的变化,查找程序中的问题。
(3)利用Stepover与Stepinto运行单条或几条语句,同时查看实验的现象,检查运行前后程序中用到的端口寄存器、变量等的变化,查找程序中的问题。
思考:
在修改后的L2_debug.C基础上,比较程序用Stepover(F10)和Stepinto(F11)
单步执行函数delay()有何不同。
答:
用Stepover单步执行delay(),则delay()直接执行完成,用Stepinto单步执行delay(),则会“进入”到delay()内部,每使用一次Stepinto,就执行其内部的一条语句。
2.控制发光二极管的显示变化(实验2程序代码见程序清单)
在任务1的连线基础上,编写一个程序控制8个发光二极管按下面的2种规律循环变换,即规律1>
规律2>
规律1>
规律2……,如此循环反复。
1)规律1:
8个LED灯从L5>
L8>
L1>
L4>
L3>
L2>
L7>
L6一个一个单独点亮,每次只有一个灯亮,其他灯灭;
2)规律2:
8个LED灯两两点亮,顺序为L6和L4,L5和L3,L7和L1,L8和L2,每次只有两个灯亮,其他灯灭。
如果选择用单片机的P1端口控制8个发光二极管,如何在实验板上设计连线、并编程实现任务2的功能?
如果要使用P1端口控制8个发光二极管,应该将P1.0~P1.7与L1~L8相连,将实验2程序代码中的“P2”全部用“P1”代替。
3.用按键控制发光二极管的显示变化(实验3程序代码见程序清单)
在任务2基础上,增加2个按键与单片机的引脚相连,编程实现由按键控制发光二级管的显示变化:
当按下实验板上的K5键时,8个发光二极管按任务2中的规律1变化;
当按下实验板上的K2键时,8个发光二极管按任务2中的规律2变化。
要求每按下一次键,蜂鸣器响一下,用声音提示单片机接收到按键操作。
线路连接情况如下
三.提高任务
4.用按键控制步进电机转动(实验4
(1)与4
(2)程序代码见程序清单)
参看步进电机工作原理实验课件,了解控制步进电机工作方法。
完成:
1)设计单片机msp430G2553控制步进电机的电路连线,编程控制电机正转、反转各一圈,并测试用四拍法控制电机转一圈需要多少步。
注意:
每步之后需用for(i=0;
i<
K;
i++)延时一会,K的参考取值约在0x150~0xFFF之间,太小(如K<
0x0180)、太大(如K>
0xFFF),电机转动不宜观察。
经过实验,发现用四拍法让电机转一圈需要256步(延时为0x1f0时)。
2)在1)的基础上增加按键控制:
按下K6键电机顺时针转动(正转);
按下K3键电机逆时针转动(反转);
按下K1键电机停转。
每按下一次键,蜂鸣器响一下,用声音提示接收到按键信息。
5.用八拍法控制步进电机转动(实验5程序代码见程序清单)
上网查找资料或参看课件,了解用八拍控制步进电机转动的原理和方法,编程实现用八拍法控制电机转动一圈。
根据实验发现用八拍法让电机转动一圈需要256步(延时为0x1f0时)。
五.附录:
程序清单
(1)L2_debug.C
#include“io430.h”
voiddelay();
intmain(void)
{
WDTCTL=WDTPW+WDTHOLD;
//关闭看门狗
P1DIR=0xff;
//设置端口1为输出方向
P1OUT=~P1OUT;
//将端口1的值取反后输出
delay();
//调用函数延时
}
voiddelay()//延时函数
{unsignedcharj;
for(j=0;
j<
=5;
j++)
(2)实验1程序(修改后)
#include"
io430.h"
voiddelay();
intmain(void)
//Stopwatchdogtimertopreventtimeoutreset
P2SEL=0x00;
P2DIR=0xff;
while
(1)
{
P2OUT=~P2OUT;
delay();
};
return0;
voiddelay()
unsignedintj;
30000;
j++);
(3)实验2程序
unsignedcharLight1[8]={0x10,0x80,0x01,0x08,0x04,0x02,0x40,0x20};
unsignedcharLight2[4]={0x28,0x14,0x41,0x82};
unsignedchari;
for(i=0;
i<
=7;
i++)
P2OUT=~Light1[i];
=3;
P2OUT=~Light2[i];
longintj;
300000;
(4)实验3程序
voidbuzz();
unsignedchari,flag=0,key=0;
P1DIR|=BIT7;
P1SEL=0x00;
P1SEL2=0x00;
P1REN|=BIT1+BIT4;
P1OUT=0xff;
P2SEL2=0x00;
P2OUT=0xff;
if((P1IN&
BIT4)==0)
key=1;
buzz();
}
elseif((P1IN&
BIT1)==0)
key=2;
if(key==1)
{
key=2;
flag=1;
break;
if(flag==1)
flag=0;
if(key==2)
key=1;
voidbuzz()
P1OUT&
=~BIT7;
P1OUT|=0xff;
(5)实验4
(1)程序
unsignedchari,flag=0,key=0;
unsignedintj;
unsignedcharFFW[4]={0x01,0x02,0x04,0x08};
unsignedcharFFZ[4]={0x01,0x08,0x04,0x02};
P2OUT=0x00;
=256;
P2OUT=FFW[i];
P2OUT=FFZ[i];
0x1f0;
(6)实验4
(2)程序
P1DIR=BIT7;
P1REN|=BIT0+BIT2+BIT5;
BIT2)==0)
BIT5)==0)
if(key==0)
0xfff;
P1OUT|=BIT7;
(7)实验5程序
unsignedcharFFW[8]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09};
unsignedcharFFZ[8]={0x01,0x09,0x08,0x0c,0x04,0x06,0x02,0x03};