用不同类型的代码实现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函数的指令的下一条指令。

四、总结

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

  • 19
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值