目录
以下就是一个渣渣的胡写日常了
前言
51单片机的学习代码,程序都已经过调试。所用的软件为keil。
一、点亮一个LED灯
#include"reg52.h"
sbit led=P2^0;
void main()
{
led=0;
while(1)
{
}
}
在编译过程中:
code,表示程序所占用FLASH的大小
data,数据存储器内部RAM占用的大小
xdata,数据储存器外部RAM占用的大小
程序的大小不是.hex的大小,而是编译后的code和data的大小
二、实现LED流水灯
#include "reg52.h"
#include "intrins.h" //实现左右移的库函数
typedef unsigned int u16; //对数据类型进行声明定义
typedef unsigned int u8;
#define led P2 //将P2口定义为led,用led代替P2
void delay(u16 i)
{
while(i--);
}
void main()
{u8 i;
led=~0x01; //取反
delay(30000);
while(1)
{for(i=0;i<8;i++)
{P2=~(0x01<<i); //将1向右移i位,然后将结果赋给P0口
delay(50000); //大约延时450ms
}
}
}
void delay(u16 i)
{
while(i--);
} 本函数实现延时效果。
led=~0x01,取反对应的二进制为1111 1110 最低位为0,因此最开始的D1指示灯会亮。
进入while循环,实现8个led灯循环点亮,每循环一次,点亮的小灯向右移动一个,即P2口的输出低电平要左移一位。
P2=~(0x01>>i)表示每增加i次增加1次,0x01就移动多少位。因为1(高电平)不会让led点亮,需要取反后变为低电平才能点亮,所以最后的结果需要取反后给P0口。
每次循环都要延迟一段时间,便于肉眼捕捉。
三、led闪烁实验
1.单个led闪烁
#include"reg52.h"
typedef unsigned int u16;
sbit led=P2^0;
void delay(u16 i)
{
while(i--);
}
void main()
{
while(1)
{
led=1;
delay(50000);
led=0;
delay(50000);
}
}
2.多个led灯闪烁逐渐点亮(最后led全亮)
#include"reg52.h"
typedef unsigned int u16;
typedef unsigned char u8;
sbit led=P2^0;
void delay(u16 i)
{
while(i--);
}
void main()
{u8 i;
led=0xfe;
delay(30000);
while(1)
{for(i=0;i<8;i++)
{P2=0xfe<<i;
delay(50000);
}
}
}
小遗憾(技术难题):
多个led灯的同时点亮,还没有实现。有大佬能指点一下吗?万分感谢