基于单片机的LED灯模式切换功能实现
#include<reg51.h>
sbit K1=P1^4;//外部按键
unsigned char code shuzu1[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//模式1下LED灯亮起的码值数组 unsigned char code shuzu2[]={0xfc,0xf9,0xf3,0xe7,0xcf,0x9f,0x3f,0x7e};//模式2下LED灯亮起的码值数组
unsigned char jishu=0;//计数器变量 unsigned char moshi=2;//模式变量,初始化为2表示初始模式为模式1 unsigned char Time;//计时器变量
void main()
{
P2=shuzu1[jishu]; //初始状态下,LED灯亮起的码值为模式1下第一个码值
TMOD = 0x11; //设置计时器0为方式1
TH0 = 0x3C; //计时器0初始值,50ms
TL0 = 0xB0;
EA = 1; //开启总中断
ET0 = 1;TR0 = 1;//开启计时器0中断,启动计时器0
while(1)
{
if(K1==0)//当按键被按下
{
moshi++;//切换模式
if(moshi>1) //模式只有2种,如果大于1,重新从0开始
moshi=0;
Time=0;jishu=0; //重置计时器和计数器
while(K1==0);//等待按键释放
}
if(moshi==0)//模式1
{
P2=shuzu1[jishu];
}
if(moshi==1)//模式2
{
P2=shuzu2[jishu];
}
}
}
void Timer0() interrupt 1 //计时器0中断服务函数
{
TH0 = 0x3C; //重置计时器0初始值
TL0 = 0xB0;
Time++; //计时器加1
if(moshi==0)//模式1
{
if(Time>=20) //50ms*20=1s
{
Time=0; //计时器清零
jishu++; //计数器加1
if(jishu>=8) //计数器只有8种状态,如果大于等于8,重新从0开始
jishu=0;
}
}
else//模式2
if(Time>=1) //每隔1ms
{
{
Time=0; //计时器清零
jishu++; //计数器加1
if(jishu>=8) //计数器只有8种状态,如果大于等于8,重新从0开始
jishu=0;
}
}
}
总结内容:本次实验主要实现了基于单片机的LED灯模式切换功能。通过外部按键来切换LED灯的显示模式,同时利用计时器来定时改变LED灯的亮灭状态。实验过程中,需要掌握定时器的使用方法和中断服务函数的编写。同时,需要注意按键的消抖处理,避免误操作。本次实验还涉及到了数组的使用,通过数组来存储LED灯亮起的码值,方便代码的编写和管理。最终实现了功能完备、稳定可靠的LED灯模式切换系统。
原文地址: https://www.cveoy.top/t/topic/oMhe 著作权归作者所有。请勿转载和采集!