#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 灯的闪烁模式。程序中定义了两种模式,模式 1 每隔 1 秒钟 LED 灯的亮灭状态会改变一次,模式 2 每隔 1 毫秒 LED 灯的亮灭状态会改变一次。

在系统仿真中,可以看到 LED 灯按照不同的模式进行闪烁,按下按键可以切换模式。在模式 1 下,每隔一秒钟 LED 灯的亮灭状态会改变一次,即每次亮起的灯不同。在模式 2 下,每隔 1 毫秒 LED 灯的亮灭状态会改变一次,即 LED 灯的亮灭状态变化非常快。

总之,本程序通过计时器和计数器的配合,实现了按下按键切换 LED 灯的闪烁模式的功能。同时也展示了计时器和计数器在单片机程序设计中的应用。

基于 8051 单片机的 LED 闪烁模式切换程序

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

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