计硬实验二三.docx
- 文档编号:20113557
- 上传时间:2023-04-25
- 格式:DOCX
- 页数:44
- 大小:3.79MB
计硬实验二三.docx
《计硬实验二三.docx》由会员分享,可在线阅读,更多相关《计硬实验二三.docx(44页珍藏版)》请在冰豆网上搜索。
计硬实验二三
计算机硬件基础
周浩2015011685
班号:
33机器号:
22
实验二单片机C语言程序结构
一.实验目的
1.掌握单片机C语言程序结构
2.掌握单片机C语言程序调试方法
3.掌握MSP430FG2553基本I/O控制方法
二、实验基本任务
1.练习调试程序
用跳线将实验板上的8个发光二极管与单片机连接。
编写的程序L2_debug.C如下,功能是控制与单片机相连接的8个发光二极管在全亮与全灭这两种状态下循环变换。
该程序没有语法上的错误,但运行后不能实现上述现象,请上机调试其中的问题,指出程序的问题,并修改程序。
说明:
建立一个C语言项目Lab_2,将L2_debug.c拷贝到项目文件夹下,并如图2-1用option/add将其加入到项目中,用option/remove将项目自带的main.c移除,然后灵活应用Go(F5)、Stepover(F10)、Stepinto(F11)命令,或设置断点的方法,控制程序的运行,通过查看实验的现象,以及检查程序中用到的端口寄存器、变量等的变化,查找程序中的问题。
#include"io430.h"
voiddelay();
intmain(void)
{
WDTCTL=WDTPW+WDTHOLD;//关闭看门狗
P2SEL=0;//设置P2端口为输出端
P2SEL2=0;
P2DIR=0xff;//设置端口2为输出
P2OUT=~P2OUT;//将端口2的值取反后输出
delay();//调用函数延时
}
voiddelay()//延时函数
{unsignedcharj;
for(j=0;j<5;j++);
}
修改后的实验的程序如下:
实验电路图如下:
思考:
在修改后的L2——debug.C基础上,比较程序用stepOver和stepinto单步执行函数delay()有何不同。
Stepinto会在调用delay函数的时候单步执行delay中的函数;而stepover在调用函数delay时,会一次性执行完delay函数。
任务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();
voidrule_1();
voidrule_2();
constunsignedcharLED[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
intmain(void)
{
//Stopwatchdogtimertopreventtimeoutreset
WDTCTL=WDTPW+WDTHOLD;
//初始化
P2SEL=0;
P2SEL2=0;
P2DIR=0xff;
P2OUT=0;
while
(1)
{
P2OUT=0;
//按照不同规律变亮
rule_1();
delay();
rule_2();
}
return0;
}
voidrule_1()
{
inti;
for(i=0;i<8;i++)
{
P2OUT=LED[i];
delay();
}
}
voidrule_2()
{
inti,temp;
for(i=2;i<8;i++)
{
if(i==3)i=0;
temp=LED[i];
temp&=LED[7-i];
P2OUT=temp;
delay();
}
}
voiddelay()
{
inti=0;
for(;i<0xffff;i++);
}
思考:
如果选用单片机的P1端口控制8个发光二极管,如何在实验板上设计连线、并编程实现任务2呢?
答:
电路图如下:
代码只要把源代码中的P2全部改为P1即可
任务3.用按键控制发光二极管的显示变化
在任务2基础上,增加2个按键与单片机的引脚相连,编程实现由按键控制发光二级管的显示变化:
当按下实验板上的K1键时,8个发光二极管按任务2中的规律1变化;当按下实验板上的K2键时,8个发光二极管按任务2中的规律2变化。
电路图如下
程序清单如下所示。
#include"io430.h"
voiddelay();
voidbuzz();
constunsignedcharLED[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
inttime=0,i=0,temp;
intmain(void)
{
//Stopwatchdogtimertopreventtimeoutreset
WDTCTL=WDTPW+WDTHOLD;
P2SEL=0;
P2SEL2=0;
//设置P2端口为输出
P2DIR=0xff;
P2OUT=0;
P1SEL=0;
P1SEL2=0;
//设置P1.0~3端口为输入
P1DIR=0xf0;
//设置上拉电阻
P1REN=0x7f;
P1OUT=0x7f;
while
(1)
{
P2OUT=0xff;
//判断K1键是否按下
if((P1IN&0X01)==0)
{
//铃响
buzz();
for(i=0;i<8;i++)
{
//顺序点亮
P2OUT=LED[i];
delay();
}
}
//判断K4键是否按下
elseif((P1IN&0X08)==0)
{
buzz();
for(i=1;i<8;i++)
{
time=0;
if(i==4)
{
i=0;
time++;
}
temp=LED[i];
temp&=LED[7-i];
P2OUT=temp;
delay();
if(time>=1)break;
}
}
}
return0;
}
//铃响函数
voidbuzz()
{
P1OUT&=~BIT7;
delay();
P1OUT|=BIT7;
}
//延时
voiddelay()
{
inti=0;
for(;i<0xffff;i++);
}
(提高任务四)用按键控制步进电机转动
1)设计单片机MSP430G2553控制步进电机的电路连线,编程控制电机正转、反转各一圈,并测试用四拍法控制电机转一圈需要多少步?
电路图如下:
代码如下:
#include"io430.h"
unsignedintorder[]={0x01,0x02,0x04,0x08};
unsignedintdisorder[]={0x08,0x04,0x02,0x01};
voiddelay_s();
inti;
intmain()
{
//Stopwatchdogtimertopreventtimeoutreset
WDTCTL=WDTPW+WDTHOLD;
P2SEL=0;
P2SEL2=0;
P2DIR=0xff;
P2OUT=0;
inttime;
while
(1)
{
//正转一圈
for(time=0;time<1024;time++)
{
for(i=0;i<4;i++)
{
P2OUT=order[i];
delay_s();
}
}
//反转一圈
for(time=0;time<1024;time++)
{
for(i=0;i<4;i++)
{
P2OUT=disorder[i];
delay_s();
}
}
}
return0;
}
//延时函数
voiddelay_s()
{
unsignedintj;
for(j=0;j<0xf0f;j++);
}
2)在1)的基础上增加按键控制;按下K1键电机顺时针转动;按下K2键电机逆时针转动(反转);按下K3键电机停转。
每按下一次键,蜂鸣器响一下,用声音提醒接收到按键信息。
电路图如下
代码如下
#include"io430.h"
unsignedintorder[]={0x01,0x02,0x04,0x08};
unsignedintdisorder[]={0x08,0x04,0x02,0x01};
voiddelay_s();
inti,key;
intmain()
{
//Stopwatchdogtimertopreventtimeoutreset
WDTCTL=WDTPW+WDTHOLD;
P2SEL=0;
P2SEL2=0;
P2DIR=0xff;
P2OUT=0;
P1SEL=0;
P1SEL2=0;
//选择P1.0~2为输入功能
P1DIR=0xf8;
P1REN|=(BIT0+BIT2+BIT1);
P1OUT|=(BIT0+BIT2+BIT1);
inttime;
while
(1)
{
key=0;
if((P1IN&BIT0)==0){key=1;}
elseif((P1IN&BIT1)==0){key=2;}
elseif((P1IN&BIT2)==0){key=3;}
if(key==1)
{
//铃响
P1OUT=~BIT7;
delay_s();
P1OUT&=BIT7;
//电机正转
for(time=0;time<1024;time++)
{
for(i=0;i<4;i++)
{
P2OUT=order[i];
delay_s();
}
}
}
elseif(key==2)
{
//铃响
P1OUT=~BIT7;
delay_s();
P1OUT&=BIT7;
//电机反转
for(time=0;time<1024;time++)
{
for(i=0;i<4;i++)
{
P2OUT=disorder[i];
delay_s();
}
}
}
//K3按下,则停止转动
elseif(key==3)
{
//铃响
P1OUT=~BIT7;
delay_s();
P1OUT&=BIT7;
break;
}
}
return0;
}
//延时
voiddelay_s()
{
unsignedintj;
for(j=0;j<0xf0f;j++);
}
实验三
任务一
编程依次从右到左每个数码管把0~9,A~F各自显示一遍,最后显示“good”。
电路图如下:
代码如下:
#include"io430.h"
constcharnumber[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
constcharletter[]={0x88,0x83,0xC6,0xa1,0x86,0x8e};
constchartemp[]={0x0e,0x0d,0x0b,0x07};
constchargood[]={0x21,0xa3,0xa3,0x90};
voiddelay();
intmain()
{
//Stopwatchdogtimertopreventtimeoutreset
WDTCTL=WDTPW+WDTHOLD;
//初始化
P1SEL=0;
P1SEL2=0;
P1DIR=0XFF;
P1OUT=0xff;
P2SEL=0;
P2SEL2=0;
P2DIR=0XFF;
P2OUT=0xFF;
inti,j,time=0;
for(i=0,j=0;i<=9;i++,j++)
{
//控制数码管亮灭
if(j>3)
{
j=0;
}
//显示数字
P1OUT=~temp[j];
P2OUT=number[i];
delay();
}
for(i=0;i<6;i++,j++)
{
if(j>3)
{
j=0;
}
P1OUT=~temp[j];
P2OUT=letter[i];
delay();
};
//显示good.
//视觉暂留
for(time=0;time<=30;time++)
{
for(j=3;j>=0;j--)
{
P1OUT=~temp[j];
P2OUT=good[j];
for(i=0;i<=0xff;i++);
}
time++;
}
P2OUT=0XFF;//清空
return0;
}
voiddelay()
{
inti=0;
for(;i<0xffff;i++);
}
2.设计一个电子跑表,实时显示时间,高两位数码管显示分钟值,低两位数码管显示秒值。
电路图如下:
代码如下:
#include"io430.h"
constcharnumber[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//0,1,3
constcharletter[]={0x88,0x83,0xC6,0xa1,0x86,0x8e};//a~f
constchartemp[]={0x0e,0x0d,0x0b,0x07};//数码管1~4;
constchargood[]={0x21,0xa3,0xa3,0x90};
voiddelay();
intmain()
{
//Stopwatchdogtimertopreventtimeoutreset
WDTCTL=WDTPW+WDTHOLD;
//初始化
P1SEL=0;
P1SEL2=0;
P1DIR=0XFF;
P1OUT=0;
P2SEL=0;
P2SEL2=0;
P2DIR=0XFF;
P2OUT=0xc0;
while
(1)
{
inti=0;
intj=0;
intk=0;
intm=0;
for(i=0;i<1;i++)
{
//控制分钟数
for(j=0;j<3;j++)
{
//控制秒数
for(k=0;k<6;k++)
{
for(m=0;m<9;m++)
{
P2OUT=number[m];
for(intn=0;n<30;n++)
{
P1OUT=~temp[0];
P2OUT=number[m];
delay();
P1OUT=~temp[1];
P2OUT=number[k];
delay();
P1OUT=~temp[2];
P2OUT=number[j];
delay();
P1OUT=~temp[3];
P2OUT=number[i];
delay();
}
}
}
}
//铃响
P1OUT=0x00;
delay();
P1OUT&=BIT7;
}
}
return0;
}
voiddelay()
{
intj=0;
for(;j<0xff;j++);
}
思考:
每个数码管显示的延时不能太长,也不能太短。
为什么?
答:
延时太长,不能看到几个数字同时显示且秒值也会变很慢;延时太短,则秒值变化很快,会看见几个数码管同时在变化。
(提高)增加按键控制功能:
按下K8键开始计时;按下K7键暂停计时,计时保持不变,此后若按下K8键将继续及时;按下K6键将计时归零,并停止计时,若此后按下K8键,将从零计时。
电路图如下
代码如下:
#include"io430.h"
constcharnumber[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//0,1,3
constcharletter[]={0x88,0x83,0xC6,0xa1,0x86,0x8e};//a~f
constchartemp[]={0x0e,0x0d,0x0b,0x07};//数码管1~4;
constchargood[]={0x21,0xa3,0xa3,0x90};
voiddelay();
intmain()
{
//Stopwatchdogtimertopreventtimeoutreset
WDTCTL=WDTPW+WDTHOLD;
//初始化
P1SEL=0;
P1SEL2=0;
P1DIR=(BIT0+BIT1+BIT2+BIT3+BIT4);
P1DIR&=~(BIT7+BIT6+BIT5);
P1OUT=0;
//设置上拉电阻
P1REN=(BIT7+BIT6+BIT5);
P1OUT=(BIT7+BIT6+BIT5);
P2SEL=0;
P2SEL2=0;
P2DIR=0XFF;
P2OUT=0xc0;
intkey;
while
(1)
{
if((P1IN&BIT7)==0)
{
inti=0;
intj=0;
intk=0;
intm=0;
for(i=0;i<1;i++)
{
//控制分钟数
for(j=0;j<3;j++)
{
//控制秒数
for(k=0;k<6;k++)
{
for(m=0;m<9;m++)
{
P2OUT=number[m];
for(intn=0;n<30;n++)
{
//判断是否K7键是否按下
if((P1IN&BIT6)==0)
{
//保存显示值
while
(1)
{
P1OUT=~temp[0];
P2OUT=number[m];
delay();
P1OUT=~temp[1];
P2OUT=number[k];
delay();
P1OUT=~temp[2];
P2OUT=number[j];
delay();
P1OUT=~temp[3];
P2OUT=number[i];
delay();
//按下K8,继续计时
if((P1IN&BIT7)==0)break;
}
}
elseif((P1IN&BIT5)==0)
{
while
(1)
{
//清零
m=0;k=0;j=0;i=0;
P1OUT=~temp[0];
P2OUT=number[m];
delay();
P1OUT=~temp[1];
P2OUT=number[k];
delay();
P1OUT=~temp[2];
P2OUT=number[j];
delay();
P1OUT=~temp[3];
P2OUT=number[i];
delay();
//继续计时
if((P1IN&BIT7)==0)break;
}
}
else
{
P1OUT=~temp[0];
P2OUT=number[m];
delay();
P1OUT=~temp[1];
P2OUT=number[k];
delay();
P1OUT=~temp[2];
P2OUT=number[j];
delay();
P1OUT=~temp[3];
P2OUT=number[i];
delay();
}
}
}
}
}
P1OUT=0x00;
delay();
}
}
else
{
delay();
}
}
return0;
}
voiddelay()
{
intj=0;
for(;j<0xff;j++);
}
任务2:
串行方式控制数码管显示
电路图:
代码如下:
#include"io430.h"
constcharnumber[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xC6,0xa1,0x86,0x8e};
constchartemp[]={0x01,0x02,0x04,0x08};
constchargood[]={0x21,0xa3,0xa3,0x90};
voiddelay();
voidpalse_1();
voidpalse_2();
intmain()
{
//Stopwatchdogtimertopreventtimeoutreset
WDTCTL=WDTPW+WDTHOLD;
//初始化
P1SEL=0;
P1SEL2=0;
P1DIR=0XFF;
P1OUT=0;
inti,j,time=0,middle,n;
for(i=0,j=0;i<=15;i++,j++)
{
if(j==4)j=0;
middle=number[i];
for(time=0;time<8;time++)
{
//取第七位数据,如果是0则p1.4为0;
if((middle&BIT7)==0)
{
P1OUT&=~(BIT4);
}
else
{
P1OUT|=(BIT4);
}
palse_1();
middle=middle<<1;
}
palse_2();
delay();
P1OUT=temp[j];
}
//显示good
for(n=0;n<=30;n++)
{
for(j=3,i=3;j>=0;j--,i--)
{
middle=good[i];
f
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验