AutoLeaders控制组——51单片机学习笔记(一)

一、简单介绍单片机

单片机(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);
		}
}
  • 18
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值