实验2单片机C语言程序结构.docx

上传人:b****7 文档编号:9417836 上传时间:2023-02-04 格式:DOCX 页数:18 大小:76.37KB
下载 相关 举报
实验2单片机C语言程序结构.docx_第1页
第1页 / 共18页
实验2单片机C语言程序结构.docx_第2页
第2页 / 共18页
实验2单片机C语言程序结构.docx_第3页
第3页 / 共18页
实验2单片机C语言程序结构.docx_第4页
第4页 / 共18页
实验2单片机C语言程序结构.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

实验2单片机C语言程序结构.docx

《实验2单片机C语言程序结构.docx》由会员分享,可在线阅读,更多相关《实验2单片机C语言程序结构.docx(18页珍藏版)》请在冰豆网上搜索。

实验2单片机C语言程序结构.docx

实验2单片机C语言程序结构

实验2单片机C语言程序结构

实验名称:

单片机C语言程序结构

姓名:

学号:

实验班号:

机器号:

一.实验目的

1.掌握单片机C语言程序结构;

2.掌握单片机C语言程序调试方法;

3.掌握MSP430FG2553基本I/O控制方法。

二.实验基本任务

1.练习调试程序

1.练习调试程序用跳线块将实验板上的8个发光二极管的控制端L8~L1与单片机的8个引脚P2.7~P2.0相连。

编写的程序L2_debug.C如程序清单,功能是控制与单片机相连接的8个发光二极管在全亮与全灭这两种状态下循环变换。

该程序没有语法上的错误,但运行后不能产生上述现象,请上机调试其中的问题,指出并修改程序的问题。

总结调试程序的方法,比较G、stepover、stepinto和断点运行等几种执行命令的不同,如何有效应用这些命令进行调试。

实验板线路连接情况如下

在运行了讲义所提供的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;i0xFFF),电机转动不宜观察。

经过实验,发现用四拍法让电机转一圈需要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

WDTCTL=WDTPW+WDTHOLD;

P2SEL=0x00;

P2DIR=0xff;

while

(1)

{

P2OUT=~P2OUT;

delay();

};

return0;

}

voiddelay()

{

unsignedintj;

for(j=0;j<30000;j++);

}

 

(3)实验2程序

#include"io430.h"

voiddelay();

intmain(void)

{

//Stopwatchdogtimertopreventtimeoutreset

WDTCTL=WDTPW+WDTHOLD;

unsignedcharLight1[8]={0x10,0x80,0x01,0x08,0x04,0x02,0x40,0x20};

unsignedcharLight2[4]={0x28,0x14,0x41,0x82};

unsignedchari;

P2SEL=0x00;

P2DIR=0xff;

while

(1)

{

for(i=0;i<=7;i++)

{

P2OUT=~Light1[i];

delay();

};

for(i=0;i<=3;i++)

{

P2OUT=~Light2[i];

delay();

};

};

return0;

}

voiddelay()

{

longintj;

for(j=0;j<300000;j++);

}

 

(4)实验3程序

#include"io430.h"

voidbuzz();

voiddelay();

intmain(void)

{

//Stopwatchdogtimertopreventtimeoutreset

WDTCTL=WDTPW+WDTHOLD;

unsignedcharLight1[8]={0x10,0x80,0x01,0x08,0x04,0x02,0x40,0x20};

unsignedcharLight2[4]={0x28,0x14,0x41,0x82};

unsignedchari,flag=0,key=0;

P1DIR|=BIT7;

P1SEL=0x00;

P1SEL2=0x00;

P1REN|=BIT1+BIT4;

P1OUT=0xff;

P2SEL=0x00;

P2SEL2=0x00;

P2DIR=0xff;

P2OUT=0xff;

while

(1)

{

if((P1IN&BIT4)==0)

{

key=1;

buzz();

}

elseif((P1IN&BIT1)==0)

{

key=2;

buzz();

}

if(key==1)

{

while

(1)

{

for(i=0;i<=7;i++)

{

P2OUT=~Light1[i];

delay();

if((P1IN&BIT1)==0)

{

key=2;

flag=1;

break;

}

};

if(flag==1)

{

flag=0;

buzz();

break;

}

};

}

if(key==2)

{

buzz();

while

(1)

{

for(i=0;i<=3;i++)

{

P2OUT=~Light2[i];

delay();

if((P1IN&BIT4)==0)

{

key=1;

flag=1;

break;

}

};

if(flag==1)

{

flag=0;

buzz();

break;

}

};

}

P2OUT=0xff;

};

return0;

}

