单片机实验三

实验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;
    }
}
  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值