利用51单片机进行LED 跑马灯设计

这篇具有很好参考价值的文章主要介绍了利用51单片机进行LED 跑马灯设计。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

题目:        

使用单片机驱动8个LED,2个按键并实现跑马灯功能。

        当按下按键1时,LED 从左至右依次点亮,全亮后再从右至左依次熄灭,全灭后再从左至右依次点亮,依次循环下去。

       当按下按键2 时,LED 从右至左依次点亮,全亮后再从左至右依次熄灭,全灭后再从右至左依次点亮,依次循环下去。

电路部分:

利用Proteus软件搭建的电路图如下:

利用51单片机进行LED 跑马灯设计部分一:AT89C51最小系统电路。

AT89C51最小系统电路其中包括时钟电路和复位电路。

时钟电路:产生像时钟一样准确运动的振荡电路。

复位电路:按键按下可以使程序重新运行。

部分二:从LED-0到LED7接入P2口的八个LED灯电路。

发光二极管:只允许电流单方向通过,并发光。

上拉电阻:降低回路电流,避免元件损坏。

部分三:按钮控制电路

按键按下,P3_2或P3_3口与GND相接,置 0。

按键未按下,P3_2或P3_3口与电阻相接,按键处断开,置 1。

上拉电阻:降低电流,保护电路。

程序部分:

设计思路:

1.先利用两个for循环和延时函数初步实现LED灯延时流水功能。

2.按键部分接入单片机的外部中断0和外部中断1,当按键按下时利用外部中断去打断for循环,从而实现流水灯方向的改变。

跑马灯亮灭思路:

右移亮:

P2=0xFE;
for(i=0;i<7;i++)
{
	DELAY;
	P2<<=1;
}

左移灭:

P2=0x80;
for(i=0;i<7;i++)
{
	DELAY;
	P2=(P2>>1)|0x80;
}

左移亮:

P2=0x7F;
for(i=0;i<7;i++)
{
		DELAY;
		P2>>=1;
}

右移灭:

P2=0x01;
for(i=0;i<7;i++)
{
	DELAY;
	P2=(P2<<1)|0x01;
}

方法一:利用外部中断0、外部中断1和Delay延时函数。

具体代码:

#include <REGX52.H>
#include <intrins.h>
typedef unsigned char u8;
typedef unsigned int  u16;
void Delay300ms();
bit key1_flag = 0;
bit key2_flag = 0;
u8 i =0;
u16 Num;

void main()
{ 
	AUXR &= 0x7F;		//定时器时钟12T模式
	TMOD=0x01;//设置定时器0为工作方式1
	TH0=(65535-50000)/256;//50MS
	TL0=(65535-50000)%256;	
	ET0=1;
	TR0=1;
 	EA=1;//开总中断
  
	while(1)
	{	
		if(key1_flag)
		{			
			P2 = 0xFE;			
			for(i=0;i<7;i++)  //左移循环亮
			{					
				Delay300ms();
				P2 <<= 1;
			} 
			
			Delay300ms();
			P2 = 0x80;
			
			for(i=0;i<7;i++)//右移循环灭
			{
				Delay300ms();
				P2 = (P2 >> 1) | 0x80;
			}
			Delay300ms();		
		}
		
			if(key2_flag)
			{ 
				P2=0x7F;
				for(i=0;i<7;i++)//右移循环亮
				{
					Delay300ms();
					P2>>=1;
				}			
				Delay300ms();
				P2=0x01;			
				for(i=0;i<7;i++)//左移循环灭
				{
				 Delay300ms();
					P2=(P2<<1)|0x01;		
				}
				Delay300ms();
			}		
	}
}

void exter0() interrupt 0  //外部中断0
{
	key1_flag = 1;	
	key2_flag = 0;	
}

void exint1() interrupt 2  //外部中断1
{     
	key1_flag = 0;
	key2_flag = 1;			
}

//时钟频率为12MHz的300ms的延时函数
void Delay300ms()		//@12.000MHz
{
	unsigned char i, j, k;

	_nop_();
	i = 3;
	j = 72;
	k = 161;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}

弊端:

1.浪费CPU资源:因为采用了大量的Delay()函数会导致单片机cpu进行大量的空运算。

2.延时可能不够精准:通过指令周期进行延时会产生误差。

改进的方法二:利用外部中断0、外部中断1和定时器0。

具体代码:

#include <REGX52.H>
#include <intrins.h>
typedef unsigned char u8;
typedef unsigned int  u16;

bit key1_flag = 0;
bit key2_flag = 0;
u8 i =0;
u16 Num = 0;
sbit led = P2^0;

void main()
{ 
	TMOD = 0x01;//设置定时器0为工作方式1
	TH0  = (65535-1000)/256;//设初值1ms
	TL0  = (65535-1000)%256;	 	
	ET0  = 1;//定时器0的溢出允许位
	TR0  = 1;//定时器0的运行控制位
	
  EX0  = 1;//外部中断0的控制位
	EX1  = 1;//外部中断1控制位
	EA   = 1;//开总中断
	
	while(1)
	{			
	}
}

void exter0() interrupt 0 //外部中断0
{
	key1_flag = 1;
	key2_flag = 0;
	i = 0;
}

void exint1() interrupt 2 //外部中断1
{     	
	key1_flag = 0;
	key2_flag = 1;
	i= 0;
}

