报告一文档格式.docx
《报告一文档格式.docx》由会员分享,可在线阅读,更多相关《报告一文档格式.docx(37页珍藏版)》请在冰点文库上搜索。
WDTCTL=WDTPW+WDTHOLD;
//关闭看门狗
P2SEL=0;
P2SEL2=0;
P2DIR=0xff;
//设置端口1为输出
P2OUT=0;
while
(1)
{
P2OUT=~P2OUT;
//将端口1的值取反后输出
delay();
//调用函数延时
};
}
voiddelay()//延时函数
{unsignedintj;
for(j=0;
j<
0xffff;
j++);
---------------------------------------------------------------------------------------------------------------------------------
思考:
修改程序BUG时要认真阅读,必要时借助断点、register等工具帮助发现程序错误进行修改;
若想要进一步控制延时函数,则可运用多个循环来延时,如for(i=0;
i<
X;
i++)for(j=0;
0xff;
(其中X为控制量)。
2.控制发光二极管的显示变化
实现方法:
将P2.0~P2.7分别与LED1~LED8连接起来,置P2为输出。
用两个状态数组控制LED灯变化,具体代码如下:
voiddelay(void);
intmain(void)
{
//Stopwatchdogtimertopreventtimeoutreset
unsignedcharLEDdata1[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
//LED灯变化一
unsignedcharLEDdata2[4]={0x7e,0xbd,0xdb,0xe7};
//LED灯变化二
unsignedinti;
//置P2为输出
P2DIR=0xFF;
while
(1)//循环控制LED灯闪烁
for(i=0;
12;
i++)
if(i<
8)
P2OUT=LEDdata1[i];
else
P2OUT=LEDdata2[i-8];
}
voiddelay()//延时函数
unsignedintj;
for(j=0;
用数组来控制LED灯变化比较方便,容易实现;
LED灯为共阳连接,与课本例题正好相反;
若选择用单片机P1端口控制LED灯,则需将P1.0~P1.7与LED0~LED8相连,并设置P1各端口为输出。
3.用按键控制发光二极管的显示变化
将P2.0~P2.7分别与LED1~LED8连接起来,置P2为输出,将P1.0、P1.1与K1、K2相连,并置其为输入。
用一个变量来判断按键,从而控制不同的循环来使LED灯发生不同的变化,具体代码如下:
//LED灯变化二
unsignedinti,key=0;
//置P2为输出
P2OUT=0xff;
P1SEL&
=~(BIT0+BIT1);
//置P1为输入
P1SEL2&
P1DIR&
P1OUT=0XFF;
P1REN=0XFF;
if((P1IN&
BIT0)==0)//判断K1是否被按下
key=1;
elseif((P1IN&
BIT1)==0)//判断K2是否被按下
key=2;
if(key==1)
8;
elseif(key==2)
4;
P2OUT=LEDdata2[i];
}
voiddelay()//延时函数
在使用K1与K2来控制LED灯显示方式时会有一定的延迟,因此最好长按按键至变化。
出现这种情况的原因是在循环显示LED的时候程序没有执行到判断按键信息的地方,只有当执行到判断语句是才能接收按键信息。
改进方法可以是减小延时函数执行时间来减少按键等待时间。
(不是很完美)
三.已完成的选做任务
4.用蜂鸣器、发光二极管显示按键信息
K1到K8的值总共为1~8,因此可用三位的二进制数来表示,同时用蜂鸣器来表示按键已按下。
将P1.0~P1.8与K1~K8相连并置为输入,将P2.0~P2.2与LED1~LED3连接并置为输出,将P2.7与蜂鸣器BUZZ位相连并置为输出。
用LED1~LED3来表示二进制数,用短暂延时来使蜂鸣器只响一下。
具体代码如下:
constcharLEDdata1[8]={0x7f,0x7e,0x7d,0x7c,0x7b,0x7a,0x79,0x78};
//蜂鸣器不响时的8个数
constcharLEDdata2[8]={0xff,0xfe,0xed,0xfc,0xfb,0xfa,0xf9,0xf8};
//蜂鸣器响时的8个数
P1SEL=0;
//置P1为输入
P1SEL2=0;
P1DIR=0;
//P1端口的输入需要上拉电阻辅助,因此将P1OUT拉高同时启用上拉电阻。
P2DIR=0XFF;
while
(1)//判断按键信息并使LED显示相应数字,同时用延时函数来使蜂鸣器只响一下。
BIT0)==0)
P2OUT=LEDdata1[0];
i++);
P2OUT=LEDdata2[0];
BIT1)==0)
P2OUT=LEDdata1[1];
P2OUT=LEDdata2[1];
BIT2)==0)
P2OUT=LEDdata1[2];
P2OUT=LEDdata2[2];
BIT3)==0)
P2OUT=LEDdata1[3];
P2OUT=LEDdata2[3];
BIT4)==0)
P2OUT=LEDdata1[4];
P2OUT=LEDdata2[4];
BIT5)==0)
P2OUT=LEDdata1[5];
P2OUT=LEDdata2[5];
BIT6)==0)
P2OUT=LEDdata1[6];
P2OUT=LEDdata2[6];
BIT7)==0)
P2OUT=LEDdata1[7];
P2OUT=LEDdata2[7];
在每一个判断按键信息并显示的流程中延时函数前的语句决定了按下按键时系统的反应,而延时函数后的语句则决定了系统输出的末态,上述程序就是用这种方式来使蜂鸣器只响一下。
(注意:
如果延时函数过短,则系统初态不能表现出来,此时蜂鸣器不会响)
实验3.单片机C语言程序设计
1.巩固编写和调试单片机C语言程序方法;
2.了解简单接口电路的控制方法
1.并行方式控制数码管的显示
(1).将P2.0~P2.与Sa~Sh连接起来,P1.0~P1.3与S1到S4连接起来,P1.7与BUZZ连接起来。
由于数码管是并行控制,所以在同一个时刻实际上只能有一个数码管显示,否则就不能显示不同的数字,因此要利用视觉暂留的原理让四位数码管快速变化,从而显示出不同的数字。
具体方法是由P2.0~P2.7控制数码管显示的内容,由P1.0~P1.3来控制显示哪一位数码管,由P1.7来控制蜂鸣器,以实现所要求的功能。
(2).实现方法:
运用数组来实现显示不同数字,用S1~S4来切换显示的数码管。
源代码:
unsignedintk;
unsignedcharLED[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xC6,0xa1,0x86,0x8e};
//LED灯
//置P2为输出
//置P1为输出
P1DIR=0xff;
P1OUT=0xff;
for(k=0;
k<
16;
k++)//循环显示16个数
P2OUT=LED[k];
//控制第一个数码管显示的数字
P1OUT=0x01;
//控制第二个数码管显示的数字
P1OUT=0x02;
//控制第三个数码管显示的数字
P1OUT=0x04;
//控制第四个数码管显示的数字
P1OUT=0x08;
voiddelay()//延时函数
0x5fff;
思考:
可通过修改delay()函数中的延时时间来控制数字变化的快慢。
(3).实现方法:
减少切换显示的时间,以利用视觉暂留来实现显示分秒,利用一个计时因子来实现计时。
//延时函数
unsignedinta=0,b=0,c=0,d=0,at=0,bt=0,ct=0,dt=0;
//定义变量,其中abcd分别为数码管1234的显示数字,atbtctdt分别为abcd的计时因子
unsignedcharLED[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
if(at==0x2f)//计算第一位数码管显示数字
bt++;
a++;
at=0;
if(bt==10)//计算第二位数码管显示数字
ct++;
b++;
a=0;
bt=0;
if(ct==6)//计算第三位数码管显示数字
dt++;
c++;
b=0;
ct=0;
if(c==5)//计时到5分钟时发出警报并重新计时
c=0;
P1OUT=0;
continue;
P2OUT=LED[a];
P2OUT=LED[b];
P2OUT=LED[c];
P2OUT=LED[d];
at++;
voiddelay()//延时函数
0x5ff;
根据程序的不同需求,可调节程序中控制时间因子变化的阈值来改变时间变化的快慢。
(选做)(4).实现方法:
将P1.4~P1.6与K1~K3连接起来,并用其接收信号,以实现按键控制功能。
unsignedinta=0,b=0,c=0,d=0,at=0,bt=0,ct=0,dt=0,key=0;
P2OUT=0xc0;
//置P1.0~1.3和P1.7为输出,P1.4~1.6为输入
P1DIR=0x8f;
P1REN=0x70;
BIT4)==0)//检测K1是否被按下
BIT5)==0)//检测K2是否被按下
BIT6)==0)//检测K3是否被按下
key=3;
if(key==0)//若无按键按下,则停止工作
for(;
;
)
BIT4)==0)//若K1按下,则开始计时
break;
if(key==2)//若K2按下,则暂停计时
at--;
if(key==3)//若K3按下,计时器清零并停止计时
at=0,bt=0,ct=0,dt=0,a=0,b=0,c=0,d=0;
if(at==0x1f)//计算第一位数码管显示数字
P1OUT=0xf1;
P1OUT=0xf2;
P1OUT=0xf4;
P1OUT=0xf8;
每位数码管显示时间不能过长,也不能过短。
过长的话切换显示数码管的时间过长,不能利用视觉暂留效果,因此不能同时看到不同的数字。
果断的话每位数码管显示时间不足,数码管亮度降低影响阅读。