51单片机攻略—LED
入门篇中,完成了对51单片机编程的一系列基本操作,按位点亮了LED,此篇将从总线方式点亮发光二极管开始单片机LED编程。
一、程序实战
(一)LED相关
1、总线方式点亮P1所有LED(8个)
总线方式应将四个一组的二进制位化为十六进制数,进行低电平赋值。
点亮所有LED即令IO口全部输出低电平 00000000 -> 0x00。
#include <reg52.h>
void main(){
P1 = 0x00;
}
测试成功。
2、让一个LED灯闪烁
方法一:
#include <reg52.h>
sbit p1_1 = P1^0;
unsigned int a;
void main(){
while(1){
a = 50000;
p1_1 = 0;
while(a--);
a = 50000;
p1_1 = 1;
while(a--);
}
}
方法二:
#include "reg52.h"
#define uint unsigned int
#define uchar unsigned char
sbit LED1 = P1^0;
void delay(uint z){
uint x,y;
for (x = 200; x > 0; x--) {
for(y = z; y > 0; y--);
}
}
int main() {
while(1){
LED1 = 0;
delay(200);
LED1 = 1;
delay(200);
}
return 0;
}
测试成功。
补充:
关于单片机的基本时序:
机器周期和指令周期
(1)振荡周期:也称时钟周期,是为单片机提供时钟脉冲信号的振荡源的周期,查看单片机上晶振数值可知;
(2)状态周期:状态周期是时钟周期的两倍,是振荡周期二分频后得到;
(3)机器周期:一个机器周期包含6个状态周期S1~S6,也就是12个时钟周期。一个机器周期内CPU可完成一个独立的操作;
(4)指令周期:CPU完成一条操作所需的全部时间,每条指令执行时间都是由一个或几个机器周期组成,MCS-51中,有单周期指令、双周期指令和四周期指令。
3、让一组LED灯闪烁
#include <reg52.h>
unsigned int a;
void main(){
while(1){
a = 50000;
P1 = 0x00;
while(a--);
a = 50000;
P1 = 0xff;
while(a--);
}
}
测试成功。
4、实现一组流水灯
方法一:
#include <reg52.h>
sbit p1_1 = P1^0;
sbit p1_2 = P1^1;
sbit p1_3 = P1^2;
sbit p1_4 = P1^3;
sbit p1_5 = P1^4;
sbit p1_6 = P1^5;
sbit p1_7 = P1^6;
sbit p1_8 = P1^7;
unsigned int a;
void main(){
while(1){
a = 20000;
p1_1 = 0;
while(a--);
a = 20000;
p1_2 = 0;
while(a--);
a = 20000;
p1_3 = 0;
while(a--);
a = 20000;
p1_4 = 0;
while(a--);
a = 20000;
p1_5 = 0;
while(a--);
a = 20000;
p1_6 = 0;
while(a--);
a = 20000;
p1_7 = 0;
while(a--);
a = 20000;
p1_8 = 0;
while(a--);
a = 10000;
P1 = 0xff;
while(a--);
}
}
方法二:
#include "reg52.h"
#define uint unsigned int
#define uchar unsigned char
sbit p1_1 = P1^0;
sbit p1_2 = P1^1;
sbit p1_3 = P1^2;
sbit p1_4 = P1^3;
sbit p1_5 = P1^4;
sbit p1_6 = P1^5;
sbit p1_7 = P1^6;
sbit p1_8 = P1^7;
void delay(uint z){
uint x,y;
for (x = 100; x > 0; x--) {
for(y = z; y > 0; y--);
}
}
int main() {
while(1){
p1_1 = 0;
delay(100);
p1_2 = 0;
delay(100);
p1_3 = 0;
delay(100);
p1_4 = 0;
delay(100);
p1_5 = 0;
delay(100);
p1_6 = 0;
delay(100);
p1_7 = 0;
delay(100);
p1_8 = 0;
delay(100);
P1 = 0xff;
}
return 0;
}
方法三:
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
#include <intrins.h>
uchar i;
void delay(uint z){
uint x,y;
for (x = 100; x > 0; x--) {
for(y = z; y > 0; y--);
}
}
int main() {
i = 0xfe;
P1 = i ;
while(1){
i = _crol_(i,1);
delay(50);
P1 = i;
}
return 0;
}
测试成功。