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


一、前言

最近在整理资料的时候,偶然发现了以前大学学习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仿真。

感谢你的观看!

在这里插入图片描述

300个C51单片机设计proteus仿真源码软件源码: 100000秒以内的计时程序 10秒的秒表 12864LCD图形滚动演示 128X64LED 160128LCD图文演示 1602字符液晶滚动演示程序 1602液晶显示的DS1302实时时钟 16×16点阵(滚动显示) 16×16点阵2(滚动显示) 2io5键盘模拟音量数码管显示 2×20串行字符液晶演示 32x16汉字 44行列键盘 485全双工通信 4×4键盘矩阵控制条形LED显示 4个独立式按键控制LED开关 4个独立式按键控制LED移位 4只数码管滚动显示0~3 555可调PWM发生器 555的应用 6264扩展内存 6个16×16点阵 74HC154译码器应用 74HC595 74HC595串入并出芯片应用 74LS138译码器应用 74LS148扩展中断 8051双机通信简例 8255并行口扩展实例 89C51PWM 8x8LED汉字显示 8x8点阵做的贪吃蛇游戏 8×8LED点阵屏显示数字 8只数码管同时显示不同字符 8只数码管显示多个不同字符 8只数码管滚动显示8~F 8只数码管滚动显示单个数字 8只数码管滚动显示数字串 8只数码管闪烁显示 8通道自动温度检测系统仿真(含原程序) ADC0808 PWM实验 ADC0809模数转换与显示 ADC0832模数转换与显示 AT89C51对直流电动机的驱动 AVR_Uart BCD译码数码管显示数字 c51 可预设电压的数控电源(功能强大) clock Conter CPU控制的独立式键盘扫描实验 da、ad。液晶,传递函数模型综合应用的实例 DIY51式数控电源 DS1621温度传感器实验 ds18b20 DS18B20温度传感器实验 DS18B20温度检测及其液晶显示 HorseLight I2C IIC-24C04与数码管 IIC-24C04与蜂鸣器 INT0与INT1中断计数 INT0中断3位计数 INT0及INT1中断计数 INT0和INT1控制条形LED INT1中断5位计数 IO并行口直接驱动单个数码管 K1-K4 分组控制LED K1-K4 控制LED移位 K1-K4 控制数码管加减演示 K1-K4 控制数码管移位显示 K1-K4 键状态显示 key_lcd ks0108 液晶12864 LCD频率计仿真 LED代码查询V1[1].1 LED模拟交通灯 LED闪烁 M16_AN_Compare M16_EEPROM M16_Horse MAX7221控制数码管动态显示 my16key_c NT0中断控制LED NT0中断计数 NumberDisplay P3口流水灯 PCF8574 PCF8583+LCD1602 PCF8591模数与数模转换实验 proteus ADDC的练习程序 PWM PWMLED PWM控制LED的亮度仿真程序 PWM控制马达的方法 PWM波输出(可调) PWM电机正反转 pwm程序实例 PWM调温 RAM扩展练习 sscom32串口调试 TIMER0与TIMER1控制条形LED TIMER0控制LED二进制计数 TIMER0控制单只LED闪烁 TIMER0控制四只LED滚动闪烁 TIMER0控制流水灯 ULN2803 usart_t 《lcd1602仿真实例》 一个数控直流稳压电源 一个步进电机的仿真 一步一步教你51_PC串口通信 万能逻辑电路实验 三机通讯 串口仿真mcu_pc 串口方式1 串行数据转换为并行数据 交通灯 从左到右的流水灯 光藕隔离驱动电机 内部函数intrins.h应用举例 净水控制器仿真电路 刚做好的十个字的led屏模拟有程序 包含单片机寄存器的头文件 单只按键控制单只数码管滚动显示 单只数码管循环显示0-9 单只数码管循环显示0~F 单片机与PC机串口通讯仿真 单片机之间双向通信 单片机向PC发送数据 单片机向主机发送字符串 单片机接收PC发出的数据 单片机控制的电动自行车驱动系统 单片机数据发送程序 发一个用定时器做的PWM 基于1602+ds12b80+ds1302+音乐+电子书+流水灯的多功能电子表 基于ADC0832的数字电压表 基于AT24C02的多机通信 基于AT89C51+MAX7219的频率计 proteus仿真电路图 实际硬件电路测试通过 基于DS1302的日历时钟 基于yjwpm测试过的DS18B20仿真实例 多功能电子钟 多点温度测量 多路开关状态指示 大屏幕仿真 子电路做的一个H型电机驱动电路 字符串函数string.h应用举例 字符函数ctype.h应用举例 宏定义应用举例 定时器中断控制的独立式键盘扫描实验 定时器控制交通指示灯 定时器控制数码动态显示 定时器控制数码管动管显示 对I2C总线上挂接多个AT24C0
### 使用 Proteus 进行汇编语言编程实现微机课程设计中的彩灯控制器 #### 设计概述 在微机原理与接口技术课程设计中,利用Proteus软件进行仿真和测试是一个常见的实践方式。通过编写特定的汇编程序来控制LED灯的状态变化可以很好地展示学生对于硬件电路以及低级语言的理解能力[^1]。 #### 软件环境搭建 为了完成此项目,在开始之前需要安装好Keil C51作为开发工具用于编辑、编译汇编源文件;同时也要准备好最新版本的Proteus ISIS以便于构建虚拟实验平台并加载由前者产生的HEX文件来进行联合调试工作[^2]。 #### 硬件连接说明 在一个典型的基于8051单片机系统的彩灯控制系统里,通常会采用如下元件构成基本框架: - **MCU (Microcontroller Unit)**: 如AT89C51/52等型号。 - **电阻**: 限流作用,保护发光二极管免受过大电流损害。 - **电容**: 去耦合滤波用途。 - **晶体振荡器及时钟网络组件**. - **多个LED指示灯**, 它们将被用来显示不同的灯光效果模式. 这些器件之间按照标准电气工程规范相互联接形成完整的物理结构图,并可在Proteus内绘制出来供后续操作使用[^3]. #### 编写汇编代码实例 下面给出一段简单的循环点亮八个不同颜色LED灯泡的例子,该段代码可以在上述提到过的IDE环境中创建新工程项目后输入进去: ```assembly ORG 0H ; 设置程序起始地址为0 START: MOV P1,#0FFH ; 初始化P1口全部置高,关闭所有led LOOP: CLR A ; 清零累加寄存器A MOV R7,#08H ; 将立即数8送入R7作计数值 NEXTBIT: RL A ; 左移一位使最低位依次变为1 MOV P1,A ; 输出到端口p1上驱动对应的led亮灭状态改变 ACALL DELAY ; 调用延时子函数保持当前显示一段时间再继续下一个动作 DJNZ R7,NEXTBIT ; 如果r7不等于0则跳转回nextbit重复执行直到遍历完所有的位置 SJMP LOOP ; 返回loop重新开始一轮新的序列播放过程 DELAY: MOV R6,#25 ; 外层循环次数定义 DLY_LOOP1: MOV R5,#248 ; 内层循环参数设定 DLY_LOOP2: DJNZ R5,DLY_LOOP2; 减一判断是否结束内部等待周期 DJNZ R6,DLY_LOOP1; 同理对外部也做相同处理直至满足条件退出整个延迟环节返回主流程调用处 RET ; 子程序结束标志符表示此处可安全返回至上一层指令所在位置接着往下运行其他部分逻辑功能模块 END ; 结束标记告诉编译器这里就是全文最后一句有效语句了 ``` 这段程序实现了从左至右逐个点亮八盏LED的效果,每次只有一盏灯处于开启状态而其余均熄灭,从而营造出流水线式的视觉感受[^4].
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

xiaobuding_QAQ

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

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

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

打赏作者

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

抵扣说明:

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

余额充值