基于单片机定时器和外部按键实现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;
}
}
}
总结500字内容:本次实验使用了单片机的定时器和外部按键,实现了LED灯模式的切换和闪烁,实践了单片机的外部中断和定时器中断的应用。
在实验过程中,需要注意以下几点:
- 定时器设置
本次实验使用了定时器0和方式1,需要根据50ms的要求设置定时器的初值,即TH0和TL0的值,以及将ET0置为1并启动计时器0。
- 外部中断设置
外部按键需要设置为中断,当按键被按下时,进入中断服务函数,并在函数中进行模式的切换和计时器和计数器的重置。
- 计时器和计数器的应用
在本次实验中,计时器用于控制LED灯的闪烁时间,计数器用于控制LED灯亮起的顺序。在不同的模式下,计时器和计数器的应用方式有所不同,需要根据要求进行设置。
总之,本次实验通过单片机的定时器和外部按键的应用,实现了LED灯模式的切换和闪烁,加深了对单片机中断和定时器的理解和应用。
原文地址: https://www.cveoy.top/t/topic/oMhl 著作权归作者所有。请勿转载和采集!