void tm0_isr() interrupt 1 using 1 //定时器中断0
{
	TH0  = (65535-1000)/256;//设初值1ms
	TL0  = (65535-1000)%256;	 	
	Num++;
		
	if(Num>199)
	{
		Num = 0;
		if(key1_flag)
		{		
			switch(i++)
			{
				case 0:P2 = 0xFE; break;
				case 1:case 2:case 3:case 4:case 5:case 6:case 7:P2 <<= 1;break;
				case 8:P2  = 0x80;break;
				case 9:case 10:case 11:case 12:case 13:case 14:P2 = (P2 >> 1) | 0x80;break;
				case 15:P2 = (P2 >> 1) | 0x80;i=0;break;
			}
		}
		else if(key2_flag)
		{
			switch(i++)
			{
				case 0:P2 = 0x7F; break;
				case 1:case 2:case 3:case 4:case 5:case 6:case 7:P2 >>= 1;break;
				case 8:P2 = 0x01;	break;
				case 9:case 10:case 11:case 12:case 13:case 14:P2 = (P2 << 1) | 0x01;	break;
				case 15:P2 = (P2 << 1) | 0x01;i=0;break;
			}
		}	
	}
}

以上就是我此次对51单片机跑马灯部分的学习,如有错误或者更好的想法,欢迎大家提出。        文章来源地址https://www.toymoban.com/news/detail-470888.html

到了这里,关于利用51单片机进行LED 跑马灯设计的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【51单片机】LED 点阵

    参考:普中 51 单片机开发攻略 第13章 mian.c

    2024年01月22日
    浏览(30)
  • 【51单片机】LED点阵屏

    🎊专栏【51单片机】 🍔喜欢的诗句:更喜岷山千里雪 三军过后尽开颜。 🎆音乐分享【Waiting For Love】 大一同学小吉,欢迎并且感谢大家指出我的问题🥰 目录 🍔74HC595图片 🍔74HC595原理 🍔”上升沿“是什么意思 🎆LED点阵屏显示图形  🎈现象  🎈代码(三部分) main.c  Del

    2024年02月02日
    浏览(30)
  • 51单片机点亮LED灯

    目录 前言 一、点亮一个LED 二、LED闪烁 三、LED流水灯 四、独立按键控制LED 独立按键控制LED亮灭 独立按键控制LED状态 独立按键控制LED以二进制形式显示 独立按键控制LED状态循环移位 总结           嵌入式学习的入门就是点亮LED灯,就好比学习编程语言敲 “Hello world”

    2024年02月06日
    浏览(29)
  • 51单片机LED点阵屏

    LED点阵屏是一种由许多小型LED灯组成的矩阵式显示屏。这些LED灯可以是单色、双色或全彩的,它们排列成行和列的网格,可以根据需要点亮来显示图像、文字或动画等内容。LED点阵屏广泛应用于户外广告牌、室内显示、交通信号灯、电子价格标签和其他需要显示信息的场合。

    2024年01月23日
    浏览(37)
  • 51单片机(二)成功点亮LED

    ❤️ 专栏简介:本专栏记录了从零学习单片机的过程,其中包括51单片机和STM32单片机两部分;建议先学习51单片机,其是STM32等高级单片机的基础;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 :适用于想要从零基础开始学习入门单片机,且有一定C语言基础的的童鞋

    2023年04月25日
    浏览(32)
  • 51单片机-按键控制led灯

    1.开发环境介绍 使用C语言,环境为keil Keil C51是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用. 什么是单片机 单片机(Single-Chip Microcomputer)是一种集成电路芯片,把具

    2024年02月09日
    浏览(31)
  • 51单片机按键控制LED亮灭

    通过单片机按键控制LED亮灭与传统电路的物理逻辑不同,在物理逻辑中开关控制电路的通断来控制LED的亮灭,而通过单片机完成该项目至于要不断地读取按键所连接IO口的电平来判断对LED连接的IO口输出的电平即可。 原理图如下:  根据原理图,我们可以发现按键按下时P2.1口

    2023年04月18日
    浏览(38)
  • 如何使用单片机点亮LED灯,并使用按键控制[51单片机]

    首先先看一下我的板子,如果我们板子不相同,可能操作也不太相同 我们就不讲底层原理了,直接看,我们可以看到板子上有 8个LED灯   那这个8个LED用什么来控制呢,我们先看底层的线路图,所有的LEDD都连接到了P2带后缀的接口上, 那么只需要操作这几个接口的高低电频,

    2024年02月05日
    浏览(32)
  • 51单片机LED模拟交通灯

    实验软件 : Keil5 + Proteus7 实验元件 : AT89C51 * 1, LED-GRD * 3, LED-YELLOW * 3, LED-GREEN * 3, RES * 9 (用来限流可以不要)

    2024年02月11日
    浏览(35)
  • 51单片机:独立按键控制LED灯

    1. 独立按键控制LED灯状态          亮灭实验完成后,就可以控制LED状态,首先我们知道由于机械结构的弹性作用,按键开关在闭合时不会一瞬间稳定的接通,在断开时,也不会一下子断开。所以就得需要程序消抖,也就是适当延时,程序如下 #include\\\"reg52.h\\\" //定义LED灯 sbit

    2023年04月09日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包