51单片机基础实验--发光二极管点亮并闪烁

在实验一的基础上,我们做第二个实验。

原理图如下:

51单片机点亮LED并闪烁

汇编程序如下:

;------------------------------------------------------
;???????  点亮发光二极管并使其闪烁
; 功能:点亮发光二极管并使其以1S间隔闪烁
;------------------------------------------------------
??????  DLS EQU P1.0??;位定义
??????  ORG 0000H?????;伪指令,指定程序从0000H开始存放
??????  LJMP MAIN???? ;跳转指令,程序跳转至MAIN处执行
??????  ORG 0030H?????;伪指令,指定程序从0030H开始存放
MAIN: MOV SP, #60H ;给堆栈指针赋初值
LIGHT: CLR DLS??????  ;P1.0置0,LED点亮
??????  LCALL DEL1S??  ;调用1S延时子程序
??????  SETB DLS?????  ;P1.0置1,LED熄灭
??????  LCALL DEL1S??  ;调用1S延时子程序???????????? 
??????  LJMP LIGHT ??  ;跳转指令,跳转至LIGHT处继续执行
;1S延时子程序(11.0592MHz晶振,误差0微秒)
DEL1S: MOV R5, #089H 
DL1S0: MOV R6, #0A4H
DL1S1: MOV R7, #013H
??????  DJNZ R7, $
??????  DJNZ R6, DL1S1
??????  DJNZ R5, DL1S0
??????  RET
??????  END??????????  ;程序结束指令

C语言程序1如下:

/* 该实验是点亮发光二极管并使其闪烁,功能是点亮发光二极管并使其以1S间隔闪烁*/
#include<reg52.h>//包含reg.52文件
sbit DLS=P1^0;//位定义
unsigned int a;//定义循环用变量
void main()//main函数
{
??????while(1)//while循环
?????{
??????????  DLS=0; //点亮LED
??????????  a=50000; //变量赋值
??????????  while(a--);
??????????  a=50000;
??????????  while(a--);//1S延时,不是很精确
??????????  DLS=1; //熄灭LED
??????????  a=50000; //变量赋值
??????????  while(a--);
??????????  a=50000; 
??????????  while(a--);//1S延时,不是很精确
?????  }
}

C语言程序2如下:

/*该实验是点亮发光二极管并使其闪烁,功能是点亮发光二极管并使其以1S间隔闪烁*/
#include<reg52.h>//包含reg.52文件
#define uint unsigned int//宏定义
#define uchar unsigned char
sbit DLS=P1^0;//位定义
void delay();//声明延时函数
void main()//main函数
{
????????  while(1)//while循环
????????{
??????????????  DLS=0; //点亮LED
??????????????  delay();//调用1S延时子程序
??????????????  DLS=1; //熄灭LED
??????????????  delay();//调用1S延时子程序
????????}
}
void delay()//1S延时子程序
{
????????  uint x,y;//定义循环用变量
????????  for(x=1000;x>0;x--)//for循环嵌套
??????????????????  for(y=110;y>0;y--);
}

C语言程序3如下:

/*该实验是点亮发光二极管并使其闪烁,功能是点亮发光二极管并使其以1S间隔闪烁*/
#include<reg52.h>//包含reg.52文件
#define uint unsigned int//宏定义
#define uchar unsigned char
sbit DLS=P1^0;//位定义
void delay(uint z);//声明延时函数
void main()//main函数
{
????????  while(1)//while循环
????????  {
?????????????????  DLS=0; //点亮LED
?????????????????  delay(1000);//调用1S延时子程序
?????????????????  DLS=1; //熄灭LED
?????????????????  delay(1000);//调用1S延时子程序
??????????}
}
void delay(uint z)//1S延时子程序
{
????????  uint x,y;//定义循环用变量
????????  for(x=z;x>0;x--)//for循环嵌套
??????????????????  for(y=110;y>0;y--);
}
C语言程序4如下:
/*利用定时/计数器T0从P1.0输出周期为1s的方波,让发光二极管以1HZ闪烁,设晶振频率为12MHz。*/
#include<reg52.h> //52单片机头文件
#define uint unsigned int //宏定义
#define uchar unsigned char//宏定义
sbit P1_0=P1^0;
uchar a;
void main()//主函数
{
????????  TMOD=0x01;//设置定时器0为工作方式1
????????  TH0=(65536-50000)/256;
????????  TL0=(65536-50000)%256;
????????  EA=1;//开总中断
????????  ET0=1;//开定时器0中断
????????  TR0=1;//启动定时器0
????????  while(1);//等待中断产生
}
 
void timer0() interrupt 1
{
????????  TH0=(65536-50000)/256;
????????  TL0=(65536-50000)%256;
????????  a++;
????????  if(a==20)
????????  {
??????????????????  a=0;
??????????????????  P1_0=~P1_0;
????????  }
}

本实验实现了单片机控制点亮一个发光二极管并使其以1S时间间隔闪烁,增加了对51系列单片机延时函数等的了解。总体看来,汇编语言编写的延时函数,相对来说是很精确的;而C语言编写的延时函数是不很准确的。

  1. 51单片机基础实验1--点亮发光二极管
  2. 51单片机基础实验--发光二极管点亮并闪烁
  3. 51单片机基础实验--流水灯1
  4. 51单片机基础实验--花样流水灯
  5. 51单片机基础实验--蜂鸣器

返回单片机目录, ARM目录, 返回首页