基于51单片机的流水灯的proteus仿真(附源码)

本文介绍了如何通过51单片机的最小系统构建,包括复位电路和晶振的作用,以及如何利用Proteus进行LED灯光控制(如点亮、闪烁和流水灯效果)的仿真。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


一、前言

最近在整理资料的时候,偶然发现了以前大学学习51单片机买的开发板附带的学习资料,开发板早已不知去向,只剩下一些代码,刚好最近也在用Proteus仿真,所幸在用仿真重温一下51单片机。


二、51最小系统

单片机最小系统是指用最少的元件组成的单片机可以工作的系统。对51系列单片机来说,最小系统一般包括单片机芯片、晶振电路、复位电路。

在这里插入图片描述
复位电路:单片机复位电路就好比电脑的重启,当电脑在使用中出现死机,按下重启电脑程序从头开始执行。基本工作原理是通过一个延时元件(通常是电容)和触发电路,将单片机的复位引脚(RESET)保持在高电平状态,从而使单片机进入复位状态。一旦复位条件满足解除,复位电路会将复位引脚的电平变为低电平,使得单片机退出复位状态,开始正常工作。

晶振电路:晶振是给单片机提供工作信号脉冲的,这个脉冲就是单片机的工作速度。例如,12M晶振单片机工作速度就是每秒12M。晶振与单片机的XTAL0脚和脚XTAL1构成的振荡电路中会产生谐波,这个波对电路的影响不大,但会降低电路时钟振荡器的稳定性。为了电路的稳定性起见, ATMEL公司(89C51系列厂商)建议在晶振的两引脚处接入两个10pf-50pf的瓷片电容,并接地来削减谐波对电路稳定性的影响,所以晶振电路的电容在10pf-50pf之间都可以。

三、点亮第一个LED

仿真图

在这里插入图片描述

仿真程序

这段程序是用来控制单片机上的一个LED灯,在单片机上将LED灯接在P2.0端口上,并通过程序控制LED灯的亮灭。

其中,sbit led=P2^0;:这行代码使用 sbit 关键字来定义了一个名为 led 的位变量,它对应于单片机的 P2.0 端口。P2^0 表示将 P2 端口的第0位(即 P2.0)与 led 关联起来,这样我们就可以通过对 led 变量的操作来控制 P2.0 端口的状态。

/**************************************************************************************
*		              点亮第一个LED实验												  *
实现现象:下载程序后D1指示灯点亮
注意事项:无																				  
***************************************************************************************/


#include "reg52.h"    //此文件中定义了单片机的一些特殊功能寄存器

sbit led=P2^0;	   //将单片机的P2.0端口定义为led

/*******************************************************************************
* 函 数 名       : main
* 函数功能		 : 主函数
* 输    入       : 无
* 输    出    	 : 无
*******************************************************************************/
void main()
{
	while(1)
	{
		led=0;	//P2.0端口设置为低电平
	}		
}

四、LED闪烁

仿真图

flicker

仿真程序

这段程序是用来实现LED灯周期性的闪烁效果,每个周期约为900毫秒(450毫秒熄灭 + 450毫秒点亮)。

/**************************************************************************************
*		              LED闪烁实验												  *
实现现象:下载程序后D1指示灯闪烁
注意事项:无																				  
***************************************************************************************/

#include "reg52.h"			 //此文件中定义了单片机的一些特殊功能寄存器
typedef unsigned int u16;	  //对数据类型进行声明定义
typedef unsigned char u8;


sbit led=P2^0;		 //将单片机的P2.0端口定义为led

/*******************************************************************************
* 函 数 名         : delay
* 函数功能		   : 延时函数,i=1时,大约延时10us
*******************************************************************************/
void delay(u16 i)
{
	while(i--);	
}

/*******************************************************************************
* 函 数 名       : main
* 函数功能		 : 主函数
* 输    入       : 无
* 输    出    	 : 无
*******************************************************************************/
void main()
{
	while(1)
	{
		led=0;
		delay(50000); //大约延时450ms
		led=1;
		delay(50000); //大约延时450ms	
	}		
}

五、LED流水灯

仿真图

Flow light

仿真程序

这段程序是用来控制LED灯左右移动,实现一个流水灯的效果。

其中,crol(led,1); 和 cror(led,1);:这两个函数分别用于将 led 变量左移和右移一位。这些函数是 intrins.h 头文件中定义的,用于实现循环左移和循环右移的操作。


/**************************************************************************************
*		              LED流水灯实验												  *
实现现象:下载程序后LED呈现流水灯效果进行左移右移滚动
注意事项:无																				  
***************************************************************************************/

#include "reg52.h"			 //此文件中定义了单片机的一些特殊功能寄存器
#include<intrins.h>		//因为要用到左右移函数,所以加入这个头文件

typedef unsigned int u16;	  //对数据类型进行声明定义
typedef unsigned char u8;

#define led P2	   //将P2口定义为led 后面就可以使用led代替P2口

/*******************************************************************************
* 函 数 名         : delay
* 函数功能		   : 延时函数,i=1时,大约延时10us
*******************************************************************************/
void delay(u16 i)
{
	while(i--);	
}

/*******************************************************************************
* 函 数 名       : main
* 函数功能		 : 主函数
* 输    入       : 无
* 输    出    	 : 无
*******************************************************************************/
void main()
{
	u8 i;
	led=0xfe;
	delay(50000); //大约延时450ms	
	while(1)
	{	
/*		for(i=0;i<8;i++)
		{
			P2=~(0x01<<i);	 //将1右移i位,然后将结果取反赋值到P2口
			delay(50000); //大约延时450ms
		}
*/		
		for(i=0;i<7;i++)	 //将led左移一位
		{
			led=_crol_(led,1);
			delay(50000); //大约延时450ms	
		}
		for(i=0;i<7;i++)	//将led右移一位
		{
			led=_cror_(led,1);
			delay(50000); //大约延时450ms	
		}	
	}		
}

六、总结

今天主要讲了51最小系统和基于51单片机的流水灯的proteus仿真。

感谢你的观看!

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xiaobuding_QAQ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值