实验一 跑马灯实验
- 格式:docx
- 大小:44.34 KB
- 文档页数:12
学号***********序号34
单片机原理与接口技术
实验报告
实验项目序号 实验一
实验项目名称 跑马灯实验
姓 名 王海标 专 业 电气工程及其自动化 班 级 电气15-2BF
完成时间 2017年3月18日 实验一 跑马灯实验
一、实验目的
1、 熟悉HNIST-2型单片机系统相关硬件电路,程序下载方法;
2、 掌握采用汇编语言与C语言开发单片机系统的程序结构;
3、 掌握51系列单片机通用I/O口的使用。
二、实验前准备
1、 完成作业3;
2、 根据实验内容编写好相关程序,并进行Proteus仿真。
三、实验内容
1、基本的流水灯。
根据图3.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、基本的流水灯
软件延时采用程序void delay(unsigned int c),可调整延时时间。
2、简单键控的流水灯。
由于是按下键不松手,键值一直保留,所以判断if(K1==0),即是按下K1,采用如例题所示的if(K1==0)或if(K1==1),后接while(1)循环的模式。
3、键控的流水灯
由于是按一下键后马上松手,所以要设置一个变量K保留按键键值,由于单片机本身原理图所致,K17、K18、K19、K20四个键已经固定为K17=P2^0、K18=P2^1、K19=P2^2、K20=P2^3所以直接运用,利用如if(K1==0)的条件判断语句来判断是否按下K1、K2、K3按键,实现键控流水灯。 五、实验原理图
如图3.1所示。
图3.1 跑马灯实验电路原理图
电路原理图如图3.1,AT89S52的P0.0~P0.7作为输出连接8个发光二极管,输出低电平0时对应发光二极管发光;由于发光二极管的导通电压为1.7V,所以HNIST-2型实验装置在电源与二极管之间加一个阻值为1K限流电阻保护二极管。
AT89S52的P2.0、P2.1、P2.2、P2.3作为输入连接4个按键K1、K2、K3、K4,若检测到P2.0=0,则说明K1键按下,其他键同理。
XTAL218XTAL119ALE30EA31PSEN29RST9P0.0/AD039P0.1/AD138P0.2/AD237P0.3/AD336P0.4/AD435P0.5/AD534P0.6/AD633P0.7/AD732P1.01P1.12P1.23P1.34P1.45P1.56P1.67P1.78P3.0/RXD10P3.1/TXD11P3.2/INT012P3.3/INT113P3.4/T014P3.7/RD17P3.6/WR16P3.5/T115P2.7/A1528P2.0/A821P2.1/A922P2.2/A1023P2.3/A1124P2.4/A1225P2.5/A1326P2.6/A1427U1AT89C51D0D1D2D3D4D5D6D7+5VK1K2K3K4六、源程序
1、简单流水灯
#include
#include
#define uint unsigned int
#define uchar unsigned char
void delay(unsigned int c);
sbit K1=P2^0; //定义引脚
sbit K2=P2^1;
sbit K3=P2^2;
sbit D0=P0^0;
sbit D1=P0^1;
sbit D2=P0^2;
sbit D3=P0^3;
sbit D4=P0^4;
sbit D5=P0^5;
sbit D6=P0^6;
sbit D7=P0^7;
void delay(unsigned int c) //延时函数
{
unsigned char a, b;
for (;c>0;c--) {
for (b=50;b>0;b--)
{
for (a=100;a>0;a--);
}
}
}
void main() //主函数
{
unsigned char LED;
LED = 0xfe;
while (1)
{
P0 = LED; //P0=11111110
delay(50);
LED = LED << 1;
if (P0 == 0x00)
{
LED = 0xfe;
}
}
}
2、简单键控流水灯
#include
#include
#define uint unsigned int
#define uchar unsigned char
void delay(unsigned int c);
sbit K1=P2^0; //定义引脚
sbit K2=P2^1;
sbit K3=P2^2;
sbit D0=P0^0;
sbit D1=P0^1;
sbit D2=P0^2;
sbit D3=P0^3;
sbit D4=P0^4;
sbit D5=P0^5;
sbit D6=P0^6;
sbit D7=P0^7;
void delay(unsigned int c) //延时函数
{
unsigned char a, b;
for (;c>0;c--)
{ for (b=50;b>0;b--)
{
for (a=100;a>0;a--);
}
}
}
void main() //主函数
{
unsigned char LED;
if(K1==0)
{
LED = 0xfe;
while (1)
{
P0 = LED; //P0=11111110
delay (50);
LED = LED << 1;
if (P0 == 0x00)
{
LED = 0xfe;
}
if(K1==1) //按下按键不松,跳出循环。
{
break; }
}
}
if(K1==1)
{
LED = 0x7F; //P0=011111111
while (1)
{
P0 = LED;
delay (50);
LED = LED >> 1;
if (P0 == 0x00)
{
LED = 0x7F;
}
if(K1==0) //松开按键,跳出循环。
{
break;
}
}
}
}
3、键控流水灯
#include
#include
#define uint unsigned int
#define uchar unsigned char
void delay(unsigned int c);
sbit K1=P2^0; //定义引脚
sbit K2=P2^1;
sbit K3=P2^2;
sbit D0=P0^0;
sbit D1=P0^1;
sbit D2=P0^2;
sbit D3=P0^3;
sbit D4=P0^4;
sbit D5=P0^5;
sbit D6=P0^6;
sbit D7=P0^7;
void delay(unsigned int c) //延时函数
{
unsigned char a, b;
for (;c>0;c--)
{ for (b=50;b>0;b--)
{
for (a=100;a>0;a--);
}
}
}
void main() //主函数
{
unsigned char LED;
unsigned char i;
LED = 0x00; //先全亮
if(K1==0) //按下K1,顺序熄灭。
{
while (1)
{
LED = 0x00;
delay(20);
for (i = 0 ;i < 9 ; i++)
{
P0 = LED;
delay (20);
LED = LED << 1;
LED = LED | 0x01;
if(K2==0) break;