51单片机基础实验--发光二极管点亮并闪烁
在实验一的基础上,我们做第二个实验。
原理图如下:

汇编程序如下:
;------------------------------------------------------ ;??????? 点亮发光二极管并使其闪烁 ; 功能:点亮发光二极管并使其以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语言编写的延时函数是不很准确的。
