一、秒表走时开启并带蜂鸣器,3~6秒led全部点亮。6s停止计时数码管显示good,6-10s中途如果按K1则数码管显示nICE,led灯2468熄灭,如果不按下K1则4s后重新开始计时。
#include <reg52.h>
#define uchar unsigned char
sbit k1=P3^4; //设置k1按键
sbit fm=P2^3; //设置蜂鸣器
unsigned char count,sec=0,j,k,num0,num1,num2,num3,i,sec1,sec2,sec3,sec4;
unsigned char code weitable[]={0x8f,0x4f,0x2f,0x1f};//显码管位置1,2,3,4
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x6f,0x3f,0x3f,0x5e,
0x37,0x06,0x39,0x79};//显示1~6,good,nICE选表
void start_timer()
{
ET0=1; //开定时器T0中断
EA=1; //开总中断
TR0=1; //开定时器
}
void stop_timer()
{
ET0=0; //关定时器T0中断
EA=0; //关总中断
TR0=0; //关定时器
}
void delay(unsigned char i) //延时函数
{
for(j=i;j>0;j--)
for(k=112;k>0;k--);
}
void display1(uchar wei,uchar shu)
{
wei=wei-1; //得到所选位置下标
P0=table[shu]; //显示内容
P2=weitable[wei]; //将要显示的位置
delay(5);
}
void display(unsigned char a,unsigned char b,unsigned char c,unsigned char d)
{
display1(4,a);
display1(3,b);
display1(2,c);
display1(1,d);
} //一次显示4个数码管,且每个位置可自定义
void main()
{
TMOD=0x01; //采用定时器T0,工作与模式1
TH0=0x4c; //定义初始值,50ms
TL0=0x00;
if(sec==0) start_timer(); //打开定时器,开始计时
while(1)
{
if(count==20) //1s时,sec加1,并伴随蜂鸣器响应
{
count=0;
fm=0;
delay(10);
fm=1;
sec++;
if(sec>=0 && sec<6) sec1=sec%10; //0~6s秒表计数
if(sec>=3 && sec<6) P1=0x00; //3s时led灯全部点亮
if(sec>=6) //6秒后显示good
{
sec1=10;
sec2=9;
sec3=8;
sec4=7;
if(k1==0) //判断是否有按下按键的信号
{ //延时10ms,防抖
delay(10);
if(k1==0) //再次判断按键是否按下
{
while(k1==0) //直至按键松开,显示nICE,结束计时,led2468灯熄灭
{
sec1=14;
sec2=13;
sec3=12;
sec4=11;
stop_timer();
P1=0xaa;
}
}
}
}
else if(sec<6) //6s前数码管显示秒数
{
sec1=sec%10;
sec2=0;
sec3=0;
sec4=0;
}
if(sec==10) //10s时重新计时,所有灯熄灭
{
sec=0; //计时清零
P1=0xff;
}
}
num0=sec1;
num1=sec2;
num2=sec3;
num3=sec4;
display(num3,num2,num1,num0); //显示
}
}
void timer0() interrupt 1
{
TH0=0x4c;
TL0=0x00;
count++; //中断触发次数加1
}
二、8-1 led灯流水闪烁并带蜂鸣器响应,按下k1后结束并触发中段,2s后led 1-8流水闪烁,2s后显示屏显示数字1982.
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
sbit k1=P3 ^ 4; //设置键盘k1
sbit fm=P2 ^ 3; //设置蜂鸣器
int i=0;
unsigned char j,k;
unsigned char code weitable[]={0x8f,0x4f,0x2f,0x1f};//显示屏1234选表
unsigned char code table[]={0x06,0x6f,0x7f,0x5b};//1982选表
void delay(unsigned char i) //延时函数
{
for(j=i;j>0;j--)
for(k=112;k>0;k--);
}
void display1(uchar wei,uchar shu)//在任意一位显示任意数字
{
wei=wei-1;
P2=weitable[wei];
P0=table[shu];
delay(5);
}
void display(uchar a,uchar b,uchar c,uchar d) //一次显示4个数码管,且每个位置可自定义
{
display1(4,a);
display1(3,b);
display1(2,c);
display1(1,d);
}
void start_timer()
{
ET0=1; //开定时器T0中断
EA=1; //开总中断
TR0=1; //打开定时器
}
void main()
{
TMOD=0x01; //模式设置,00000001,采用定时器T0,工作与模式1(M1=0,M0=1)
TH0=0x4c; //定义初始值,50ms
TL0=0x00;
P1=0x7f;
while(k1==1) //k1按下结束循环
{
P1=_cror_(P1,1); //循环右移
fm=1; //蜂鸣器响应
delay(500);
fm=0;
}
while(1)
{
start_timer(); //开始定时器
fm=1;
if(i>40) //2s后
{
P1=0xfe;
while(1)
{
P1=_crol_(P1,1); //循环左移
delay(500);
if(i>80) //2s后显示1982
{
while(1)
{
display(0,1,2,3);
}
}
}
}
}
}
void timer0() interrupt 1
{
TH0=0x4c;
TL0=0x00;
i++; //中断触发次数加1
}
三、按下K2显示1234,按下K3led流水灯闪烁并伴随蜂鸣器响应
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
//按下K2显示1234,按下K3led流水灯闪烁并伴随蜂鸣器响应
sbit k2=P3 ^ 5; //设置键盘k2
sbit k3=P3 ^ 6; //设置键盘K3
sbit fm=P2 ^ 3; //设置蜂鸣器
int i=0;
unsigned char j,k,count;
void delay(unsigned char i) //延时函数
{
for(j=i;j>0;j--)
for(k=112;k>0;k--);
}
unsigned char code weitable[]={0x8f,0x4f,0x2f,0x1f}; //显示屏位置选表
unsigned char code table[]={0x06,0x5b,0x4f,0x66}; //显示1,2,3,4选表
void display1(uchar wei,uchar shu)
{
wei=wei-1; //得到所选位置下标
P0=table[shu]; //将要显示的位置
P2=weitable[wei]; //显示内容
delay(5);
}
void display(unsigned char a,unsigned char b,unsigned char c,unsigned char d)
{
display1(4,a);
display1(3,b);
display1(2,c);
display1(1,d);
} //一次显示4个数码管,且每个位置可自定义
void main()
{
while(1)
{
P1=0xff; //关闭所有灯
P2=0x0f; //关闭显示屏
if(k3==0) //按下k1
{
P1=0x7f; //第八个灯亮
while(k3==!1) //松开k1循环结束
{
fm=1;
delay(1000);
fm=0;
P1=_cror_(P1,1); //循环右移
//蜂鸣器响应
}
}
if(k2==0) //按下K2
{
P1=0xff;
fm=1;
while(k2==!1) //松开k2结束循环
{
display(0,1,2,3); //显示1,2,3,4
}
}
}
}