单片机期末项目

一、秒表走时开启并带蜂鸣器,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
   }
  }
 }
}

看完了点个赞吧!!!

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值