实验23报告Word格式文档下载.docx
《实验23报告Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《实验23报告Word格式文档下载.docx(22页珍藏版)》请在冰点文库上搜索。
![实验23报告Word格式文档下载.docx](https://file1.bingdoc.com/fileroot1/2023-5/2/7fb89b7c-455f-40eb-95f0-22ecfabe471c/7fb89b7c-455f-40eb-95f0-22ecfabe471c1.gif)
一、实验目的
在上个实验的基础下加深对单片机的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
voiddelay();
voidBeep();
constcharLEDdata[12]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xdb,0xe7,0x7e,0xbd};
intmain(void)
//关闭看门狗
inti,Key;
P2OUT=0xff;
P1REN=0x7f;
P1OUT=0xff;
P1SEL=0;
P1SEL2=0;
P1DIR=0x80;
if((P1IN&
0x01)==0)//判断K1是否按下
Key=1;
Beep();
elseif((P1IN&
0x08)==0)//判断K4是否按下
Key=2;
if(Key==1)//i从0到7为规律一
if(i>
6)
i=-1;
i=i+1;
elseif(Key==2)//i从8到11为规律二
10||i<
8)
i=7;
P2OUT=LEDdata[i];
//显示
delay();
voiddelay()
inti;
i++);
voidBeep()//按下按键时响
intj;
P1OUT&
=~BIT7;
P1OUT|=BIT7;
步进电机1
constcharBIT[4]={1,2,4,8};
P1DIR=0xf0;
for(sum=0;
sum<
2200;
sum++)//正转
3)
i=0;
P2OUT=BIT[i];
0x18f;
sum++)//反转
i=i-1;
if(i<
0)
i=3;
步进电机2
inti,Key,j,sum=0;
0x01)==0)//判断K1是否按下
0x02)==0)//判断K2是否按下
0x04)==0)//判断K3是否按下
Key=3;
}
if(Key==1)//正转
if(i==4)
elseif(Key==2)//反转
if(i==-1)
elseif(Key==3)//停止
P2OUT=0;
实验3
1.3
constintA[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
constintB[4]={0x21,0xc0,0xc0,0x90};
intt=1;
//t为1,2,4,8即BIT0,1,2,3
P1DIR|=(BIT0+BIT1+BIT2+BIT3);
t=1;
4&
&
t<
10;
j++)
P1OUT=~(BIT0+BIT1+BIT2+BIT3);
P1OUT|=t;
t=2*t;
16;
i++)
P2OUT=A[i];
1.4
#include"
constintA[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
intT=0,i=0,t0,t1,t2,t,j;
voidBeep()
intmain(void)
P1DIR|=(BIT0+BIT1+BIT2+BIT3+BIT7);
P1OUT=0x80;
T++;
//计算四位分别显示什么
t0=T%10;
t1=(T%60)/10;
t2=T/60;
if(t2==3)
T=0;
0xaf;
P2OUT=A[t0];
P1OUT|=BIT0;
for(j=1;
100;
=~BIT0;
P2OUT=A[t1];
P1OUT|=BIT1;
=~BIT1;
t=A[t2];
t&
P2OUT=t;
P1OUT|=BIT2;
=~BIT2;
P2OUT=0xc0;
P1OUT|=BIT3;
=~BIT3;
1.5
intT=0,i=0,t0,t1,t2,t,Key;
voidShow();
P1DIR|=(BIT0+BIT1+BIT2+BIT3+BIT4);
P1DIR&
=~(BIT5+BIT6+BIT7);
P1REN|=(BIT5+BIT6+BIT7);
P1OUT=0xe0;
BIT5)==0)
BIT6)==0)
BIT7)==0)
if(Key==1)//按下K6归零
elseif(Key==3)//按下K8则T+1s
Show();
voidShow()
0x2fff;
任务二
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;
intm;
for(m=0;
m<
m++);
voidlistdata();
inti,k=1;
P1DIR=0xff;
P1OUT=0;
P1OUT|=k;
data=LEDtab[i];
listdata();
=~k;
k=2*k;
if(k==16)
k=1;
voidlistdata()
8;
if((data&
=~BIT4;
else
P1OUT|=BIT4;
data=data*2;
P1OUT|=BIT5;
=~BIT5;
P1OUT|=BIT6;
=~BIT6;
任务三
constcharLEDtab[4]={0x21,0xa3,0xa3,0x90};
constcharBIT[8]={1,2,4,8,0x10,0x20,0x40,0x80};
inti,k,t;
4;
i++)//四个数码管分别亮
for(k=0;
k<
k++)//输出字母
BIT[7-k])==0)
P2OUT&
P2OUT|=BIT2;
P2OUT|=BIT0;
data=BIT[i];
k++)//输出亮的数码管
P2OUT|=BIT1;