51单片机笔记(一)

对单片机理解

1.单片机实质上是一个微型计算机,它是计算机的缩小版。拥有芯片、CPU、随机存储器RAM、只读存储器ROM、多个IO口中断系统、定时器等。主要也是二进制数。学习内容:C语言、电子电路基础、计算机原理
2.单片机可以设置个性流水灯、键盘输入、蜂鸣器音乐、点阵屏显示、计算器、屏幕显示、电机转动、信号捕捉、蓝牙控制…在生活中随处可见,应用很广。

小知识(一):点亮第一颗led灯

点亮一个灯的前提是要有电压,对于51单片机来说只有高电压(5V)和低电压(0V),而在单片机内部是二进制数。所以有用1来代表高电压,0代表低电压。在这里插入图片描述
原理图中可以看出P1 ^ 0 ~P1 ^ 7的另一端全部连接在接口1,若跳线帽连接,则电压为5V,只用给另一端赋值0或者1就可以让这个灯亮或者不亮。假设我要让第一个灯亮。
方式一: 将P1^0 这个接口给定义(定义为LDE1),然后给定义的接口赋值0就能实现第一个LED灯点亮。给接口定义时一定要用大写字母"P"。否则会出现程序报错。

#include <reg52.h>       //头文件
sbit LED1=P1^0;		//定义接口为LED1
void main()
{
	LED1=0;		//赋值0给LED1
}

方式2:直接给P1口赋值,不用定义。(P1口有8个灯泡,所以要想让第一个灯泡亮需要让第0位为0其余的赋值为1。所以二进制格式为1111 1110,当然用二进制格式太麻烦,可以转换为十进制254,二进制转换为十进制也比较麻烦。所以可以用16进制来表示1111 1110,16进制0XFE.)代码如下:

#include<reg52.h>
void main()
{
	P1=0xFE;
}

以上就是两种点亮第一个LED灯的方法。

小知识(二):实现LED闪烁程序

原理:实现LED灯闪烁程序只用让LED灯点亮后然后在关闭就可以。但是单片机执行程序的时间特别短,如果只执行点亮和熄灭,因为人眼会有延迟,所以就观察不到LED灯闪烁。所以我们需要在执行灯点亮和熄灭进行延时处理(1秒左右)。而延时有程序延时和延时函数。
方式一:程序延时
定义一个变量,给这个变量一个较大初始值,让这个变量进行自减来程序延时.


    #include <reg52.h>
    unsigned  int i;//定义一个无符号整形变量i

void main()
{
	while(1)//一直循环下去
	{
		i=50000;//给i赋值(小于65535)	
		P1=0;//点亮全部LED灯
		while(i--);//程序延时
		i=50000;
		P1=0xff;//关闭LED灯
		while(i--);//程序延时
	}
}

**方式二:**延时函数延时
定义一个延时函数(毫秒级):

void delay(unsigned int n)
{
    unsigned int i,j;
    for(i=n;i>0;i--)
        for(j=114;j>0;j--)
}

使用延时函数的代码:

#include <reg52.h>
void delay(unsigned int n)
{
    unsigned int i,j;
    for(i=n;i>0;i--)
        for(j=114;j>0;j--)
}
void main()
{
	P1=0;
	while(1)
	{
		P1=~P1;//取反
		delay(2000);延时两秒
	}
}		

"~"是一个取反运算符,比如P1开始时是0,取反以后就是255这样就可以实现灯的熄灭和打开。

小知识(三):流水灯的实现

循环移位函数与左移右移运算符区别:

循环左移 循环右移 左移 右移
_crol _ _cror _ << >>
移出的高位放到该数的低位 移出的低位放到该数的高位 丢高位,0补低位 丢低位,高位补1

循环左移:

#include<intrins.h>
void test_crol (void){
	unsigned char a;
	unsigned char b;
	a=0xfe;//1111 1110
	b=_crol_(a,1); //二进制为1111 1101
}

左移:
a=0xfe;//1111 1110
b=a<<1;//1111 1100
流水灯原理:
点亮第一个灯,然后每次左移一位。每次左移移位后延时100ms。假如开始时第一个灯亮(1111 1110),执行一次循环左移函数就有(1111 1101)。依次类推。就可以实现流水灯程序。
代码实现:

#include<reg52.h>
#include<intrins.h>
#define uint unsigned int//uint 等价于unsigned int
#define uchar unsigned char//uchar等价于unsigned char
uchar temp; //定义一个中间变量
void delay(uint z)
{
 uint x,y;
 for(x=z;x>0;x--)
  for(y=114;y>0;y--);
} 
void main()
{
 temp=254;
 P1=temp;
 delay(100);
 while(1)
 {
  temp=_crol_(temp,1);//循环左移一位
  P1=temp;
  delay(100);
 }
}

这样就实现了流水灯的程序。

发布了37 篇原创文章 · 获赞 92 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_44895651/article/details/89423159