电子121 2.docx
- 文档编号:13719124
- 上传时间:2023-06-16
- 格式:DOCX
- 页数:21
- 大小:142.76KB
电子121 2.docx
《电子121 2.docx》由会员分享,可在线阅读,更多相关《电子121 2.docx(21页珍藏版)》请在冰点文库上搜索。
电子1212
实验二中断实验
一、实验目的
1、掌握数码管的静态和动态扫描显示法。
2、掌握单片机系统中断的原理及使用方法。
3、理解键盘去抖动的原理。
二、实验原理
1.发光二极管的工作原理
发光二极管简称为LED(LightEmitingDiode)。
通常所说的LED显示器由7个发光二极管组成,因此也称之为七段LED显示器,其排列形状如图8.15(a)所示。
此外,显示器中还有一个小圆点型发光二极管(在图中以dp表示),用于显示小数点。
通过七段发光二极管亮暗的不同组合,可以显示多种数字、字母以及其它符合。
LED显示器中的发光二极管共有两种连接方法,一种是共阴极连接,另一种共阳极连接。
其连接图如图8.15(b)所示。
图七段LED显示器
使用LED显示器时,要注意区分这两种不同的接法。
为了显示数字或字符,必须对数字或字符进行编码。
七段数码管加上一个小数点,共计8段。
因此为LED显示器提供的编码正好是一个字节。
用LED显示器显示16进制数的编码已列在表7-4所示。
表LED显示器16进制数编码
通常使用的LED显示器都是多位的。
对多位LED显示器,通常采用动态扫描的方法进行显示,即逐个循环点亮各位显示器。
为了实现LED显示器的动态扫描除了要给显示器提供段码(字形编码)的输入之外,还要对显示器加位的控制(控制LED显示器亮灭),这就是通常所说的位控和段控。
2、中断知识
在计算机系统中,中断可以由各种硬件设备产生,以便请求服务或报告故障等。
此外,中断也可由处理器自身产生,例如,程序错误或对操作系统的请求做出响应等。
89C51的中断系统具有5个中断源,即2个外部中断、2个定时器中断和1个串行中断。
中断源
入口地址
0003H
T0
000BH
0013H
T1
001BH
S
0023H
(三)、按键抖动
抖动的原因:
目前大部分按键或键盘都是利用机械触电的合、断作用。
机械触点在闭合
及断开瞬间由于弹性作用的影响,在闭合及断开瞬间均有抖动过程,从而使电压信号也出现
抖动,抖动时间的长短与开关的机械特性有关,一般为5~10ms。
而单片机对键盘扫描一次
仅需几百微妙。
这样,将会对键盘扫描产生误判。
为了保证单片机对按键闭合仅作一次输入
处理,必须去除抖动的影响。
去抖动的方法:
1、外加硬件电路,用RS触发器或单稳态电路构成的去抖动电路,或键盘扩展专用芯片。
2、在检测按键按下时,执行约10ms的延时程序后(避开抖动前沿区域),再确认按键
是否仍然保持闭合状态。
三、实验内容
1、见图一,利用静态扫描显示法,让数码管显示数字6。
(数码管元件7SEG-MPX1-CA,共阴极数码管)
代码:
#include"reg52.h"
#defineucunsignedchar
#defineuiunsignedint
voidmain()
{
P0=0x7d;
while
(1)
{}
}
截图:
2、见图一,利用静态扫描显示法,让数码管显示数字0。
间隔时间1秒后,显示数字1。
间隔时间1秒后,显示数字2。
………间隔时间1秒后,显示数字F。
间隔时间1秒后,显示数字0。
周而复始,循环不息。
代码:
#include"reg52.h"
#defineucunsignedchar
#defineuiunsignedint
uccodetable[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
voiddelay(uix)
{
uiy;
for(x;x>0;x--)
for(y=125;y>0;y--);
}
voidmain()
{
uci=0;
while
(1)
{
P0=table[i];
delay(1000);
i++;
if(i==16)
i=0;
}
}
截图:
图一
3、见图二,利用动态扫描显示法,,让数码管显示数字1234。
代码:
#include"reg52.h"
#defineucunsignedchar
#defineuiunsignedint
uccodetable[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
sbitLS1=P2^0;
sbitLS2=P2^1;
sbitLS3=P2^2;
sbitLS4=P2^3;
voidmain()
{
uci,j;
while
(1)
{
for(i=0;i<4;i++)
{
switch(i)
{
case(0):
LS1=0;LS2=1;LS3=1;LS4=1;P0=table[1];break;
case
(1):
LS1=1;LS2=0;LS3=1;LS4=1;P0=table[2];break;
case
(2):
LS1=1;LS2=1;LS3=0;LS4=1;P0=table[3];break;
case(3):
LS1=1;LS2=1;LS3=1;LS4=0;P0=table[4];break;
}
for(j=0;j<10;j++);
P0=0x00;
}
}
}
截图:
图二
4、见图二,利用动态扫描显示法,让数码管显示初始数字0000,每隔一秒,数字变化加1,直到9999。
周而复始,循环不息。
代码:
#include"reg52.h"
#defineucunsignedchar
#defineuiunsignedint
uccodetable[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
sbitLS1=P2^0;
sbitLS2=P2^1;
sbitLS3=P2^2;
sbitLS4=P2^3;
ucaa=0;
voidinit()
{
TMOD=0x01;
TH0=0x3c;
TL0=0xb0;
ET0=1;
EA=1;
TR0=1;
}
voiddisplay(uishu)
{
uci,j;
for(i=0;i<4;i++)
{
switch(i)
{
case(0):
LS1=0;LS2=1;LS3=1;LS4=1;P0=table[shu/1000];break;
case
(1):
LS1=1;LS2=0;LS3=1;LS4=1;P0=table[shu%1000/100];break;
case
(2):
LS1=1;LS2=1;LS3=0;LS4=1;P0=table[shu%100/10];break;
case(3):
LS1=1;LS2=1;LS3=1;LS4=0;P0=table[shu%10];break;
}
for(j=0;j<10;j++);
P0=0x00;
}
}
voidmain()
{
uccount=0;
init();
while
(1)
{
display(count);
if(aa==20)
{
aa=0;
count++;
if(count==10000)
count=0;
}
}
}
voidtimer0()interrupt1
{
TH0=0x3c;
TL0=0xb0;
aa++;
}
截图:
5、见图三。
利用中断完成:
数码管显示按键次数。
按键每按一次,数码管计数值加1,从00-99,周而复始,循环不息。
代码:
#include"reg52.h"
#defineucunsignedchar
#defineuiunsignedint
uccodetable[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
sbitLS1=P2^2;
sbitLS2=P2^3;
ucaa=0;
voidinit()
{
IT0=1;
EX0=1;
EA=1;
}
voidmain()
{
uci,j;
init();
while
(1)
{
for(i=0;i<2;i++)
{
switch(i)
{
case(0):
LS1=0;LS2=1;P0=table[aa/10];break;
case
(1):
LS1=1;LS2=0;P0=table[aa%10];break;
}
for(j=0;j<10;j++);
P0=0x00;
}
}
}
voidint0()interrupt0
{
EA=0;
aa++;
if(aa==100)
aa=0;
EA=1;
}
截图:
图三
6、见图四。
利用中断完成:
A、开关SW1未按下时,LED灯全灭。
B、开关按下第一次,LED正向流水点亮。
间隔时间300ms.
C、开关按下第二次,反向流水点亮。
间隔时间300ms.
D、开关按下第三次,全亮。
E、开关按下第四次,LED闪烁,(亮200ms灭200ms)。
如此循环。
代码:
#include"reg52.h"
#include"intrins.h"
#defineucunsignedchar
#defineuiunsignedint
ucaa=0;
ucflag=0;
uctemp=0xff;
voidinit()
{
TMOD=0x01;
TH0=0x3c;
TL0=0xb0;
ET0=1;
IT1=1;
EX1=1;
EA=1;
TR0=1;
}
voidmain()
{
init();
while
(1)
{
P1=temp;
if(flag==1)
{
if(aa==6)
{
aa=0;
temp=_crol_(temp,1);
}
}
if(flag==2)
{
if(aa==6)
{
aa=0;
temp=_cror_(temp,1);
}
}
if(flag==4)
{
if(aa==4)
{
aa=0;
temp=~temp;
}
}
}
}
voidtimer0()interrupt1
{
TH0=0x3c;
TL0=0xb0;
aa++;
}
voidint1()interrupt2
{
EA=0;
flag++;
aa=0;
if(flag==1)
temp=0xfe;
if(flag==2)
temp=0x7f;
if(flag==3)
temp=0x00;
if(flag==4)
temp=0x00;
if(flag==5)
{
flag=0;
temp=0xff;
}
EA=1;
}
截图:
图四
7、见图四。
不利用中断完成题6的相同功能。
代码:
#include"reg52.h"
#include"intrins.h"
#defineucunsignedchar
#defineuiunsignedint
sbitK1=P3^3;
ucaa=0;
ucflag=0;
uctemp=0xff;
voiddelay(uix)
{
uiy;
for(x;x>0;x--)
for(y=125;y>0;y--);
}
voidinit()
{
TMOD=0x01;
TH0=0x3c;
TL0=0xb0;
ET0=1;
EA=1;
TR0=1;
}
voidKey_Press()
{
if(K1==0)
{
delay(5);
if(K1==0)
{
flag++;
aa=0;
if(flag==1)
temp=0xfe;
if(flag==2)
temp=0x7f;
if(flag==3)
temp=0x00;
if(flag==4)
temp=0x00;
if(flag==5)
{
flag=0;
temp=0xff;
}
while(!
K1);
}
delay(5);
while(!
K1);
}
}
voidmain()
{
init();
while
(1)
{
P1=temp;
Key_Press();
if(flag==1)
{
if(aa==6)
{
aa=0;
temp=_crol_(temp,1);
}
}
if(flag==2)
{
if(aa==6)
{
aa=0;
temp=_cror_(temp,1);
}
}
if(flag==4)
{
if(aa==4)
{
aa=0;
temp=~temp;
}
}
}
}
voidtimer0()interrupt1
{
TH0=0x3c;
TL0=0xb0;
aa++;
}
截图:
心得体会:
通过本次对中断实验的操作,我学会了数码管的操作与中断的应用。
在本次试验中,我遇到了一些困难,如中断方式没有定义,导致程序发生错误,以及程序步骤层次没有考虑完善等。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 电子121 电子 121