基于51单片机的多功能实验

/********************************************************************
编写一个程序实现以下功能:
       1、 设计两种流水灯顺序,用定时器0控制,每过5s切换流水灯顺序。
       2、 用外部中断0和外部中断1分别控制两种数码管显示方式。
               用外部中断0,跳变沿触发,数码管每隔1s自加一;
               用外部中断1,跳变沿触发,数码管每隔2s自加二。     
*********************************************************************/


#include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器


typedef unsigned int u16;  //对数据类型进行声明定义
typedef unsigned char u8;


sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;


sbit k3=P3^2;         //k3控制外部中断0
sbit k4=P3^3;  //k4控制外部中断1


sbit led1=P2^0;
sbit led2=P2^1;
sbit led6=P2^5;
sbit led7=P2^6;
sbit led8=P2^7;


u8 code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};


u16 j=0,k=0,m=0,n=0,s=0;   // j表示选择外部中断,k表示数码管上的数字 ,m用于数码管  ,n,s用于流水灯   ,t用于切换点亮小灯的方式
int t=0;


void delay(u16 i)
{
     while(i--);
}


void DigDisplay()
{
u8 i;
for(i=0;i<8;i++)
{
switch(i) //位选,选择点亮的数码管,
{
case(0):
LSA=0;LSB=0;LSC=0;P0=smgduan[k%100%10]; break;//显示第0位
case(1):
LSA=1;LSB=0;LSC=0;P0=smgduan[k%100/10]; break;//显示第1位
case(2):
LSA=0;LSB=1;LSC=0;P0=smgduan[k/100]; break;//显示第2位
   case(3):
LSA=1;LSB=1;LSC=0;P0=smgduan[0]; break;//显示第3位
case(4):
LSA=0;LSB=0;LSC=1;P0=smgduan[0]; break;//显示第4位
case(5):
LSA=1;LSB=0;LSC=1;P0=smgduan[0]; break;//显示第5位
case(6):
LSA=0;LSB=1;LSC=1;P0=smgduan[0]; break;//显示第6位
case(7):
LSA=1;LSB=1;LSC=1;P0=smgduan[0]; break;//显示第7位
}
delay(100); //间隔一段时间扫描
P0=0x00;//消隐
}
}


void Timer0Init()
{
TMOD|=0X01;//选择为定时器0模式,工作方式1,仅用TR0打开启动。


TH0=0X3C; //给定时器赋初值,定时50ms
TL0=0XB0;
ET0=1;//打开定时器0中断允许
EA=1;//打开总中断
TR0=1;//打开定时器
}


void Int0Init()
{
//设置INT0
IT0=1;//跳变沿出发方式(下降沿)
EX0=1;//打开INT0的中断允许。
EA=1;//打开总中断
}


void Int1Init()
{
//设置INT1
IT1=1;//跳变沿出发方式(下降沿)
EX1=1;//打开INT1的中断允许。
EA=1;//打开总中断
}


void main()
{
Int0Init();
Int1Init();
Timer0Init();
while(1)
{
    DigDisplay();
}
}


void Timer0() interrupt 1
{
TH0=0X3C; //给定时器赋初值,定时50ms
TL0=0XB0;
if(j==1)
{
m++;
if(m==20)
{
   k=k+1;
if(k==100)
{
    k=0;

m=0;
}
}
if(j==2)
{
m++;
if(m==40)
{
   k=k+2;
if(k==100)
{
    k=0;

m=0;
}
}
n++;
if(n<100)
{
    s++;
if(s==10)
{
 switch(t)
 {
      case 0:led1=0;led2=1;led6=1,led7=1;led8=1;break;
  case 1:led1=1;led2=0;led6=1,led7=1;led8=1;break;
  case 2:led1=1;led2=1;led6=0,led7=1;led8=1;break;
  case 3:led1=1;led2=1;led6=1,led7=0;led8=1;break;
  case 4:led1=1;led2=1;led6=1,led7=1;led8=0;break;
  case 5:led1=1;led2=1;led6=1,led7=1;led8=0;break;
  case 6:led1=1;led2=1;led6=1,led7=0;led8=1;break;
  case 7:led1=1;led2=1;led6=0,led7=1;led8=1;break;
  case 8:led1=1;led2=0;led6=1,led7=1;led8=1;break;
  case 9:led1=0;led2=1;led6=1,led7=1;led8=1;t=-1;break;
  default:break;
 }
 t++;
 s=0;
}
}
if(n>=100&&n<200)
{
    s++;
if(s==10)
{
 switch(t)
 {
      case 0:led1=0;led2=1;led6=1,led7=1;led8=1;break;
  case 1:led1=1;led2=1;led6=0,led7=1;led8=1;break;
  case 2:led1=1;led2=1;led6=1,led7=1;led8=0;break;
  case 3:led1=1;led2=1;led6=0,led7=1;led8=1;break;
  case 4:led1=0;led2=1;led6=1,led7=1;led8=1;break;
  case 5:led1=0;led2=1;led6=1,led7=1;led8=1;break;
  case 6:led1=1;led2=1;led6=0,led7=1;led8=1;break;
  case 7:led1=1;led2=1;led6=1,led7=1;led8=0;break;
  case 8:led1=1;led2=1;led6=0,led7=1;led8=1;break;
  case 9:led1=0;led2=1;led6=1,led7=1;led8=1;t=-1;break;
  default:break;
 }
 t++;
 s=0;
}
}
if(n>=200)
{
   n=0;
}
}


void Int0() interrupt 0 //外部中断0的中断函数
{
delay(1000); //延时消抖
if(k3==0)
{
j=1;
}
}


void Int1() interrupt 2 //外部中断1的中断函数
{
delay(1000); //延时消抖
if(k4==0)
{
j=2;
}
}

猜你喜欢

转载自blog.csdn.net/cheetah2/article/details/80172803