学习51单片机的第二节课,学习的是LED使用,俗语“点亮你的第一盏灯”。
由下图可以看到,P1组I/O口的8个接口分别接着一个LED灯,并且当P1上的某个口为低电平时,LED就会亮。
#include<reg52.h>
sbit LED0=P1^0; // 用自己写的标志 LED0 表示 I/O口 P1^0
sbit LED1=P1^1;
void main()
{
LED0 = 0; //P1^0口给低电平
LED1 = 0; //P1^1口给低电平
while(1); //不让程序结束,防止程序跑飞,死机。
以上程序只是让灯一直亮着,之后可以再写一些花式灯法
LED向右逐个点亮 ,向左逐个点亮,有两头向中间移动点亮;
Delay.h
#ifndef __DELAY_H__
#define __DELAY_H__
#include <reg51.h>
//微妙级延时, t = 2n+6(us); 若要精确延时请使用汇编;
void DelayUs2x(unsigned char n);
//毫秒级延时,t = n(ms);
void DelayMs(unsigned char n);
void DelayUs2x(unsigned char n)
{
while(--n);
}
void DelayMs(unsigned char n)
{
while(--n)
{
DelayUs2x(245);
DelayUs2x(245);
}
}
//这种延时方式可以做不是特别精确的延时,原因主要在于while(--n)在编译成机器指令后的不确定性
//(基本指令是确定的,但是涉及到编译器差异,其他中断影响等因素),
//还有函数调用过程中的其他处理,导致了指令数的相对不确定。
#endif
Move.h
#ifndef __MOVE_H__
#define __MOVE_H__
#include "Delay.h"
void R_move() //LED灯向右移动
{
unsigned char i, w;
for(i=0, w=0x01; i<8; i++ )
{
P1 = ~w; //取反是11111110,第一个灯先亮
w <<= 1; //11111110中的0向左移动,自动补1
DelayMs(1000);
}
}
void L_move() //LED灯向左移动
{
unsigned char i, w;
for(i=0, w=0x80; i<8; i++ )
{
P1 = ~w; //取反是01111111,最后一个灯先亮
w >>= 1;
DelayMs(1000);
}
}
void M_move() //向两边移动
{
P1 = 0x7e; //01111110
DelayMs(1000);
P1 = 0xbd; //10111101
DelayMs(1000);
P1 = 0xdb; //11011011
DelayMs(1000);
P1 = 0xe7; //11100111
DelayMs(1000);
}
#endif
led.c
#include <Move.h>
void main()
{
/*P1 = 0;
DelayMs(5000);
*/
unsigned char t = 5;
while(t)
{
P1 = 0;
DelayMs(1000); //使LED灯常亮一段时间
t--;
}
L_move();
R_move();
M_move();
}