实验23报告.docx
《实验23报告.docx》由会员分享,可在线阅读,更多相关《实验23报告.docx(22页珍藏版)》请在冰豆网上搜索。
![实验23报告.docx](https://file1.bdocx.com/fileroot1/2023-4/18/eee07d34-a118-4d97-8dea-fcd15c438fcc/eee07d34-a118-4d97-8dea-fcd15c438fcc1.gif)
实验23报告
姓名杨帆学号2015011735
实验班号3-3机器号26
实验2单片机C语言程序结构
一、实验目的
掌握单片机C语言程序结构和程序的调试方法以及单片机的基本I/O控制方法。
二、实验基本任务
1.练习调试程序
Stepover(F10)在运行到函数处时不会跟踪到函数内部,而StepInto(F11)则会跟踪到函数内部.
遇到的问题:
建立的项目的根目录文件夹名称中含有中文,导致断点和StepInto未能准确执行。
2.控制发光二极管的显示变化
可将规律1→规律2视作一个完整的过程,因此定义一个12个元素的数组,前八位满足规律1,后四位满足规律2,程序运行过程中只需将12个元素一个个轮过去。
思考:
用P1端口控制只需将P1的八个输出端口通过线连接至二极管的端口,设置P1为输出端,其余过程与上思路一致。
3.用按键控制发光二极管的显示变化
在任务2的基础上,只需设置与K1K4连接的两个端口为输入,定义一个变量Key保存按下的按键,按下K1后,使LED的变化在规律一中变化,按下K4后,使LED的变化在规律二中变化。
再定义一个Beep函数,每当按键时,将与Buzz连接的P1.7设置为0,再延时一下,再赋为1即可控制蜂鸣器响。
4.(提高)用按键控制步进电机转动
由步进电机工作原理可知,只需使接入步进电机电机的四个端口轮流为1再加入一个延时即可控制步进电机的转动。
(1).定义一个变量sum,每执行一次运转就加一,在转完一圈时使用watch观察sum的值,初步测得约为2200.
(2).在任务3和任务4
(1)的基础上稍加修改即可,思路相同
实验3单片机C语言程序设计
一、实验目的
在上个实验的基础下加深对单片机的C语言调试和对I/O端口的控制。
二、实验任务
1.并行方式控制数码管的显示
(1).在利用Vcc和GND调试后,发现s1、s2、s3和s4连接Vcc,sa等端口连接GND时数码管会工作。
(2)其中P2.0~P2.7控制Sa~Sh,P1.0~P1.3控制选择亮的数码管
(3).定义0~9,A~F数组,分别使四个数码管处于工作状态再将P2OUT赋值为之前定义的数组。
显示good只需对每个数码管分别让其按good的形状亮即可。
遇到的问题:
在显示good时,前一个字母会暂现在下一个数码管上,调试后发现是尚未关闭之前的数码管即对P2OUT赋值了。
(4).思路类似于任务(3)的good显示,只需定义一个时间变量T,因为T是小于180s的,所以四位分别为0,T/60,(T%60)/10,T%10.分别显示即可。
思考:
延时太短则数码管导通时间变短,显示变暗,延时太长则人眼能分辨出其闪烁。
(5)设置按键只需在试验2的步进电机的基础上改进(4)即可
2.串行方式控制数码管的显示
其输出为Q0~Q7,所以将Q0~Q7与Sa~Sh连接起来控制数码管,将P1.0~P1.6与其旁边的接口连接起来,其中P1.0~P1.3控制的是哪个数码管亮,而P1.4控制的输入,P1.5控制的是使DS引脚上的数据进入移位寄存器中的脉冲信号,P1.6控制的是使寄存器中的八位数据通过三态门进入到Q0~Q7的脉冲信号。
思考:
(1)用DS、SHCP、STCP和P2.0、P2.1、P2.2连接起来,只需将上述代码中对P1.4、P1.5、P1.6的赋值改为对P2.0、P2.1、P2.2即可
(2)看门狗可以防止程序跑飞,如果设置了要定时喂狗,不然系统会复位至main函数入口。
所以在运行时会自动复位,只有一个数码管会显示0。
3.(提高)利用改进的串行方式数码管模块进行显示
其中SCLK,RCLK,DIO分别相当于任务2中的SHCP,STCP,DS。
唯一不同的是,这里控制哪个数码管亮的数据也有DIO一并输入,所以其格式为前八位为控制数码管中每个二极管的亮灭,后八位为选择哪个数码管亮,其余思路与任务2一致。
实验代码(点开旁边小三角即可查看)
实验2
任务2
#include"io430.h"
constintLED[12]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xdb,0xe7,0x7e,0xbd};
intmain(void)
{
inti,j;
WDTCTL=WDTPW+WDTHOLD;
P2SEL=0;
P2SEL2=0;
P2DIR=0xff;
while
(1)
{
for(i=0;i<12;i++)//前八位为规律一,后八位为规律二
{
P2OUT=LED[i];
for(j=0;j<0xffff;j++);
}
}
return0;
}
任务3
#include"io430.h"
voiddelay();
voidBeep();
constcharLEDdata[12]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xdb,0xe7,0x7e,0xbd};
intmain(void)
{
WDTCTL=WDTPW+WDTHOLD;//关闭看门狗
inti,Key;
P2SEL=0;
P2SEL2=0;
P2DIR=0xff;
P2OUT=0xff;
P1REN=0x7f;
P1OUT=0xff;
P1SEL=0;
P1SEL2=0;
P1DIR=0x80;
while
(1)
{
if((P1IN&0x01)==0)//判断K1是否按下
{
Key=1;
Beep();
}
elseif((P1IN&0x08)==0)//判断K4是否按下
{
Key=2;
Beep();
}
if(Key==1)//i从0到7为规律一
{
if(i>6)
i=-1;
i=i+1;
}
elseif(Key==2)//i从8到11为规律二
{
if(i>10||i<8)
i=7;
i=i+1;
}
P2OUT=LEDdata[i];//显示
delay();
}
}
voiddelay()
{
inti;
for(i=0;i<0xffff;i++);
}
voidBeep()//按下按键时响
{
intj;
P1OUT&=~BIT7;
for(j=0;j<0xffff;j++);
P1OUT|=BIT7;
}
步进电机1
#include"io430.h"
constcharBIT[4]={1,2,4,8};
intmain(void)
{
WDTCTL=WDTPW+WDTHOLD;//关闭看门狗
inti,j;
P2SEL=0;
P2SEL2=0;
P2DIR=0xff;
P2OUT=0xff;
P1REN=0x7f;
P1OUT=0xff;
P1DIR=0xf0;
while
(1)
{
for(sum=0;sum<2200;sum++)//正转
{
i=i+1;
if(i>3)
i=0;
P2OUT=BIT[i];
for(j=0;j<0x18f;j++);
}
for(sum=0;sum<2200;sum++)//反转
{
i=i-1;
if(i<0)
i=3;
P2OUT=BIT[i];
for(j=0;j<0x18f;j++);
}
}
}
步进电机2
#include"io430.h"
voiddelay();
constcharBIT[4]={1,2,4,8};
intmain(void)
{
WDTCTL=WDTPW+WDTHOLD;//关闭看门狗
inti,Key,j,sum=0;
P2SEL=0;
P2SEL2=0;
P2DIR=0xff;
P2OUT=0xff;
P1REN=0x7f;
P1OUT=0xff;
P1SEL=0;
P1SEL2=0;
P1DIR=0xf0;
while
(1)
{
if((P1IN&0x01)==0)//判断K1是否按下
{
Key=1;
Beep();
}
elseif((P1IN&0x02)==0)//判断K2是否按下
{
Key=2;
Beep();
}
elseif((P1IN&0x04)==0)//判断K3是否按下
{
Key=3;
Beep();
}
if(Key==1)//正转
{
i=i+1;
if(i==4)
i=0;
P2OUT=BIT[i];
for(j=0;j<0x18f;j++);
}
elseif(Key==2)//反转
{
i=i-1;
if(i==-1)
i=3;
P2OUT=BIT[i];
for(j=0;j<0x18f;j++);
}
elseif(Key==3)//停止
P2OUT=0;
}
}
voidBeep()//按下按键时响
{
intj;
P1OUT&=~BIT7;
for(j=0;j<0xffff;j++);
P1OUT|=BIT7;
}
实验3
1.3
#include"io430.h"
constintA[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
constintB[4]={0x21,0xc0,0xc0,0x90};
voiddelay()
{
intj;
for(j=0;j<0xffff;j++);
}
intt=1;//t为1,2,4,8即BIT0,1,2,3
intmain(void)
{
WDTCTL=WDTPW+WDTHOLD;
inti,j;
P1SEL=0;
P1SEL2=0;
P1DIR|=(BIT0+BIT1+BIT2+BIT3);
P2SEL=0;
P2SEL2=0;
P2DIR=0xff;
P2OUT=0xff;
while
(1)
{
t=1;
for(j=0;j<4&&t<10;j++)
{
P1OUT=~(BIT0+BIT1+BIT2+BIT3);
P1OUT|=t;
t=2*t;
for(i=0;i<16;i++)
{
P2OUT=A[i];
delay();
}
}
}
return0;
}
1.4
#include"io430.h"
constintA[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
intT=0,i=0,t0,t1,t2,t,j;
voidBeep()
{
inti;
P1OUT&=~BIT7;
for(i=0;i<0xffff;i++);
P1OUT|=BIT7;
}
intmain(void)
{
WDTCTL=WDTPW+WDTHOLD;
P1SEL=0;
P1SEL2=0;
P2SEL=0;
P2SEL2=0;
P1DIR|=(BIT0+BIT1+BIT2+BIT3+BIT7);
P2DIR=0xff;
P2OUT=0;
P1OUT=0x80;
while
(1)
{
T++;//计算四位分别显示什么
t0=T%10;
t1=(T%60)/10;
t2=T/60;
if(t2==3)
{
T=0;
Beep();
}
for(i=0;i<0xaf;i++)
{
P2OUT=A[t0];
P1OUT|=BIT0;
for(j=1;j<100;j++);
P1OUT&=~BIT0;
P2OUT=A[t1];
P1OUT|=BIT1;
for(j=1;j<100;j++);
P1OUT&=~BIT1;
t=A[t2];
t&=~BIT7;
P2OUT=t;
P1OUT|=BIT2;
for(j=1;j<100;j++);
P1OUT&=~BIT2;
P2OUT=0xc0;
P1OUT|=BIT3;
for(j=1;j<100;j++);
P1OUT&=~BIT3;
}
}
}
1.5
#include"io430.h"
constintA[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
intT=0,i=0,t0,t1,t2,t,Key;
voidShow();
voidBeep()
{
inti;
P1OUT&=~BIT7;
for(i=0;i<0xffff;i++);
P1OUT|=BIT7;
}
intmain(void)
{
WDTCTL=WDTPW+WDTHOLD;
P1SEL=0;
P1SEL2=0;
P2SEL=0;
P2SEL2=0;
P1DIR|=(BIT0+BIT1+BIT2+BIT3+BIT4);
P1DIR&=~(BIT5+BIT6+BIT7);
P1REN|=(BIT5+BIT6+BIT7);
P2DIR=0xff;
P2OUT=0;
P1OUT=0xe0;
while
(1)
{
t0=T%10;
t1=(T%60)/10;
t2=T/60;
if(t2==3)
{
T=0;
Beep();
}
if((P1IN&BIT5)==0)
Key=1;
elseif((P1IN&BIT6)==0)
Key=2;
elseif((P1IN&BIT7)==0)
Key=3;
if(Key==1)//按下K6归零
T=0;
elseif(Key==3)//按下K8则T+1s
T++;
Show();
}
}
voidShow()
{
inti;
for(i=0;i<0x2fff;i++)
{
P2OUT=A[t0];
P1OUT|=BIT0;
P1OUT&=~BIT0;
P2OUT=A[t1];
P1OUT|=BIT1;
P1OUT&=~BIT1;
t=A[t2];
t&=~BIT7;
P2OUT=t;
P1OUT|=BIT2;
P1OUT&=~BIT2;
P2OUT=0xc0;
P1OUT|=BIT3;
P1OUT&=~BIT3;
}
}
任务二
#include"io430.h"
constcharLEDtab[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,
0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
constintBIT[]={1,2,4,8,0x10,0x20,0x40,0x80};
chardata;
voiddelay()
{
intm;
for(m=0;m<0xffff;m++);
}
voidlistdata();
intmain(void)
{
WDTCTL=WDTPW+WDTHOLD;
inti,k=1;
P1SEL=0;
P1SEL2=0;
P1DIR=0xff;
P1OUT=0;
while
(1)
{
P1OUT|=k;
for(i=0;i<16;i++)
{
data=LEDtab[i];
listdata();
delay();
}
P1OUT&=~k;
k=2*k;
if(k==16)
k=1;
}
}
voidlistdata()
{
inti;
for(i=0;i<8;i++)
{
if((data&BIT7)==0)
P1OUT&=~BIT4;
else
P1OUT|=BIT4;
data=data*2;
P1OUT|=BIT5;
P1OUT&=~BIT5;
}
P1OUT|=BIT6;
P1OUT&=~BIT6;
}
任务三
#include"io430.h"
constcharLEDtab[4]={0x21,0xa3,0xa3,0x90};
constcharBIT[8]={1,2,4,8,0x10,0x20,0x40,0x80};
chardata;
intmain(void)
{
WDTCTL=WDTPW+WDTHOLD;
P2SEL=0;
P2SEL2=0;
P2DIR=0xff;
P2OUT=0;
inti,k,t;
while
(1)
{
for(i=0;i<4;i++)//四个数码管分别亮
{
data=LEDtab[i];
for(k=0;k<8;k++)//输出字母
{
if((data&BIT[7-k])==0)
P2OUT&=~BIT2;
else
P2OUT|=BIT2;
P2OUT|=BIT0;
P2OUT&=~BIT0;
}
data=BIT[i];
for(k=0;k<8;k++)//输出亮的数码管
{
if((data&BIT[7-k])==0)
P2OUT&=~BIT2;
else
P2OUT|=BIT2;
P2OUT|=BIT0;
P2OUT&=~BIT0;
}
P2OUT|=BIT1;
P2OUT&=~BIT1;
}
}
}