#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灯模式的切换和闪烁,实践了单片机的外部中断和定时器中断的应用。

在实验过程中,需要注意以下几点:

  1. 定时器设置

本次实验使用了定时器0和方式1,需要根据50ms的要求设置定时器的初值,即TH0和TL0的值,以及将ET0置为1并启动计时器0。

  1. 外部中断设置

外部按键需要设置为中断,当按键被按下时,进入中断服务函数,并在函数中进行模式的切换和计时器和计数器的重置。

  1. 计时器和计数器的应用

在本次实验中,计时器用于控制LED灯的闪烁时间,计数器用于控制LED灯亮起的顺序。在不同的模式下,计时器和计数器的应用方式有所不同,需要根据要求进行设置。

总之,本次实验通过单片机的定时器和外部按键的应用,实现了LED灯模式的切换和闪烁,加深了对单片机中断和定时器的理解和应用。

基于单片机定时器和外部按键实现LED灯模式切换与闪烁

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

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