P1口上的第一个发光二极管L1不停地一亮一灭,闪烁的时间间隔为0.2秒
汇编:
ORG 0
START: CLR P1.0
LCALL DELAY
SETB P1.0
LCALL DELAY
LJMP START
DELAY: MOV R5,#20 ;延时子程序,延时0.2秒
D1: MOV R6,#20
D2: MOV R7,#248
DJNZ R7,$
DJNZ R6,D2
DJNZ R5,D1
RET
END
C语言:
#include <AT89X51.H>
sbit L1=P1^0;
void delay02s(void) //延时0.2秒子程序
{
unsigned char i,j,k;
for(i=20;i>0;i--)
for(j=20;j>0;j--)
for(k=248;k>0;k--);
}
void main(void)
{
while(1)
{
L1=0;
delay02s();
L1=1;
delay02s();
}
}
Lesson2_1
#include <REG52.H>
sbit P1_0=P1^0;//赋值法,第一个发光管闪烁
unsigned int a;//要定义变量
void main()
{while(1)
{P1_0=0;灯亮
a=50000;//最大值65535
while(a--);//while语句后面需要分号
P1_0=1;//灯灭
a=50000;//保持
while(a--);
}
}
Lesson2_2
#include <REG52.H>
#include <intrins.H>
sbit P1_0=P1^0;
unsigned int a,b,c;
void delay(unsigned int);//第一个灯闪烁,调用子函数法
void main()
{while(1)
{P1_0=0;
delay(2000);
P1_0=1;
delay(2000);
}
}
void delay(unsigned int x)
{
for(c=500;c>0;c--);
for(a=5000;a>0;a--);
for(b=x;b>0;b--);
}
Lesson3_3第一个灯闪烁,启用中断定时器法(内部中断T1)
#include<reg52.h>
sbit P11=P1^0;
unsigned char a,num;
void main()
{
num=0;
EA=1;//中断总允许
ET1=1;//开发T1的中断允许
TMOD=0x10;//工作方式2,16位,2的16次方=65536
TH1=(65536-50000)/256;//定时器高八位装数
TL1=(65536-50000)%256;//50ms
TR1=1;//启动定时器1
while(1)
{
if(num==2)//2次*50ms=1s
{
num=0;
P11=~P11;取反,灯灭
}
}
}
void time1() interrupt 3 using 1//标号,中断子函数无需函数声明
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
num++;
}