#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灯模式切换系统。

基于单片机的LED灯模式切换功能实现

原文地址: https://www.cveoy.top/t/topic/oMhe 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录