C51单片机实行流水灯程序
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
//方式2,方式3灯开关数组。
unsigned char LED4_[16]={0XFF,0X7F,0X3F,0X1F,0X0F,0X07,0X03,0X01,0X00,0X01,0X03,0X07,0X0f,0X1f,0X3f,0X7f};//方式4
unsigned char LED56_[8]={0XFF,0X3F,0X9F,0XCF,0XE7,0XF3,0XF9,0XFC};
TMOD=0x01;//定时器0模式一。
TH0=0x3C;
TL0=0xB0;//溢出时间:50ms。
TR0=1;//定时器0开启。
IT0=1;//外部中断0下降沿触发。
IT1=1;//外部中断1下降沿触发。
EX0=1;//外部中断0开。
EX1=1;//外部中断1开。
ET0=1;//定时器0中断开。
EA=1;//总中断开。
case 8:
if(LEDPort==0xFF)
LEDPort=0x00;
else LEDPort=0xFF;
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<其他>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
while(1);
}
//*********************************************************************************************************
//**
//*************************************定时器0中断函数*************************************
i=4;
else i--;
LEDPort=LED23_[i];
break;
case 4:
if(i<16)
i++;
else i=0;
LEDPort=LED4_[i];
break;
case 5:
if(i<7)
i=i+2;
else i=0;
LEDPort=LED56_[i];
break;
case 6:
if(i<7)
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<模式1,灯从下往上依次点亮,不断循环。>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
case 1:
if(i<=0)
i=8;
else i--;
LEDPort=LED01_[i];
break;
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<模式2,灯从两边往中间依次点亮,不断循环。>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Delay=1;
else Delay+=5;
}
#include<reg51.h>
#define LEDPort P1
unsigned char LED01_[9]=
{0xFF,0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F,};
//方式0,方式1灯开关数组。
unsigned char LED23_[5]=
{0xFF,0x7E,0xBD,0xDB,0xE7};
//**
//*********************************************************************************************************
void vDelayChange(void) interrupt 2
{
if(Delay>=16)
unsigned char Mode=0;//模式选择,默认为模式0。
unsigned char Count=1;//定时器中断计数。
unsigned char Delay=1;//延迟计数,通过改变改数值改变灯状态延迟时间。
//灯延迟时间=uc_Dalay*定时器溢出时间。
void main()
{P2=0X3F;
case 2:
if(i>=4)
i=0;
else i++;
LEDPort=LED23_[i];
break;
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<模式3,灯从中间往两边依次点亮,不断循环。>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
case 3:
if(i<=0)
void vModeChange(void) interrupt 0
{
if(Mode>7)
Mode=0;
else Mode++;
P2=TAB[Mode];
}
//*********************************************************************************************************
//**
//*<函数功能>:当定时器0溢出时执行此函数,首先执行2个判断:*
//*(1)if判断是否改变灯的状态,可用于改变延时时间;*
//*(2)switch判断闪烁模式,根据不同模式对灯进行不同的通断。*
//*最后对定时器TH0,TL0重新赋值,溢出时间为50ms。*
//**
//*********************************************************************************************************
default:
break;
}
}
else Count++;
TH0=0x3C;//重新给定时器赋值。
TL0=0xB0;//定时时间:50ms。
}
//*********************************************************************************************************
switch(Mode)
{
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<模式0,灯从上往下依次点亮,不断循环。>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
case 0:
if(i>=8)
i=0;
else i++;
LEDPort=LED01_[i];
break;
void vTimer0(void) interrupt 1
{
if(Count%Delay==0)//通过此判断语句来改变延时。,例如:当uc_Delay=6时,定时器
{//溢出5次时灯状wenku.baidu.com改变1次。同时uc_Count重新赋值1.否则,uc_Count++
Count=1;//等待下一次溢出。因此可以改变延时。
//**
//*************************************外部中断0中断函数*************************************
//**
//*<函数功能>:当外部中断0产生下降沿信号时执行此函数,将闪灯模式从模式0到4循环切换。*
//**
//*********************************************************************************************************
i++;
else i=0;
LEDPort=LED56_[i];
break;
case 7:
if(i>=7)
i=0;
else i++;
LEDPort=LED7_[i];
break;
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<所有等以一定时间间隔同时闪烁。>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
unsigned char LED7_[]={0X0F,0XF0,0X33,0XCC,0X3C,0XC3,0XFF};
unsigned char TAB[9]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80};//定义断码表。
unsigned char i=0,j=9;//数据选择计数。
//**
//*************************************外部中断1中断函数*************************************
//**
//*<函数功能>:当外部中断1产生下降沿信号时执行此函数,将闪灯时间从50ms,250ms,500ms,750ms循环切换。*
unsigned char LED4_[16]={0XFF,0X7F,0X3F,0X1F,0X0F,0X07,0X03,0X01,0X00,0X01,0X03,0X07,0X0f,0X1f,0X3f,0X7f};//方式4
unsigned char LED56_[8]={0XFF,0X3F,0X9F,0XCF,0XE7,0XF3,0XF9,0XFC};
TMOD=0x01;//定时器0模式一。
TH0=0x3C;
TL0=0xB0;//溢出时间:50ms。
TR0=1;//定时器0开启。
IT0=1;//外部中断0下降沿触发。
IT1=1;//外部中断1下降沿触发。
EX0=1;//外部中断0开。
EX1=1;//外部中断1开。
ET0=1;//定时器0中断开。
EA=1;//总中断开。
case 8:
if(LEDPort==0xFF)
LEDPort=0x00;
else LEDPort=0xFF;
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<其他>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
while(1);
}
//*********************************************************************************************************
//**
//*************************************定时器0中断函数*************************************
i=4;
else i--;
LEDPort=LED23_[i];
break;
case 4:
if(i<16)
i++;
else i=0;
LEDPort=LED4_[i];
break;
case 5:
if(i<7)
i=i+2;
else i=0;
LEDPort=LED56_[i];
break;
case 6:
if(i<7)
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<模式1,灯从下往上依次点亮,不断循环。>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
case 1:
if(i<=0)
i=8;
else i--;
LEDPort=LED01_[i];
break;
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<模式2,灯从两边往中间依次点亮,不断循环。>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Delay=1;
else Delay+=5;
}
#include<reg51.h>
#define LEDPort P1
unsigned char LED01_[9]=
{0xFF,0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F,};
//方式0,方式1灯开关数组。
unsigned char LED23_[5]=
{0xFF,0x7E,0xBD,0xDB,0xE7};
//**
//*********************************************************************************************************
void vDelayChange(void) interrupt 2
{
if(Delay>=16)
unsigned char Mode=0;//模式选择,默认为模式0。
unsigned char Count=1;//定时器中断计数。
unsigned char Delay=1;//延迟计数,通过改变改数值改变灯状态延迟时间。
//灯延迟时间=uc_Dalay*定时器溢出时间。
void main()
{P2=0X3F;
case 2:
if(i>=4)
i=0;
else i++;
LEDPort=LED23_[i];
break;
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<模式3,灯从中间往两边依次点亮,不断循环。>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
case 3:
if(i<=0)
void vModeChange(void) interrupt 0
{
if(Mode>7)
Mode=0;
else Mode++;
P2=TAB[Mode];
}
//*********************************************************************************************************
//**
//*<函数功能>:当定时器0溢出时执行此函数,首先执行2个判断:*
//*(1)if判断是否改变灯的状态,可用于改变延时时间;*
//*(2)switch判断闪烁模式,根据不同模式对灯进行不同的通断。*
//*最后对定时器TH0,TL0重新赋值,溢出时间为50ms。*
//**
//*********************************************************************************************************
default:
break;
}
}
else Count++;
TH0=0x3C;//重新给定时器赋值。
TL0=0xB0;//定时时间:50ms。
}
//*********************************************************************************************************
switch(Mode)
{
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<模式0,灯从上往下依次点亮,不断循环。>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
case 0:
if(i>=8)
i=0;
else i++;
LEDPort=LED01_[i];
break;
void vTimer0(void) interrupt 1
{
if(Count%Delay==0)//通过此判断语句来改变延时。,例如:当uc_Delay=6时,定时器
{//溢出5次时灯状wenku.baidu.com改变1次。同时uc_Count重新赋值1.否则,uc_Count++
Count=1;//等待下一次溢出。因此可以改变延时。
//**
//*************************************外部中断0中断函数*************************************
//**
//*<函数功能>:当外部中断0产生下降沿信号时执行此函数,将闪灯模式从模式0到4循环切换。*
//**
//*********************************************************************************************************
i++;
else i=0;
LEDPort=LED56_[i];
break;
case 7:
if(i>=7)
i=0;
else i++;
LEDPort=LED7_[i];
break;
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<所有等以一定时间间隔同时闪烁。>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
unsigned char LED7_[]={0X0F,0XF0,0X33,0XCC,0X3C,0XC3,0XFF};
unsigned char TAB[9]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80};//定义断码表。
unsigned char i=0,j=9;//数据选择计数。
//**
//*************************************外部中断1中断函数*************************************
//**
//*<函数功能>:当外部中断1产生下降沿信号时执行此函数,将闪灯时间从50ms,250ms,500ms,750ms循环切换。*