单片机流水灯实验总结

  • 格式:doc
  • 大小:35.48 KB
  • 文档页数:12

篇一:单片机实验报告——流水灯

电子信息工程学系实验报告

课程名称: 单片机原理及接口

实验项目名称: 实验2 流水灯实验 时间: 2011-10-21 班级: 电信092 姓名:

蔡松亮 学号: 910706247

一、实 验 目 的:

进一步熟悉keil仿真软件、proteus仿真软件的使用。了解并熟悉单片机i/o口和led灯的电路结构,学会构建简单的流水灯电路。掌握c51中单片机i/o口的编程方法和使用i/o口进行输入输出的注意事项。

二、实验原理:

mcs-51系列单片机有四组8位并行i/o口,记作p0、p1、p2和p3。每组i/o口内部都有8位数据输入缓冲器、8位数据输出锁存器及数据输出驱动等电路。四组并行i/o端口即可以按字节操作,又可以按位操作。当系统没有扩展外部器件时,i/o端口用作双向输入输出口;当系统作外部扩展时,使用p0、p2口作系统地址和数据总线、p3口有第二功能,与mcs-51的内部功能器件配合使用。

以p1口为例,内部结构如下图所示:

图 p1口的位结构

作输出时:输出0时,将0输出到内部总线上,在写锁存器信号控制下写入锁存器,锁存器的反向输出端输出1,下面的场效应管导通,输出引脚成低电平。输出1时,下面的场效应管截止,上面的上拉电阻使输出为1。作输入时:p1端口引脚信号通过一个输入三态缓冲器接入内部总线,再读引脚信号控制下,引脚电平出现在内部总线上。

i/o口的注意事项,如果单片机内部有程序存贮器,不需要扩展外部存贮器和i/o接口,单片机的四个口均可作i/o口使用;四个口在作输入口使用时,均应先对其写“1”,以避免误读;p0口作i/o口使

用时应外接10k的上拉电阻,其它口则可不必;p2可某几根线作地址使用时,剩下的线不能作i/o口线使用;p3口的某些口线作第二功能时,剩下的口线可以单独作i/o口线使用。

三、实 验 环 境:

硬件:pc机,基本配置cpu pii以上,内存2g 软件:keil 2, proteus 7.5

四、实 验 内 容

及 过 程:

1、用proteus画流水灯电路图流程:

1)、运行proteus仿真软件,单击pick from libraries,打开搜索元器件窗口,如图 1 所示:

图 1 打开搜索元器件窗口

2)、搜索添加元器件,如图2 所示:

图2 搜索添加元器件窗口

3)、添加元器件,修改元器件的参数,绘制流水灯原理图,元器件参数为c1=c2=20pf、c3=10uf;

r1=r2=r3=r4=r5=r6=r7=r8=470欧姆、r9=10k欧姆;晶振=12m;vcc=5v。总电路图如图 3 所示:

图 3 流水灯电路原理图

2、用keil建项目流程:

1)、运行keil 2软件,启动后,点击project菜单新建项目,新建项目后,选择为at89c51的仿真单片机的型号,单击file选择new新建程序文件,保存后,右击source group1添加入程序文件。

2)、编写程序,右击target 1打开设置输出hex窗口,如图 4 所示:

图 4 打开设置输出hex窗口

3)、设置输出hex文件,勾选上output下的create hex fi:,单击确定保存,运行程序得到hex文件,如图 5 所示:

图5 设置输出hex文件

3、实验内容:

1)、8个led灯从最高位依次点亮,每次只亮一盏灯,依此循环。 新建keil文件,编写程序,程序如下:

#include

<reg52.h> #include <intrins.h> #define uint unsigned int

#define uchar

unsigned char void defay(uint z) {

uint x,y;

for(x=100;x>0;x--) for(y=z;y>0;y--); }

uchar temp; void

main() {

temp=0xfe; p2=temp; while(1)

{

temp=_crol_(temp,1); defay(500); p2=temp;

} }

2)、编写程序使8个led灯从两边向中间循环点亮。

编写程序,程序如下:

uchar temp,m,n;

uint i; void main() {

m=0xfe; n=0x7f;

while(1) {

p2=m&n;

m=_crol_(m,1);

n=_cror_(n,1); if(m==0xef)

{

m=0xfe;

n=0x7f; } }

3)、编写程序使用一根或二根i/o线接一开关控制流水灯流向。

编写程序,程序如下:

sbit p15=p1^5;

void main() { temp=0xfe;

p2=temp; while(1)