用不同类型的代码实现51单片机小灯泡的点亮

一、Proteus的使用

1.如何创建工程

(1)有两种方法可以创建一个新的工程,如图所示。

(2)输入工程名字、选择工程保存的路径,下方的选项选择New Project,随后点击Next。

(3)创建原理图选择Create a schematic from selected template,默认选择 DEFAULT ,再点击 Next 。(如果不需要创建原理图,可以勾选 Do not create a schematic)

(4)创建 PCB选择Create a PCB layout from the selected template,默认选择 DEFAULT ,再点击 Next 。(如果不需要创建PCB,可以勾选Do not create a PCB layout)

(5)连续点击 Next 。

(6)勾选 Create Fireware Project ,选择芯片 AT89C51 ,再点击 Next 。

(7)最后点击Finish

(8)创建效果

源代码窗口:

PCB窗口:

原理图窗口:

2.界面简介

下面要介绍的就是原理图设计窗口界面的一些功能区域和各个工具的作用。

(1)原理图编辑窗口:用于绘制原理图的。元件需要放进蓝色方框内,可通过鼠标滚轮来缩放视图。
(2)预览窗口:会呈现一个当前原理图的整体状况。

(3)模型选择工具栏:

主要模型:

  • 用于即时编辑元件参数(先单击该图标,再单击要修改的元件)
  • 选择元件
  • 放置连接点
  • 放置标签(备注)
  • 放置文本
  • 用于绘制总线
  • 用于放置子电路

配件:

  • 终端接口:有VCC、地、输出、输入等接口
  • 器件引脚:用于绘制各种引脚
  • 仿真图标:用于各种分析
  • 录音机
  • 信号发生器
  • 探针
  • 虚拟仪表:有示波器等

仿真测试按钮:

  • 运行
  • 单步运行
  • 暂停
  • 停止运行

二、汇编指令点亮一个LED灯

1.电路图

分析:在绘制电路图的画纸左边放置一块AT89C52芯片,由于目的为汇编代码点亮一个LED小灯泡,所有我们选择使用P2引脚来控制小灯泡的亮灭,将LED连接在芯片的P2.0处,右方接地,即当P2.0为高电平时,二极管导通小灯泡被点亮。

2.汇编程序代码

ORG 0100H
SETB  P2.0
SJMP $        
                
END 

代码分析:

ORG 0100H这是一个指令,用于设置程序的起始地址。在这里,它将程序的起始地址设置为0x0100(十进制的256)。
SETB P2.0这条指令设置芯片的P2端口的第一个引脚(P2.0)。SETB是"Set Bit"的缩写,表示设置指定位的值为1。这行代码将P2.0引脚的值设置为高电平1。
SJMP $这是一个无条件跳转指令,它会使程序跳转到当前指令的地址。在这里,$符号表示当前指令的地址,所以这条指令实际上是一个无限循环,导致程序不断地执行SETB P2.0这条指令。

三、实现LED流水灯

1.C语言实现LED流水灯

1)电路图

分析:在绘制电路图的时候,我们在画纸的左边放置一块AT89C51芯片,此处我们选用P0引脚的八个端口来控制8个LED小灯泡来实现LED的流水灯,从P0的八个端口引出线路连至总线上,总线的右端引出对应的8根线连接LED小灯泡并串联保护电阻(300Ω),最终聚于同一个节点接入VCC电源,即当对应的P0引脚端口输出低电平0时,二极管导通小灯泡被点亮。

2)C语言代码

#include <REGX52.H>
void Delay1ms(unsigned int xms)		//@12.000MHz
{
	unsigned char i, j;
	while(xms)
	{
		i = 2;
		j = 239;
		do
		{
			while (--j);
		} while (--i);
		xms--;
	}
}

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

代码分析:代码第一段是Delay的延时函数,可以自主选择延时时长。下面是代码的主函数部分通过对P0口赋予8位二进制数来控制每个端口的小灯泡亮灭,例如P0=0xFE是一个十六进制数对应的二进制数为1111 1110,即给P0.0端口赋予低电平0,其他端口赋予高电平1,此时第一个LED灯被点亮以此类推,然后通过延时函数来实现8个小灯泡的亮暗的间断时间。

2.汇编代码实现LED流水灯

1)电路图

分析:相较于上方的C语言实现LED流水灯的电路图此电路图没有采用总线来连接端口和LED,其余原理相同。但是此处用的是芯片的P2引脚。

2)汇编程序代码

MAIN:
    MOV P2, #11111110B
    LCALL DELAY
    MOV P2, #11111101B
    LCALL DELAY
    MOV P2, #11111011B
    LCALL DELAY
    MOV P2, #11110111B
    LCALL DELAY
    MOV P2, #11101111B
    LCALL DELAY
    MOV P2, #11011111B
    LCALL DELAY
    MOV P2, #10111111B
    LCALL DELAY
    MOV P2, #01111111B
    CALL DELAY
