电子信息工程系实验报告
课程名称:单片微型计算机与接口技术 实验项目名称:实验三 流水灯实验 实验时间:20##-11-21班级:**** 姓名:**** 学号:****
一、实 验 目 的:
1、进一步熟悉keil仿真软件、proteus仿真软件的使用。
2、了解并熟悉单片机I/O口和LED灯的电路结构,学会构建简单的流水灯电路。
3、掌握C51中单片机I/O口的编程方法和使用I/O口进行输入输出的注意事项。
二、实 验 环 境:
硬件:windows 7
软件:keil 4, Proteus 7.8
三、实验原理:
输入输出接口的作用:数据缓冲功能;信号转换功能;接受和执行CPU命令的功能。
MCS-51系列单片机有四组8位并行I/O口,记作P0、P1、P2和P3。每组I/O口内部都有8位数据输入缓冲器、8位数据输出锁存器及数据输出驱动等电路。
四组并行I/O端口即可以按字节操作,又可以按位操作。当系统没有扩展外部器件时,I/O端口用作双向输入输出口;当系统作外部扩展时,使用P0、P2口作系统地址和数据总线、P3口有第二功能,与MCS-51的内部功能器件配合使用。
以P1口为例,内部结构如下图所示:
图 P1口的位结构
图1 P1口的位结构
作输出时:输出0时,将0输出到内部总线上,在写锁存器信号控制下写入锁存器,锁存器的反向输出端输出1,下面的场效应管导通,输出引脚成低电平。输出1时,下面的场效应管截止,上面的上拉电阻使输出为1。作输入时:P1端口引脚信号通过一个输入三态缓冲器接入内部总线,再读引脚信号控制下,引脚电平出现在内部总线上。
四个并行口使用的注意事项如下:
1、如果单片机内部有程序存贮器,不需要扩展外部存贮器和I/O接口,单片机的四个口均可作I/O口使用;
2、四个口在作输入口使用时,均应先对其写“1”,以避免误读;
3、P0口作I/O口使用时应外接10K的上拉电阻,其它口则可不必;
4、P2可某几根线作地址使用时,剩下的线不能作I/O口线使用;
5、P3口的某些口线作第二功能时,剩下的口线可以单独作I/O口线使用。
四、实验内容及过程:
1、建一个keil项目程序 建一个protues电路图的过程
(1)protues电路图:一个LED灯 一个开关
图一 一个LED灯 一个开关protues电路图
(2)keil项目程序:程序1、开关控制灯亮灭
程序2、开关按下灯闪三下
程序1代码如下:
#include"reg52.h"
#define uint unsigned int
#define uchar unsigned char
sbit kg=P1^0 ;
sbit deng=P2^0;
}
void main()
{
while(1)
{ kg=1;
if(kg==0)
deng=1;
else
deng=0;
}
}
程序2代码如下:
#include"reg52.h"
#define uchar unsigned char
#define uint unsigned int
sbit kg=P1^0 ;
sbit deng=P2^0;
void delay_50ms(uint t)
{
uint j;
for(;t>0;t--)
for(j=6245;j>0;j--);
}
void main()
{
while(1)
{
uchar i;
deng=0;
kg=1;
if(kg==0)
for(i=0;i<3;i++)
{
deng=1;
delay_50ms(10);
deng=0;
delay_50ms(10);
}
else
deng=0;
}
}
2、一个keil项目程序 建一个protues电路图
(1) protues电路图:8个LED灯 两个开关(类型 数量自定)
图二 8个LED灯protues电路图
(2) keil项目程序:程序3、单向流水灯
程序4、双向流水灯(自选 移位)
程序3代码如下:
#include"reg52.h"
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
void delay_50ms(uint t)
{
uint j;
for(;t>0;t--)
for(j=6245;j>0;j--);
}
void main()
{ uchar i;
while(1)
{
P2=0x01;
for(i=0;i<8;i++)
{
delay_50ms(10);
P2=_crol_(P2,1);
delay_50ms(10);
}
}
}
程序4代码如下:
#include"reg52.h"
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
uchar a,b;
void delay_50ms(uint t)
{
uint j;
for(;t>0;t--)
for(j=6245;j>0;j--);
} void main()
{ uchar i;
while(1)
{
a=0x01;
b=0x80;
P2=a|b;
for(i=0;i<3;i++)
{
delay_50ms(10);
a=_crol_(a,1);
b=_cror_(b,1);
P2=a|b;
delay_50ms(10);
}
}
}
五、实验结果及分析:
protues电路图见下图:
在对各个程序生成的hex文件对其进行仿真,运行后,验结果和实验预期一样。
六、实验总结:
通过本次的实验,熟悉keil仿真软件、proteus仿真软件的使用。了解并熟悉单片机I/O口和LED灯的电路结构,学会构建简单的流水灯电路。掌握C51中单片机I/O口的编程方法和使用I/O口进行输入输出的注意事项
第二篇:单片机流水灯实验
实验二 单片机并口简单应用(流水灯)
实验目的
1、了解单片机汇编语言程序的基本结构
2、了解单片机汇编语言程序的设计和调试方法
3、掌握顺序控制程序的简单编程
实验仪器
单片机开发板、万利仿真机、稳压电源、计算机
实验原理
1、 流水灯硬件电路
如图4-1所示,流水灯硬件电路由移位寄存器74LS164、功能选择开关J502、二极管、三极管、单片机并口(P0)、限流电阻等组成。发光二极管连接成共阳极结构。发光二极管点亮的条件是:阳极接高电平、各阴极接低电平。因此,通过程序控制74LS164的Q0端。Q0端输出0,公共端阳极就接成高电平,然后再按一定规则从P0口输出数据,发光二极管就会点亮。
图4-1 流水灯电路图
2、 单片机流水灯程序设计
由上图可知,发光二极管要点亮,需要先把J502的2、3脚相连,三极管Q500导通,然后从P0口输出数据。
(1)控制三极管导通程序
控制三极管有两种方法,第一种:在74LS164的第8脚产生一个正脉冲,此时1脚为0,三极管就导通;为1,三极管就截止。
第二种:在单片机IO模拟74LS164时序,一次输出一个字节,只要Q0=0即可控制三极管开通。为1,三极管截止。
两种方法的程序流程如图4-2所示。
图4-2 流水灯位选信号控制
(2)产生流水灯效果程序
三极管导通后,就可以从P0口输出数据控制发光二极管。P0口输出数据既可以编写程序逐个输出,也可以将输出数据序列定义在存储器中,然后用读程序存储器指令逐个取出并输出到P0口。
程序流程图如图4-3所示。
图4-3 流水灯程序流程图
实验内容
/*********************************
功能:流水灯(间隔200ms)
**********************************/
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit LEDDIN=P2^3; //位声明
sbit LEDCLK=P3^4;
void delay_1ms(uchar z);//函数声明
void delay_50ms(uchar t);
void mian()
{
uchar i;
for(i=0;i<7;i++)//关闭数码管
{
LEDDIN=1;
LEDCLK=0;
LEDCLK=1;
}
LEDDIN=0;
LEDCLK=0;
LEDCLK=1; //产生一个脉冲,使三极管导通
P0=0xfe;
delay_50ms(4); //延时200ms
while(1)
{
P0=_crol_(P0,1);
delay_50ms(4);
}
}
void delay_1ms(uchar z)//延时1ms
{
uint x,y;
for(x=z;x>0;x--)
for(y=123;y>0;y--);
}
void delay_50ms(uchar t)//延时50ms
{
uint j;
for(;t>0;t--)
for(j=6245;j>0;j--);
}
实验思考题
1、请把学号后两位数进转换成二进制数,然后依次点亮其中为1对应的二极管,写出输出序列。例如,60号转换成二进制后是0011 1100B,依次点亮四个1对应的二极管,输出序列是0DFH, 0EFH, 0F7H, 0FCH.(从低位到高位也可以)
答:
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit LEDDIN=P2^3; //位声明
sbit LEDCLK=P3^4;
uchar code table[]={0xfb,0xfe,0xef,0xdf,0xbf,0x7f}//输出序列
void delay_1ms(uchar z);//函数声明
void mian()
{
uchar i;
for(i=0;i<7;i++)//关闭数码管
{
LEDDIN=1;
LEDCLK=0;
LEDCLK=1;
}
LEDDIN=0;
LEDCLK=0;
LEDCLK=1; //产生一个脉冲,使三极管导通
P0=0xff; //关闭二极管
delay_1ms(2); //延时2ms
while(1)
{
for(i=0;i<6;i++)
{
P0=table[i];
delay_1ms(5);
}
}
}
void delay_1ms(uchar z)//延时1ms
{
uint x,y;
for(x=z;x>0;x--)
for(y=123;y>0;y--);
}
2、 单片机P0口为何要加上拉电阻?
答:
由于51单片机P0口设计成开漏极的结构:
1.一般51单片机的P0口在作为地址/数据复用时不接上拉电阻;
2.作为一般的I/O口时用时,由于内部没有上拉电阻,故要接上上拉电阻;
3.当p0口用来驱动PNP管子的时候,就不需要上拉电阻,因为此时的低电平有效;
4.当P0口用来驱动NPN管子的时候,就需要上拉电阻的,因为此时只有当P0为
1时候,才能够使后级端导通。
实验调试与心得
本次实验第一次由我们自己写程序自己调试,在调试的过程中发现关闭数码时,产生脉冲中加一个延时后数码管就没办法全部关闭。调试了很久还是没找去原因所在,只好把延时去掉。我在调试时将延时程序延时误差精确到4us。通过本次实验使我掌握了51单片机I/O并口的简单应用,并且也了解到74LS164的工作原理。