一、实验目的
1.掌握外部中断技术的基本使用方法
2.掌握中断处理程序的编写方法
二、实验内容
使用五个数码管从”00000”开始进行加法计数值到”60000”后重新计数。按动K2键时计数暂停,再按继续计数,每次按键操作都需要配上按键同步音,即蜂鸣器短暂发声。
三.实验步骤
1.新建工程->新建*.c文件->将文件添加到该工程;
注意:Output时要在Create Hex file项打勾。*.hex文件是用于烧录到板子上的。若不操作这一步,会在编译时不会自动创建*.hex文件。
2、设置一个中断函数,用于控制按钮,在中断函数中;当flag为1时,cnt自加1;当flag为0时 cnt不变;flag的变化是由按键k2控制(本次设计)即讲k2连接口与P3.2引脚连接;
3、蜂鸣器:在中断函数中设置蜂鸣器。
三、实验代码
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define OUT P1
uint cnt;
bit flag;
sbit LS138A=P2^7;
sbit LS138B=P2^6;
sbit LS138C=P2^5;
sbit BEEP=P3^5;
unsigned int k;
unsigned char code dispTab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};
//chose position
void selectPosition(char i)
{
switch(i)
{
case 0: LS138A=0;LS138B=0;LS138C=0;break;
case 1: LS138A=1;LS138B=0;LS138C=0;break;
case 2: LS138A=0;LS138B=1;LS138C=0;break;
case 3: LS138A=1;LS138B=1;LS138C=0;break;
case 4: LS138A=0;LS138B=0;LS138C=1;break;
case 5: LS138A=1;LS138B=0;LS138C=1;break;
case 6: LS138A=0;LS138B=1;LS138C=1;break;
case 7: LS138A=1;LS138B=1;LS138C=1;
}
}
/*************************/
void init(void)
{
flag = 0;
EA=1;
EX0=1;
IT0=1;
}
/************************/
void delay(uint k)
{
uint data i,j;
for(i=0;i<k;i++)
{
for(j=0;j<20;j++)
{
;
}
}
}
/********************/
void main(void)
{
uchar i;
init();
while(1)
{
if(flag)cnt++;
if(cnt>60000)cnt=0;
for(i=0;i<100;i++)
{
selectPosition(3);
OUT=dispTab[cnt/10000];
delay(10);
selectPosition(4);
OUT=dispTab[cnt%10000/1000];
delay(10);
selectPosition(5);
OUT=dispTab[cnt%1000/100];
delay(10);
selectPosition(6);
OUT=dispTab[(cnt%100)/10];
delay(10);
selectPosition(7);
OUT=dispTab[cnt%10];
delay(10);
}
}
}
/************/
void extem_int0(void)interrupt 0 using 0
{
flag=!flag;
for(k=0;k<25;k++)
{
BEEP=1;
delay(10);
BEEP=0;
delay(10);
}
}
四.实验结果
开始时,数码管显示00000;当按下K1键时,数码管数字开始变化;当再次按键时,变化暂停。一旦按键,就会蜂鸣一声;再按一次,数码管数字继续变化。
完整的Word格式文档51黑下载地址:
计数器.docx
(19.79 KB, 下载次数: 12)
|