单片机实验

  • 实验目的
  1. 掌握P1口、P2口的输入输出的简单的连接与使用方法;
  2. 熟悉由输入对输出进行控制的方法。
  • 实验内容

        仿真部分:参照教材例题5-4进行硬件连接、编程并实现其功能。具体连接关系:P1.0和P1.1引脚接有两只开关s0和s1,两引脚上的高低电平共4种组合,4种组合分别点亮P2.0~P2.3引脚控制的4只LED,即S0、S1均闭合,LEDO亮,其余灭;s1闭合、so打开,LED1亮,其余灭; S0闭合、S1打开,LED2亮,其余灭; S0、S1均打开,LED3亮,其余灭。编程实现此功能。

实物部分:结合开发板的5只按键和8只LED灯的实际连接关系,修改程序并实现其功能。

三、 程序流程图和仿真实验的电路原理图

四、 实验步骤

1. keil5仿真部分:

  1. 用keil5仿真,如下图所示。

2.Proteus仿真部分:

(1)用仿真软件proteus画原理图;

(2)用keil软件编写功能程序并生成hex文件

(3)在仿真软件proteus中进行仿真:

加载(烧写)程序,观察实验现象;

修改程序以使每次只有一个灯亮;

3.实物开发板部分:

(1)开发板实际电路分析

8只LED灯的连接关系:

5只按键的关系:

(2)修改程序

利用实物的按键K1 (已连到P1.4口线)和K2 (已连到P1.5口线)代替开关例题5~4中的

开关so和S1,控制P2口低4位连接的4只LED灯(即不用变) ,修改程序并实现其功能。

4)扩展部分

增加数码管输出(其电路连接关系参见下图),并将2个开关或按键输入的编码

值(0~3) 用数码管显示出来。

开发板数码管连接关系:

开发板数码管实例:

(由于开发板数码管显示问题,导致部分数码管不亮)

  • 程序代码
  1. pretus仿真代码

#include<reg51.h>

main(){

char state;

do{

P1=0xff;

state=P1;

state=state&0x03;

switch(state){

case 0: P2=0xFE; break;

case 1: P2=0xFD; break;

case 2: P2=0xFB; break;

case 3: P2=0xF7; break;

}

}

}

3)修改代码在板子上按键k1k2实现

#include <reg51.h>

#include <intrins.h>

sbit K1 = P1^4; // 定义K1开关引脚

sbit K2 = P1^5; // 定义K2开关引脚

main()

{

       do{

              P1=0xff;

              if(K1 == 0 && K2 == 0) { // S0S1均闭合

            P2=0xfe;

        }

        else if(K1 == 1 && K2 == 0) { // S1闭合,S0打开

            P2=0xfd;

        }

        else if(K1 == 0 && K2 == 1) { // S0闭合,S1打开

            P2=0xfb;

        }

        else if(K1 == 1 && K2 == 1)// S0S1均打开

            P2=0xf7;

       }while(1);

}

4)数码管代码

#include <reg51.h>

#include <intrins.h>

sbit K1 = P1^4; // 定义K1开关引脚

sbit K2 = P1^5; // 定义K2开关引脚

#define uchar unsigned char

#define uint unsigned int

#define out P0

uchar code seg[]={0xc0,0xa4,0x99,0x82};

void delaym(uint j) {

    uchar i;

    for(;j>0;j--)

    {

            i=250;

            while(--i);

            i=249;

            while(--i);

     }

}

void main()

{

     do{

            P1=0xff;

            if(K1 == 0 && K2 == 0) { // S0S1均闭合

            P2=0xfe;

                   out=seg[0];

        }

        else if(K1 == 1 && K2 == 0) { // S1闭合,S0打开

            P2=0xfd;

                   out=seg[1];

        }

        else if(K1 == 0 && K2 == 1) { // S0闭合,S1打开

            P2=0xfb;

                   out=seg[2];

        }

        else if(K1 == 1 && K2 == 1){// S0S1均打开

            P2=0xf7;

                   out=seg[3];

            }

        delaym(100);

     }while(1);

}

  • 实验结果

当程序下载到开发板中时,可以通过K1K2两个按键控制四个灯的亮灭,通过改写,实现不同灯的亮灭;并通过K1,K2在数码管上输出数字1234

八、 实验分析与总结

通过这次实验,让我觉得书上的东西不是一味的照搬就可以实现的,需要理解和明白开发板的原理图,引脚的地方,P接口一定要大写,sbit定义一定要最开始,烧录数码管时,液晶显示器需要拆除,不然引脚重复了,本次实验最大的困难就是开关的改写花了许多时间,数码管的物理条件导致数字不能显示完整。下次实验还得优先预习,找到问题所在,提前发现,提前解决!

  • 22
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TvT<

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值