1、相关程序的下载
keil下载请参照链接:
Edsim51、PZ-ISP工具软件在网盘链接中
链接: https://pan.baidu.com/s/1mS69QF4MiQwLVbWuK-_pfA?pwd=dv3f 提取码: dv3f
2、流水灯
C语言和汇编语言在编写流水灯代码时都有一个延迟函数
延迟函数:用来为LED灯连续闪烁提供时间间隔
而且对于俩种语言,延迟函数都是通过多次循环来控制的时间,所以实现起来代码内容都相差不大
首先是C语言的流水灯代码
#include <reg51.h>
#include <intrins.h>
void delay_ms(int a)
{
int i,j;
for(i=0;i<a;i++)
{
for(j=0;j<1000;j++) _nop_();
}
}
void main()
{
P1=0xFE;
while(1){
delay_ms(50);
P1 = (P1 << 1) | (P1 >> 7);
}
}
如果想右移的话,将循环内部改为P1 = (P1 >> 1) | (P1 << 7);就行
建立程序后记得勾选keil中hex的生成选项
然后把新建文件改成.c文件并编译,后台就会出现hex文件
然后将edsim打开,点击load找到之前生成的hex文件打开再运行,就可以检测大致闪烁时间与效果粗阅了
那我们接下来再打开PZ-ISP,将程序烧录进51开发板内
不过在此之前我们得将代码中所有的P1改为P2再编译,因为根据51开发板的使用说明,led模块在P2端口处
烧录过程,在打开文件按钮找到生成的hex文件,然后给板子通电,再点击程序下载
效果如下
接下来是汇编语言
首先建立汇编语言代码文件
ORG 0100H
MOV A,#0x7F
LOOP:
MOV P1,A
LCALL DELAY //调用延迟函数
RR A
AJMP LOOP
DELAY: //8*250*250*2=1000000us=1s,一秒的延时函数
MOV R7,#8
D1: MOV R6,#250
D2: MOV R5,#250
D3: DJNZ R5,D3
DJNZ R6,D2
DJNZ R7,D1
RET
RR是右移,左移我暂时还没找到方法,有建议请指出
然后编译,Edsim验证,ZP-ISP烧录,和上面步骤相同。
3、查表法
举个例子,如果我们要求一个个位数的平方为多少,该怎么设计汇编程序
思路:个位数有10个,0~9,我们可以直接算出着9个数字的平方并存入RAM中,求该平方数的时候调用。
那么我们可以设计这么一个子程序
LLL:PUSH DPH
PUSH DPL
MOV DPTR,#TAB1
MOVC A,@A+DPTR
POP DPL
POP DPH
RET
TAB1:DB 00H,01H,04H,09H,10H,19H,24H,31H,40H,51H
上俩行PUS为保存现有的指令
下俩行POP为读取保存的指令,着4条指令是为的是子程序执行时不会影响主程序
接下来我们验证一下,将下代码写到Edsim中,然后编译
ORG 0100H
LOOP:
MOV A,#03H
LCALL LLL
MOV R0,A
WHILE1:
AJMP WHILE1
LLL:PUSH DPH
PUSH DPL
MOV DPTR,#TAB1
MOVC A,@A+DPTR
POP DPL
POP DPH
RET
TAB1:DB 00H,01H,04H,09H,10H,19H,24H,31H,40H,51H
这就是查表法的用法,但用途还有许多,欢迎留言讨论