赞
踩
1. 所需元件:数码管 蜂鸣器 按键(3颗)
2. 考核要点:
数码管动态显示、蜂鸣器、按键响应、定时器、中断
3. 实验描述:
Ø 3颗独立按键分别用于设置分钟(M键)、秒钟(S键)和启动计时(K键),数码管显示当前设置的分钟及秒钟数;
Ø 启动计时器后,数码管动态更新当前计时剩余时间,刷新周期为1秒;
Ø 计时过程中,再次按下K键时,计时暂定,再按下时,继续计时;
Ø 计时器剩余秒数为0时,蜂鸣器响起。
实验完成
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit beep=P1^5;//按键定义
sbit fenk=P3^3;
sbit miaok=P3^2;
sbit start=P3^0;
sbit a0=P2^2;//138译码器控制数码管位选
sbit a1=P2^3;
sbit a2=P2^4;
int fen=0,miao=0,a;//定义全局变量
char flag=0;
uchar sm[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//数码管数组
void delay(uint k)//延时函数220*k毫秒
{
uint i;
for(i=110;i>0;i--)
for(;k>0;k--);
}
void smg(int a,int b)//数码管显示函数
{
uint i;
for(i=0;i<4;i++)
{
switch(i)
{
case 0:a0=0;a1=0;a2=0;P0=sm[a%10];break;//数码管第一位
case 1:a0=1;a1=0;a2=0;P0=sm[a/10%10];break;//第二位
case 2:a0=0;a1=1;a2=0;P0=0x40;break;//第三位
case 3:a0=1;a1=1;a2=0;P0=sm[b];break;//第四位
}
delay(50);//短延时
P0=0x00;//消影
}
}
void anjian()
{
if(fenk==0)
{
while(!fenk);//按键分钟加一分钟
fen++;
}
if(miaok==0)
{
while(!miaok);
miao+=1;
if(miao>=60)//按键秒加一秒
{
fen++;
miao=0;
}
}
if(start==0)
{
while(!start);//开始倒计时
TR0=1;
}
}0
void main()
{
TMOD=0X20;//打开定时器
EA=1;
ET0=1;
TH0=0X9C;
TL0=0X9C;
TR0=0;
while(1)
{
anjian();
smg(miao,fen);
if(flag==1)//通过定时器返回值打开蜂鸣器
{
//beep=1;//有缘蜂鸣器
while(1) //无缘蜂鸣器
{
beep=~beep;
delay(0);
}
}
}
}
void interruot1() interrupt 1//中断减时间
{
a++;
if(a==10)
{
a=0;
if(miao==0)
{
if(fen==0)
{
TR0=0;
flag=1;//当分钟和秒钟都是0的时候关闭定时器,同时开启flag打开蜂鸣器长鸣
}
else
{
miao=59;
fen--;
}
}
else
miao--;
}
}
另
#include <reg52.h>
#include <intrins.h >
sbit Beep=P1^7;
sbit k1=P3^0;
sbit k2=P3^1;
sbit k3=P3^2;
sbit a138=P2^0;
sbit b138=P2^1;
sbit c138=P2^2;
char fen=0,miao=1,zt=0,i=0;
code unsigned char smgduan[]={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x00,0XBF,0x80};
unsigned char n=0;
unsigned char code music_tab[] ={
0x1F, 0x05, 0x20 , 0x10,
0x1C, 0x10, 0x20 , 0x20,
0x26, 0x20, 0x2B , 0x20,
0x30, 0x20, 0x2B , 0x40,
0x1C, 0x10, 0x20 , 0x20,
0x30, 0x20, 0x2B , 0x40,
};
void Delay (unsigned char m)
{
unsigned i=3*m;
while(--i);
}
void Delayms(unsigned char a)
{
while(--a);
}
void csh()
{
TMOD=0X11;
TH0=0XFC;
TL0=0X18;
EA=1;
ET0=1;
ET1=1;
}
void shu()
{
for(i=0;i<5;i++)
{
switch(i)
{
case 0:a138=1;b138=1;c138=1;P0=~smgduan[miao%10];break;
case 1:a138=1;b138=1;c138=0;P0=~smgduan[miao/10];break;
case 2:a138=1;b138=0;c138=1;P0=~smgduan[11];break;
case 3:a138=1;b138=0;c138=0;P0=~smgduan[fen%10];break;
case 4:a138=0;b138=1;c138=1;P0=~smgduan[fen/10];break;
}
Delayms(200);
P0=0X00;
}
}
void jx()
{
if(fen>59)
{
fen=0;
}else if(miao>59)
{
miao=0;
}else if(miao<0)
{
miao=59;
fen--;
}else if(fen<0)
{
fen=0;
}else if(0==miao)
{
if(0==fen)
{
zt=3;
TR0=0;
}
}
}
void key()
{
static unsigned char flag=0;
if(0==k1)
{
Delayms(100);
if(0==k1)
{
if(0==zt)
{
flag=1;
}
}
}else if(1==k1)
{
if(1==flag)
{
fen++;
flag=0;
}
}
if(0==k2)
{
Delayms(100);
if(0==k2)
{
if(0==zt)
{
flag=2;
}
}
}else if(1==k2)
{
if(2==flag)
{
miao++;
flag=0;
}
}
if(0==k3)
{
Delayms(100);
if(0==k3)
{
if(0==zt)
{
flag=3;
}else if(1==zt)
{
flag=4;
}
}
}else if(1==k3)
{
if(3==flag)
{
zt=1;
TR0=1;
flag=0;
}else if(4==flag)
{
zt=0;
TR0=0;
flag=0;
}
}
}
void feng()
{
unsigned char p,m;
unsigned char i=0;
TH1=0xd8;TL1=0xef;
play:
while(1)
{
a: p=music_tab[i];
if(p==0x00) { i=0, Delayms(1000); goto play;}
else if(p==0xff) { i=i+1;Delayms(100),TR1=0; goto a;}
else {m=music_tab[i++], n=music_tab[i++];}
TR1=1;
while(n!=0) Beep=~Beep,Delay(m);
TR1=0;
}
}
void main()
{
csh();
while(1)
{
key();
jx();
shu();
if(3==zt)
{
feng();
}
}
}
void smg() interrupt 1
{ static unsigned int cnt=0;
TH0=0XFC;
TL0=0X18;
cnt++;
if(cnt>1000)
{
miao--;
cnt=0;
}
}
void int0() interrupt 3
{ TH1=0xd8;
TL1=0xef;
n--;
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。