实验3.1 P1 口作输出口,接八只发光二极管,编写程序,使发光二极管循环点亮。(采用软件延时的方法)
本次实验开始都将采用汇编和C语言两种方式编写程序,同时提高汇编能力和C语言能力。
以下是汇编程序:
ORG 0000H
JMP START
START:
MOV P1,#01H
F:
CALL D500
MOV A,P1
RL A
MOV P1,A
SJMP F
D500: ;这里的延时程序是单片机小精灵写的,我个人写的误差相对大一点,但是影响也不是特别大,这个的话误差非常小。
MOV R7,#0A7H
DL1:
MOV R6,#0ABH
DL0:
MOV R5,#10H
DJNZ R5,$
DJNZ R6,DL0
DJNZ R7,DL1
NOP
RET
C语言程序:
#include<reg51.h>
#include<intrins.h>
uchar a=0;
void delay1s(void)
{
unsigned char a,b,c;
for(c=167;c>0;c--)
for(b=171;b>0;b--)
for(a=16;a>0;a--);
_nop_(); //if Keil,require use intrins.h
}
main(){
P1=0x01;
while(1){
a=P1;
a<<=1;
if(a==0){
a++;
}
P1=a;
delay1s(); //该程序也是单片机小精灵写出来的,我个人认为因为不知道C语言一个语句执行多久,所以不好写C语言的软件延时程序。
}
}
后来我用Keil看了这个C语言程序的反汇编,发现那个延时子程序的汇编代码跟上面那个汇编程序的延时程序的代码一样,所以可以知道如果要用C语言写演示程序,尽量保持这种for循环嵌套,然后一定要是从初值减到0就好啦。
实验3.2 P1作输入口,将开关的状态反映在发光二极管上。
这里的内容其实是单片机实验的教材上面的,我一开始理解的题目不是这样的,因为之前教材上面也有类似的题目,但是是用四个开关控制四个灯泡,因为P1口就只有8个口,所以不能实现8个开关控制8个灯,但是好像P1口是准双向口,既可以输入,又可以输出。
汇编程序:
ORG 0000H
LJMP START
ORG 0040H
START:
MOV DPTR,#8700H ;这里的8700H好像是实验室单片机的并行输出口的地址,并不是所有的单片机都是这个。
MOV P1,#0FFH
READP1:
MOV A,P1
MOVX @DPTR,A
AJMP READP1
END
C语言程序:很简单,直接可以赋值搞定
#include<reg52.h>
#include<absacc.h>
#define D XBYTE[0x8700]
main(){
while(1){
D=P1;
}
}
这里另外也附上与潘老师的单片机对应的汇编程序
ORG 0000H
LJMP START
ORG 0040H
START:
MOV A,P3
MOV P1,A
SJMP START
END
单片机上有个8位独立键盘,对应的P3端口的各个位置,所以每次都读P3然后输出给P1就好了
C语言程序:
#include<reg52.h>
main(){
while(1){
P1=P3;
}
}