一、实验目的 - 熟悉单片机系统相关硬件电路,程序下载方法;
- 掌握采用汇编语言与C语言开发单片机系统的程序结构;
- 掌握51系列单片机通用I/O口的使用。
二、实验前准备 - 搭建实验平台;熟练应用keil5,程序烧写器
- 根据实验内容编写好相关程序,并进行Proteus仿真。
三、实验内容 1、基本的流水灯。 根据图1电路,编写一段程序,使8个发光二极管D1、D2、D3、D4、D5、D6、D7、D8顺序(正序)点亮:先点亮D1,再点亮D2、D3……D8、D1……,循环点亮。每点亮一个LED,采用软件延时一段时间。 2、简单键控的流水灯。 不按键,按正序点亮流水灯;按下K1不松手,按倒序点亮流水灯,即先点亮D8,再顺序点亮D7、D6……D1、D8……。松手后,又按正序点亮流水灯。 3、键控的流水灯。 上电,不点亮LED,按一下K1键,按正序点亮流水灯。按一下K2键,按倒序点亮流水灯,按一下K3键,全部关闭LED。 四、实验原理图 如图1.1所示。 电路原理图如图1.1,AT89S52的P0.0~P0.7作为输出连接8个发光二极管,输出低电平0时对应发光二极管发光;由于发光二极管的导通电压为1.7V,所以HNIST-2型实验装置在电源与二极管之间加一个阻值为1K限流电阻保护二极管。 AT89S52的P2.0、P2.1作为输入连接2个按键K1、K2,若检测到P2.0=0,则说明K1键按下。 图1.1 跑马灯实验电路原理图
图1.2Proteus仿真图 1、基本的流水灯 设置延时函数使led灯依次有间隔的亮起 软件延时采用程序delay( j ),可调整延时时间。 2、简单键控的流水灯。 实现思路:由于是按下键不松手,键值一直保留,所以判断if(K1==0),即是按下K1, 采用if(K1==0)或if(K1==1),后接while(1)循环的模式。 3、键控的流水灯 由于是按一下键后马上松手,所以要设置一个变量b保留按键键值,要在延时程序中检测是否按键,当按键后立即设置b的值。 基本的流水灯: #include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
void delay(j) //延时函数
data uint j;
{ data uint i;
while(j--)
for(i=0;i<250;i++);
}
void main()
{ data uchar a;
a=1;
while(1)
{ P0=~a;
a=a<<1;
if(a==0)a=1;
delay(250);}
}
简单的键控流水灯:
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
void delay(uint i){
uchar t;
while(i--){
for(t=0;t<120;t++);
}
}
void main(){
data uchar a;
a=1;
while(P2==0xff){
P0=~a;
a=a<<1;
if(a==0)
a=1;
delay(250);
}
while(P2==0xfe)
{ P0=~a;
a=a>>1;
if(a==0)
a=128;
delay(250);
}
}
键控的流水灯:
#include <reg51.h>
#define uint unsigned int
#define uchar unsigned char
void delay(uint i)
{
uchar t;
data uchar b=0xfb;
while(i--)
{
if(P2==0xfe) b=0xfe;
if(P2==0xfd) b=0xfd;
if(P2==0xfb) b=0xfb;
for(t=0;t<120;t++);
}
}
void main()
{
data uchar a;
a=1;
while(P2==0xfe)
{
P0=~a;
a=a<<1;
if(a==0)
a=1;
delay(250);
while(P2==0xff)
{
P0=~a;
a=a<<1;
if(a==0)
a=1;
delay(250);
}
}
a=128;
while(P2==0xfd)
{
P0=~a;
a=a>>1;
if(a==0)a=128;
delay(250);
while(P2==0xff)
{
P0=~a;
a=a>>1;
if(a==0)a=128;
delay(250);
}
}
while(P2==0xfb)
{P0=0xff;}
} 图1.3基本的流水灯 图2.1简单的键控流水灯 图3.1键控流水灯(1) 图3.2键控流水灯(2) - 采用I/O口作为输出口时要考虑哪些因素?为什么实验装置中LED要串联一个电阻?
答:电压的大小(包括它能感知的最小电压作为高电平),电流的驱动能力例如 51的p0口若作为io口使用就要加上拉电阻,不然的话高电平是高阻态的形式。 还有就是io口默认是不是作为io口,有的io口有第二功能的。LED属于发光 二极管,本身的电阻非常的小,但要接入电路时,要注意进行保护,因而要串联 一个电阻进行保护它。 - 采用I/O口作为输入口时要注意什么?键控的流水灯时为什么要在延时程序中检测是否按键?
答:当作为输出口时候就是单片机向外发出数据,或者再产生拉电流,单片机的拉电流一般要比灌电流小,基本上就能点亮2,3个LED,功率很有限,所以一般时候必须用驱动芯片来驱动单片机的外围器件!放在主程序里,每个延时周期内,只能检测按键一次,反应比较慢。放在延时程序里,检测时间间隔比较短,反应快 3、为什么延时程序要做一个函数? 答:为了提高程序的可执行度,使延时更加精确 九、实验总结 1、在C51中进行精确的延时子程序设计时,尽量不要或少在延时子程序中定义局部变量,所有的延时子程序中变量通过有参函数传递。 2、在延时子程序设计时,采用do…while,结构做循环体要比for结构做循环体好。 3、在延时子程序设计时,要进行循环体嵌套时,采用先内循环,再减减比先减减,再内循环要好 |