单片机实验一 输入输出端口控制实验 - 图文

更新时间:2024-04-10 13:48:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

昆明理工大学信息工程与自动化学院学生实验报告

( 2014 — 2015 学年 第 2 学期)

课程名称:嵌入式技术 开课实验室:信自楼402 2015年4月21日

年级、专业、班 计科122 学号 201210405204 实验项目名称 姓名 邹华宇 指导教师 成绩 江虹 实验一 单片机输入输出端口控制实验 该同学是否了解实验原理: A.了解□ B.基本了解□ C.不了解□ 教 该同学的实验能力: A.强 □ B.中等 □ C.差 □ 该同学的实验是否达到要求: A.达到□ B.基本达到□ C.未达到□ 师 实验报告是否规范: A.规范□ B.基本规范□ C.不规范□ 评 实验过程是否详细记录: A.详细□ B.一般 □ C.没有 □ 语 教师签名: 年 月 日 一、实验目的

1、熟悉μ Vision的使用方法及工程项目开发过程。 2、掌握C51程序设计方法。

3、掌握89C51单片机I/O的控制方法。

二、实验原理

所谓通用I/O,也记为GPIO(General Purpose I/O),即基本的输入/输出,有时也称并行I/O,或普通I/O,它是I/O的最基本形式。电源(Vcc)代表高电平,对应数字信号“1”;地(GND)代表低电平,对应数字信号“0”。作为通用输入引脚,MCU内部程序可以通过端口寄存器读取该引脚,知道该引脚是“1”(高电平)或“0”(低电平),即开关量输入。作为通用输出引脚,MCU内部程序通过端口寄存器向该引脚输出“1”(高电平)或“0”(低电平),即开关量输出。大多数通用I/O引脚可以通过编程来设定工作方式为输入或输出,称之为双向通用I/O。

1、上拉下拉电阻与输入引脚的基本接法

芯片输入引脚的外部有三种不同的连接方式:带上拉电阻的连接、带下拉电阻的连接和“悬空”连接。通俗地说,若MCU的某个引脚通过一个电阻接到电源(Vcc)上,这个电阻被称为“上拉电阻”。与之相对应,若MCU的某个引脚通过一个电阻接到地(GND)上,则相应的电阻被称为“下拉电阻”。这种做法使得,悬空的芯片引脚被上拉电阻或下拉电阻初

1

始化为高电平或低电平。根据实际情况,上拉电阻与下拉电阻可以取值在1KΩ~10KΩ之间,其阻值大小与静态电流及系统功耗相关。

图1给出了一个MCU的输入引脚的三种外部连接方式,假设MCU内部没有上拉或下拉电阻,图中的引脚I3上的开关K3采用悬空方式连接就不合适,因为K3断开时,引脚I3的电平不确定。在图1中,R1>>R2,R3<

2.输出引脚的基本接法

作为通用输出引脚,MCU内部程序向该引脚输出高电平或低电平来驱动器件工作,即开关量输出。如图2所示。

一种接法是O1引脚直接驱动发光二极管LED,当O1引脚输出高电平时, LED不亮;当O1引脚输出低电平时,LED点亮。这种接法的驱动电流一般在2mA~10mA。

另一种接法是O2引脚通过一个NPN三极管驱动蜂鸣器,当O2脚输出高电平时,蜂鸣器响;O2脚输出低电平时,蜂鸣器不响。这种接法的驱动电流可达100mA左右,而O2引脚控制电流可以在几个mA左右。

若负载需要更大的驱动电流,就必须另外的驱动电路,但对MCU编程来说,没有任何影响。

2

89C51单片机共有4个准双向的8位并行I/O端口,分别记为P0、P1、P2、P3,其中输出锁存器属于特殊功能寄存器。端口的每一位均由锁存器、输出驱动器和输入缓冲器组成,这些端口除了按字节输入输出外,还可以按位寻址,便于位控功能的实现。

