文章目录
一、简单介绍单片机
单片机(Micro Controller Unit, MCU) 内部集成了CPU、RAM、ROM、定时器、中断系统、通讯接口等一系列电脑的常用硬件功能。 单片机的任务 是信息采集(依靠传感器)、处理(依靠CPU)和硬件设备(例如电机,LED等)的控制。单片机算是一个袖珍版计算机,一个芯片就能构成完整的计算机系统。虽然在性能上,单片机与计算机相差甚远,但单片机成本低、体积小、结构简单,在生活和工业控制领域大有所用同时,学习使用单片机是了解计算机原理与结构的最佳选择。
51单片机 是指80年代Intel开发的8051单片机内核的统称,就是因为这个“8051”有个51,所以凡是与“8051”内核一样的单片机都统称为51系列单片机。
内核,通俗点理解就是一种代码,单片机的指令系统,即硬件制作就按照这些指令去完成,如灌溉一样,要灌溉那些地方,就把通路打开,而这些通路‘水渠和门阀’都是早就修建好的硬设备,只是具体的灌溉地点需要指令来完成。而51单片机就是一样的“水渠和门阀”,想灌溉,所有51单片机都使用的一样的灌溉指令。
单片机是8位的,所以P0、P1、P2、P3引脚都是8个为一组。
至于命名规则啥的,可以去STC宏晶科技官网和STC单片机b站官方介绍学习视频看,真的不重要,会用了自然就能看懂。
我用的51单片机型号是STC89C52RC/LE52RC
核心图:
二、LED
LED原理图如下:
2.1点亮LED
void main()
{
P2=0xEF;
while(1)
{
}
}
最左端一侧灯亮起
2.2让LED闪烁
实现代码如下:
#include <REGX52.H>
typedef unsigned char u8;
typedef unsigned int u16;
//这两行定义了两个别名u8和u16,分别代表无符号字符和无符号整数。
sbit LED1=P2^0;
//这行定义了一个位变量LED1,它连接到端口P2的第0位。
void delay_10us(u16 ten_us)
{
while(ten_us--);
}
//这是一个自定义函数,用于产生10微秒的延迟。它通过一个简单的循环来消耗时间,其中循环的次数由参数ten_us决定。(存在较大误差,由处理器内部决定)
void main()
{
while(1)
{
LED1=0;
delay_10us(50000);
LED1=1;
delay_10us(50000);
}
}
//晶振设为11.0592,延迟大概是488ms
灯光开始闪烁
2.3流水灯
实现代码如下:
#include <REGX52.H>
#include "intrins.h"
typedef unsigned char u8;
typedef unsigned int u16;
#define LED_PORT P2 //使用宏定义定义P2端口
void delay_10us(u16 ten_us)
{
while(ten_us--);
} //创建一个延迟
void main()
{
u8 i=0;
LED_PORT=0xfe;
delay_10us(50000);
while(1)
{
for(i=0;i<7;i++)
{
LED_PORT=_crol_(LED_PORT,1);
delay_10us(50000);
}
for(i=0;i<7;i++)
{
LED_PORT=_cror_(LED_PORT,1);
delay_10us(50000);
}
}
}
三、独立按键
原理图:
3.1 控制灯亮暗
#include <REGX52.H>
void main()
{
while(1)
{
if(P3_1==0)
{
P2_0=0;
}
else
{
P2_0=1;
}
}
}
按下第一个按钮,第一个灯变亮
3.2 控制LED显示二进制
#include <REGX52.H>
void Delay(unsigned int xms)
{
unsigned char data i, j;
while(xms--)
{
i = 2;
j = 199;
do
{
while (--j);
} while (--i);
}
}
void main()
{
unsigned char LEDNum=0;
while(1)
{
if(P3_1==0)
{
Delay(20);
while(P3_1==0);
Delay(20);
LEDNum++;
P2=~LEDNum;
}
}
}
3.3 控制LED移位
#include <REGX52.H>
void Delay(unsigned int xms)
{
unsigned char data i, j;
while(xms--)
{
i = 2;
j = 199;
do
{
while (--j);
} while (--i);
}
}
unsigned char LEDNum;
void main()
{
while(1)
{
if(P3_1==0)
{
Delay(20);
while(P3_1==0);
Delay(20);
LEDNum++;
if(LEDNum>=8)
{
LEDNum=0;
}
P2=~(0x01<<LEDNum);
}
if(P3_2==0)
{
Delay(20);
while(P3_2==0);
Delay(20);
if(LEDNum==0)
LEDNum=7;
else
LEDNum--;
P2=~(0x01<<LEDNum);
}
}
}
四、数码管
原理图:
4.1、静态
实现代码:
#include <REGX52.H>
unsigned char NixieTable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//数码管段码
void Nixie(unsigned char Location, Number)
{
switch(Location)
{
case 1:P2_4=1;P2_3=1;P2_2=1;break;
case 2:P2_4=1;P2_3=1;P2_2=0;break;
case 3:P2_4=1;P2_3=0;P2_2=1;break;
case 4:P2_4=1;P2_3=0;P2_2=0;break;
case 5:P2_4=0;P2_3=1;P2_2=1;break;
case 6:P2_4=0;P2_3=1;P2_2=0;break;
case 7:P2_4=0;P2_3=0;P2_2=1;break;
case 8:P2_4=0;P2_3=0;P2_2=0;break;
}
P0=NixieTable[Number];
}
void main()
{
Nixie(2,3);
while(1)
{
}
}
Nixie(2,3);在第二个数码管显示“3
4.2 动态
#include <REGX52.H>
unsigned char NixieTable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //ÊýÂë¹Ü¶ÎÂë±í
void Delay(unsigned int xms) //
{
unsigned char i, j;
while(xms--)
{
i = 2;
j = 199;
do
{
while (--j);
} while (--i);
}
}
void Nixie(unsigned char Location, Number)
{
switch(Location)
{
case 1:P2_4=1;P2_3=1;P2_2=1;break;
case 2:P2_4=1;P2_3=1;P2_2=0;break;
case 3:P2_4=1;P2_3=0;P2_2=1;break;
case 4:P2_4=1;P2_3=0;P2_2=0;break;
case 5:P2_4=0;P2_3=1;P2_2=1;break;
case 6:P2_4=0;P2_3=1;P2_2=0;break;
case 7:P2_4=0;P2_3=0;P2_2=1;break;
case 8:P2_4=0;P2_3=0;P2_2=0;break;
}
P0=NixieTable[Number];
Delay(1);
P0=0x00; //消影,清零
}
void main()
{
while(1)
{
Nixie(2,3); //第二个数码管显示3
Delay(1);
Nixie(3,7);
Delay(1);
Nixie(6,6);
Delay(1);
}
}