LJMP MAIN
 
 
DELAY:
    MOV	R7, #3	
    D1:
    PUSH 30H
    PUSH 31H
    MOV 30H, #180
    MOV 31H, #68
    NEXT:
    DJNZ 31H, NEXT
    DJNZ 30H, NEXT
    POP 31H
    POP 30H
    DJNZ R7, D1
    RET
END

代码分析:

主函数部分:    

MOV P2, #11111110B将二进制数11111110B(十六进制的0xFE)写入P2口,其中P2口的每一位对应一个LED灯的亮灭状态。
LCALL DELAY调用延时函数DELAY,用于产生延时。下方进行不同的端口赋值依次类推,将不同的二进制数写入P2口,每次改变一个LED的状态。
LJMP MAIN无条件跳转到主程序的起始位置,实现循环。

延时函数部分:

 MOV    R7, #3将立即数3加载到寄存器R7中,作为延时循环的计数器。
D1定义一个标签D1,用于延时循环的跳转。
PUSH 30H和PUSH 31H将30H和31H的值分别压入堆栈,保存当前的状态。
MOV 30H, #180和MOV 31H, #68将立即数180和68加载到寄存器30H和31H中,作为内部延时循环的计数器。
NEXT定义一个内部标签NEXT,用于内部延时循环的跳转。
DJNZ 31H, NEXT和DJNZ 30H, NEXT分别对31H和30H的值进行递减并判断是否为0,若不为0则跳转到标签NEXT处,实现内部延时。
POP 31H和POP 30H将堆栈中保存的值弹出到寄存器31H和30H中,恢复之前的状态。
DJNZ R7, D1对R7的值进行递减并判断是否为0,若不为0则跳转到标签D1处,实现外部延时循环。
RET返回调用DELAY函数的指令的下一条指令。

四、总结

        通过本次实验让我加深对汇编程序代码的理解、加强编写能力。进一步熟悉进制转换。

### 回答1: 新建一个51单片机程序,在程序里面定义LED灯泡的电平,然后让它循环: MOV P1,#80h MOV P2,#00h Again: SETB P1.0 ACALL DELAY CLR P1.0 ACALL DELAY SJMP Again DELAY: MOV R1,#0FFh Again1: DJNZ R1,Again1 RET ### 回答2: 要使用51单片机点亮LED灯泡,需要进行如下操作: 1. 首先,需要将LED灯泡连接到单片机的GPIO引脚上。假设我们将LED连接到P1^0引脚上。 2. 然后,需要对P1^0引脚进行初始化设置,使其成为输出模式。这样才能通过控制引脚的电平来点亮或熄灭LED。可以使用以下代码进行初始化设置: ```c #include <reg52.h> sbit LED = P1^0; // 将P1^0引脚定义为LED void Init() { LED = 0; // 先将LED置为低电平 } ``` 3. 接下来,可以通过控制引脚的电平来点亮或熄灭LED。可以使用以下代码点亮LED: ```c void TurnOnLED() { LED = 1; // 将LED引脚置为高电平 } ``` 使用以下代码来熄灭LED: ```c void TurnOffLED() { LED = 0; // 将LED引脚置为低电平 } ``` 通过调用`TurnOnLED()`函数和`TurnOffLED()`函数,即可实现点亮和熄灭LED的操作。 4. 最后,需要在主函数中调用初始化函数和点亮LED函数,使代码能够执行。可以使用以下代码: ```c void main() { Init(); // 初始化设置 TurnOnLED(); // 点亮LED while(1) { // 在这里可以进行其他的操作 } } ``` 在主函数中,首先调用初始化函数进行设置,然后调用点亮LED函数,之后可以在`while(1)`循环中进行其他的操作。 通过以上步骤和代码,就可以实现使用51单片机点亮LED灯泡的功能。 ### 回答3: 51单片机是一种广泛使用的微控制器,使用C语言可以编写点亮LED灯泡代码。下面是一段简单的51单片机点亮LED灯泡代码: #include <reg51.h> // 包含51单片机的头文件 sbit LED = P1^0; // 将P1口第0位定义为LED引脚 void Delay(unsigned int t) // 延时函数 { unsigned int i, j; for(i = t; i > 0; i--) for(j = 110; j > 0; j--); } void main() // 主函数 { while(1) // 无限循环 { LED = 0; // 点亮LED灯,将LED引脚置为低电平 Delay(1000); // 延时1秒 LED = 1; // 熄灭LED灯,将LED引脚置为高电平 Delay(1000); // 延时1秒 } } 以上代码使用P1口的第0位作为LED引脚,通过改变LED引脚的电平状态来控制LED灯的点亮和熄灭。代码中的Delay函数通过循环方式实现延时,用于控制LED灯点亮和熄灭的时间间隔。主函数中使用while循环让LED灯不断闪烁。其中,LED = 0表示将LED引脚置为低电平,点亮LED灯;LED = 1表示将LED引脚置为高电平,熄灭LED灯。通过调整Delay函数中的参数可以控制LED灯点亮和熄灭的间隔时间。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值