voiddelay()

{

longintj;

for(j=0;j<30000;j++);

}

voidbuzz()

{

P1OUT&=~BIT7;

delay();

P1OUT|=0xff;

}

 

(5)实验4

(1)程序

#include"io430.h"

unsignedchari,flag=0,key=0;

unsignedintj;

voidbuzz();

voiddelay();

intmain(void)

{

//Stopwatchdogtimertopreventtimeoutreset

WDTCTL=WDTPW+WDTHOLD;

unsignedcharFFW[4]={0x01,0x02,0x04,0x08};

unsignedcharFFZ[4]={0x01,0x08,0x04,0x02};

P2SEL=0x00;

P2SEL2=0x00;

P2DIR=0xff;

P2OUT=0x00;

while

(1)

{

for(j=0;j<=256;j++)

{

for(i=0;i<=3;i++)

{

P2OUT=FFW[i];

delay();

};

};

for(j=0;j<=256;j++)

{

for(i=0;i<=3;i++)

{

P2OUT=FFZ[i];

delay();

};

};

};

return0;

}

voiddelay()

{

longintj;

for(j=0;j<0x1f0;j++);

}

 

(6)实验4

(2)程序

#include"io430.h"

unsignedchari,flag=0,key=0;

voidbuzz();

voiddelay();

intmain(void)

{

//Stopwatchdogtimertopreventtimeoutreset

WDTCTL=WDTPW+WDTHOLD;

unsignedcharFFW[4]={0x01,0x02,0x04,0x08};

unsignedcharFFZ[4]={0x01,0x08,0x04,0x02};

P1DIR=BIT7;

P1SEL=0x00;

P1SEL2=0x00;

P1REN|=BIT0+BIT2+BIT5;

P1OUT=0xff;

P2SEL=0x00;

P2SEL2=0x00;

P2DIR=0xff;

P2OUT=0x00;

while

(1)

{

if((P1IN&BIT2)==0)

{

key=1;

buzz();

}

elseif((P1IN&BIT5)==0)

{

key=2;

buzz();

}

if(key==1)

{

while

(1)

if(key==0)

{

P2OUT=0x00;

}

};

return0;

}

voiddelay()

{

longintj;

for(j=0;j<0xfff;j++);

}

voidbuzz()

{

P1OUT&=~BIT7;

delay();

P1OUT|=BIT7;

}

 

(7)实验5程序

#include"io430.h"

unsignedchari,flag=0,key=0;

unsignedintj;

voidbuzz();

voiddelay();

intmain(void)

{

//Stopwatchdogtimertopreventtimeoutreset

WDTCTL=WDTPW+WDTHOLD;

unsignedcharFFW[8]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09};

unsignedcharFFZ[8]={0x01,0x09,0x08,0x0c,0x04,0x06,0x02,0x03};

P2SEL=0x00;

P2SEL2=0x00;

P2DIR=0xff;

P2OUT=0x00;

while

(1)

{

for(j=0;j<=256;j++)

{

for(i=0;i<=7;i++)

{

P2OUT=FFW[i];

delay();

};

};

for(j=0;j<=256;j++)

{

for(i=0;i<=7;i++)

{

P2OUT=FFZ[i];

delay();

};

};

};

return0;

}

voiddelay()

{

longintj;

for(j=0;j<0x1f0;j++);

}

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 党团工作 > 入党转正申请

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1