单片机Proteus软件仿真一(手把手教你实现LED流水灯)

1 单片机8051系列

爬虫是不能发了,审核总是不通过,算了,发点其他的。

51单片机是对兼容英特尔8051指令系统单片机的统称。51单片机广泛应用于家用电器、汽车、工业测控、通信设备中。因为51单片机的指令系统、内部结构相对简单,所以国内许多高校用其进行单片机入门教学。

2 proteus,keil C

有的同学学习单片机是买开发板来做的,很便宜,能看得见实物。当然不买开发板也是可以的,通过Proteus仿真来实现,效果是一样的。

安装keil C软件如果要破解的话,需要关闭杀毒软件。

3 Proteus构建51单片机最小系统

3.1、新建工程

打开新建工程,在相关文件夹下新建个工程文件夹,flashled。

  

这里可以选择没有固件项目,也可以选择创建固件项目,编译器如果用的是汇编,就选择ASEM-51,如果用C语言,需要选keil,因为安装的keil有C编译环境,如果你的软件没有则点编译器,检查全部。(需要先安装keil,我装的是uvision5)

然后下一步结束新建工程。

3.2、放置原件

首先需要绘制原理图,刚开始确实有点手生,操作不太顺,正常,等练多了,就快了。我们需要画一个单片机最小系统。这个和微机原理中的8086类似,但比8086要简单些,因为8051是微控制器,内存,定时器等都集成到CPU内部,8086是微处理器,仅有CPU,外部电路图要复杂些。

我们需要放置必备的元器件构成单片机最小系统,这个在其他项目里面直接复制也可以。

 点确定之后电路图左边就会有这个器件,然后选中放到sheet里面就可以了。

3.3、构建最小系统

 

 如果要放置一个节点,右键选择放置-终端-有电源有接地,单片机最小系统电源和接地引脚不用管了,都是默认接好的,因此从图上看不到这2个引脚。

3.3.1 复位电路

单片机复位时RST要保持2个机器周期以上的高电平,这个地方接的电阻不能过大,正常工作时为低电平,当按下按键电源给高电平,完成复位,电容充满电后的作用为隔断电源。

3.3.2 时钟电路

在51单片机片内有一个高增益的反相放大器,反相放大器的输入端为XTAL1,输出端为XTAL2,由该放大器构成的振荡电路和时钟电路一起构成了单片机的时钟方式。

4 LED流水灯

这个是最常用的仿真实验,主要是对P口的输出信号,一般都是共阳极,给低电平点亮。如果共阴极高电平点灯则电流小,驱动不够。这共阳极接上拉电阻,阻值低则LED越亮,但是不能太低,太低则输出态为高阻态。51单片机的P0口是一个OC门输出的I/O口,所以要加上拉电阻才能有电平输出,在PROTEUS里的蓝色为低电平,红色为高电平,灰色则是高阻态,如果不是P0口,则不需要上拉电阻。

P0口第一个功能是数据接口,第二个功能是地址低八位,P2口第二个功能是地址高八位。另外除了P0口没有内部上拉电阻外,其他三个都有内部上拉电阻。

绘图的时候有个坑大家注意:用proteus画仿真图时,元件的每个引脚都必须有一段导线与其它元件或电路相连才行,不能用引脚直接连接。所有LED都有一个结点,这样才行的。不然中间6个LED灯不亮。

5 C程序

C程序比较简单,这里面要引用reg51.h头文件,也可以引用REGX52头文件也是可以的,51头文件是proteus自带的,52的头文件需要另外添加到工程里面。还有个延时程序,_NOP_,这个可以在程序前面自己定义,也可以引用头文件的定义,执行Nop指令只使程序计数器PC加1,所以占用一个机器周期。

#include <reg51.h>
void   _nop_  (void);
void Delay500ms()		//@12.000MHz
{
	unsigned char i, j, k;
	_nop_();
	i = 4;
	j = 205;
	k = 187;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}


void main()
{
	while(1)
	{
		P0=0xFE;//1111 1110
		Delay500ms();
		P0=0xFD;//1111 1101
		Delay500ms();
		P0=0xFB;//1111 1011
		Delay500ms();
		P0=0xF7;//1111 0111
		Delay500ms();
		P0=0xEF;//1110 1111
		Delay500ms();
		P0=0xDF;//1101 1111
		Delay500ms();
		P0=0xBF;//1011 1111
		Delay500ms();
		P0=0x7F;//0111 1111
		Delay500ms();
	}
}

 1、延时程序的时间可以改进,通过函数的参数来控制时间,循环控制,基本的时间如1ms可以通过软件生成。

void Delay1ms(unsigned int xms)        //@12.000MHz
{
    unsigned char i, j;
    while(xms)
    {
        i = 2;
        j = 239;
        do
        {
            while (--j);
        } while (--i);
        xms--;
    }
}

2、主程序的流水灯也可以 通过循环移位来实现 ,这就不介绍了

6. 演示

  • 21
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Proteus软件中进行51单片机仿真时,我们可以使用8个LED实现一个循环点亮的流水灯效果。具体步骤如下: 1.首先,我们需要在Proteus的工作区中添加一个51单片机,并连接好其供电和晶振。 2.接下来,我们需要添加8个LED,以模拟8个流水灯的效果。将它们连接到单片机的输出引脚上。为了简化连接,我们可以使用一个扩展芯片(如74595)来控制这些LED。 3.对于循环点亮的效果,我们需要在程序中设置一个循环来不断变化LED的亮灭状态。可以通过移位运算来控制LED的亮灭状态。 4.在程序中,我们可以使用一个变量来表示LED的状态,假设取值范围为0-7。通过对该变量的处理,可以实现循环点亮的效果。 5.在Proteus中,我们可以使用Proteus VSM来调试和验证程序的正确性。通过仿真,我们可以观察到LED依次点亮的效果,完成了流水灯的循环显示。 以流水灯以顺序点亮的方式为例,程序的基本思路如下: ``` #include <reg51.h> unsigned char led_status = 1; // 定义一个变量表示LED的状态,初始为第一个LED点亮 void delay(unsigned int t) // 定义一个延时函数 { unsigned int i, j; for (i = 0; i < t; i++) for (j = 0; j < 120; j++) ; } void main() { while (1) { P1 = ~(1 << (led_status - 1)); // 点亮对应的LED,其他LED熄灭 delay(1000); // 延时1秒,控制LED点亮的速度 led_status++; // 将LED状态+1,实现流水灯的效果 if (led_status > 8) led_status = 1; // 当LED状态超过8时,重新从1开始 } } ``` 通过以上的操作步骤和程序设计,我们可以在Proteus实现一个8个LED依次循环点亮的流水灯效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值