51单片机那点儿事_从LED开始

来源:互联网 发布:packet tracer mac版 编辑:程序博客网 时间:2024/05/16 08:05

又要从51开始学单片机了,突然感觉到学习最痛苦的不是学不会,而是学会了容易忘,忘了还得重头翻书学。所以呢,这次决定留下点儿学习笔记,也方便以后查看。实验用的是普中科技的6800EM3单片机开发板,不出意外的话会有C语言和汇编两个版本的例程。

上面是LED的电路原理图。

C语言(实现简单的所有灯的间隔,同时亮灭)

#include <reg51.h>void delay();main(void) {while(1) {P2 = 0x00;<span style="white-space:pre"></span>delay();P2 = 0xff;delay();}}void delay(){  unsigned char j;  int i;  for(i = 4000; i>0 ; i--)  for(j = 255; j >0; j--);}

汇编代码(实现流水灯)

ORG 0000HLJMP MAINORG 030H<span style="white-space:pre"></span>;MAIN从0030H处开始MAIN:MOV A, #0FEH<span style="white-space:pre"></span>;00000001,只让D1亮LOOP:MOV P2, AACALL DELAY<span style="white-space:pre"></span>RL A<span style="white-space:pre"></span>;循环左移JMP LOOPDELAY:MOV R5, #25<span style="white-space:pre"></span>;延时函数F1:MOV R6, #100F2: MOV R7, #100DJNZ R7, $DJNZ R6, F2DJNZ R5, F1RETEND
经验总结:

1、在"MOV A, #0FEH"语句中把#号和F前的0丢掉,导致灯全亮,且不变

2、汇编的转移指令总结:

1)无条件转移指令:

LJMP addr16 :长转移;3字节指令,范围是64k

AJMP addr11 :绝对转移;2字节指令;低字节8位,高字节低5位;执行过程是用11位地址替换当前PC的低11位,所以范围是2k

SJMP rel:短转移;2字节指令;范围是-128~127k

JMP @A+DPTR :变址寻址转移

2)条件转移指令:

减一条件指令:DJNZ Rn/direct rel;注意操作数;指令的操作是Rn和direct的内容减一,如果结果不是0,则转移,是0则按顺序执行

累加器到零转移指令:JZ/JNZ rel;JZ是当(A)=0,则转移,否则顺序执行,JNZ相反

比较转移指令:CJNE 有3个操作数第一个操作数减去第二个操作数,若为零则不转移,小于/小于零CY置1/0,并且转移(第3个操作数为rel)

3)位控制转移:

以CY为条件的转移指令:JC/JNC rel,CY是0/1时转移

以位状态为条件的转移指令:JB/JNB/JBC bit,rel,JBC的含义是该位是零时转移并且清零

3、汇编延时的计算:使用的振荡频率是12MHZ,一个机器周期为1微秒,一个DJNZ语句的执行需要两个机器周期,则延长时间是100*100*25*2微秒=0.5秒(只是大概估算)

4、调用子程序的指令有ACALL和LCALL两种分别是11位的绝对转移和16位的转移;返回指令也有两种:RET和RET1,分别是一般子程序的返回和中断程序的返回

0 0