4个I/O口中,P0、P2口为双功能端口,当单片机片外扩展存储器时,P0口作为单片机系统复用的地址/数据总线使用,P2口用作地址总线;P1口是单功能的I/O口,引脚输入时,必须先向锁存器写1;由于51单片机的引脚数目有限,因此在P3口电路中增加了引脚的第二功能。

三、实验内容

实验板电路原理如图3所示。

用P1口作为输出口,接8位用作逻辑电平显示的发光二极管。

做单一灯的左移/右移,8个发光二极管分别接在单片机的P1.0~P1.7端口上,输出“0”时,发光二极管亮,开始时按P1.0->P1.1->?->P1.7的顺序依次点亮LED,再按P1.7->P1.6->?->P1.0的顺序依次点亮LED,重复循环。

3

四、实验步骤

1、按实验要求在μ Vision中创建项目,编辑、调试、编译程序。 A 创建项目:注意文件为.c文件。

B 选择选择Device为AT89C52。

C 添加文件。

4

D 编辑、编译程序

#include

#define uInt16 unsigned int

unsigned char code table[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; void DelayMS(uInt16 Z) {

uInt16 uiVal,ujVal;

for(uiVal=0;uiVal

for(ujVal=0;ujVal<113;ujVal++); }

void main() {

int i ;

for (i=0;i<8;i++) {

P1=table[i]; DelayMS(1000) ; }

for (i=7;i>0;i--) {

P1=table[i]; DelayMS(1000) ; } }

2、将编译生成的目标码文件(后缀为.Hex)下载到实验板上。 A 编译生成的目标码文件(后缀为.Hex)。

5

B 将编译生成的目标码文件传入实验板中。

再打开stc-isp-15xx-v6.84C.exe 选择STC89C51RC系列的STC89C52RC/LE52RC后 打开程序文件

3、观察实验运行结果并记录。

6

五、思考

设计程序使发光二极管间隔300ms先奇数亮再偶数亮,循环3次;一个发光二极管亮上下循环3次;两个分别从两边向中间流动3次;再从中间向两边流动3次;8个全部闪烁3次;关闭全部发光二极管,停止。

#include

#include

#define uint unsigned int #define uchar unsigned char uchar tmp;

uchar code table[]={0x7e,0xbd,0xdb,0xe7}; void delay(unsigned int m) {

uint i,j;

for(i=m;i>0;i--)

for(j=110;j>0;j--); }

void main() {

uint i,j; P1=0;

for(i=3;i>0;i--)//第一步 {

P1=0x55; delay(300); P1=0xaa;

7

delay(300); }

tmp=0xfe;//第二步 for(j=3;j>0;j--) {

for(i=7;i>0;i--) {

P1=tmp; delay(300);

tmp=_crol_(tmp,1); }

for(i=7;i>0;i--) {

P1=tmp; delay(300);

tmp=_cror_(tmp,1); } }

for(i=0;i<3;i++)//第三步 {

for(j=0;j<4;j++) {

P1=table[j]; delay(300); } }

for(i=0;i<3;i++)//第四步 {

for(j=0;j<4;j++) {

P1=table[3-j]; delay(300); } }

for(i=0;i<3;i++)//第五步 {

P1=0xff;

delay(300); P1=0;

delay(300); } P1=0xff; while(1); }

8

六、实验总结

第一次做单片机的实验,在老师的指导和讲解下,我开始对Keil C51有了一定的了解和熟悉。经过这个试验我按实验要求在KeilC中创建项目,并开始将编译生成的目标码文件(后缀为.Hex)传入实验板中。初步掌握 89C51单片机 I/O的控制方法。

通过本次的实验充分了解了单片机的输入输出端口如何控制,了解了控制单片机输入输出端口的基本控制方法,但是实验中还是有一些不明白的地方,在单片机C语言的编写中,循环时用“>=”会出现未知的错误。在程序的最后必须要用一个死循环,因为不知道单片机执行完main函数后走向哪里,用死循环以防执行到未知的地方。

9

本文来源:https://www.bwwdw.com/article/qcur.html

Top