AutoLeaders控制组—51单片机学习笔记(一)
单片机简介
1.单片机,英文Micro Controller Unit,简称MCU
2.内部集成了CPU、RAM、ROM、定时器、中断系统及通讯接口等一系列电脑的常用硬件功能
3.单片机的任务是信息采集(依靠传感器)、处理(依靠CPU)和硬件设备(例如电机,LED等)的控制
4.单片机和计算机相比,单品机算是一个袖珍版计算机,一个芯片就能构成完整的计算机系统。但在性能上,与计算机相差甚远,但单片机成本、体积小、结构简单,在生活和工业控制领域大有所用。
5.应用领域广泛,如智能仪表、实时工控、通讯设备、导航系统等
一.开发工具
使用51单片机需要用到以下两个工具:
1.Keil5用来编写程序,操作单片机
2.STC-ISP 将程序下载到单片机
二.独立按键
1.介绍
相当于是一种电子开关,按下时开关接通,松开时开关断开,实现原理是通过轻触按键内部的金属弹片受力弹动来实现接通和断开
按键示意图:
K1~P3_1
K2~P3_0
K3~P3_2
K4~P3_3
2.消抖
注意:由于弹性作用在开关按下和松开时按键会发生抖动
抖动所耗时间不确定。如下图:
此时则需要进行消抖。
消抖的方式有两种:
1.硬件消抖:通过增加电路、触发器等零件实现。
相比硬件消抖,软件消抖则更为简易。
2.软件消抖: 运用程序来延长时间冲掉抖动。
延时函数代码可从STC-ISP上获取。具体代码如下:(此代码)
#include <REGX52.H>
#include <INTRINS.H>
void delay(unsigned int xms)//可自行选择延迟多少毫秒
{
unsigned char i, j;
while(xms--){
_nop_();
i = 2;
j = 199;
do
{
while (--j);
} while (--i);
}
}
按键消抖时,需要检测按键是否松开。其代码如下:
if(P3_1==0)
{
delay(20);
while(P3_1==0);//按键是否松开
delay(20);
}
三.LED灯
1. 介绍
中文名:发光二极管
判断正负极:
正极 :
内电极较小 ,引脚较长
负极:
内电极较大,引脚较短
如图:
2. 控制LED亮灭
如下图可知:由于LED正极接通电源,负极也就是P2口应该接低电平,所以可以控制高低电平来控制LED是否亮
D1~8八个LED分别对应P2_0 ~7
因此想要哪一个LED亮只需要在其对应的P2口给低电平即可。
3.点亮一个LED灯:
注意:不能直接用二进制,需要转换为16进制。
代码如下:
#include <REGX52.H>
void main ()
{
P2=0xFE;//1111 1110
while(1)//循环进行一次赋值
{
}
}
4.LED闪烁:
为了使LED灯进行闪烁,可以用到上文提过的延时函数进行延长时间来实现操作。
代码如下:
#include <REGX52.H>
#include <INTRINS.H>
void Delay500ms() //@12.000MHz
{
unsigned char i, j, k;
_nop_();//需要有INTRINS.H头文件
i = 4;
j = 205;
k = 187;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void main()
{
while(1)
{
P2=0xFE;
Delay500ms();
P2=0xFF;
Delay500ms();
}
}
5.LED流水灯:
在LED闪烁的基础上加以改造使LED从D1闪烁到D8。
代码如下:
#include <REGX52.H>
#include <INTRINS.H>
void Delay500ms() //@12.000MHz
{
unsigned char i, j, k;
_nop_();
i = 4;
j = 205;
k = 187;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void main()
{
while(1)
{
P2=0xFE;
Delay500ms();
P2=0xFD;
Delay500ms();
P2=0xFB;
Delay500ms();
P2=0xF7;
Delay500ms();
P2=0xEF;
Delay500ms();
P2=0xDF;
Delay500ms();
P2=0xBF;
Delay500ms();
P2=0x7F;
Delay500ms();
}
}
6.独立按键控制LED状态:
通过取反符(~)来实现按键对LED灯的状态的控制。
代码如下:
#include <REGX52.H>
void Delay(xms)
{
unsigned char i, j;
while(xms){
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
xms--;
}
}
void main()
{
while(1)
{
if(P3_1==0)
{
Delay(20);
while(P3_1==0);
Delay(20);
P2_0=~P2_0;
}
}
}
7.独立按键控制LED显示二进制:
通过引用新的变量LEDnum来实现二进制
代码如下:
#include <REGX52.H>
void delay(unsigned int xms)
{
unsigned char i, j;
while(xms)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
xms--;
}
}
void main()
{
unsigned char LEDnum=0;
while(1)
{
if(P3_1==0){
delay(20);
while(P3_1==0);
delay(20);
LEDnum++;
P2=~LEDnum;
}
}
}
8.独立按键控制LED移位:
LED移位在LED二进制的基础上运用了移位运算符(<<)
代码如下:
#include <REGX52.H>
void delay(unsigned int xms) //@12.000MHz
{
unsigned char i, j;
while(xms)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
xms--;
}
}
void main()
{ unsigned char num=0;
P2=~0x01;
while(1){
if(P3_1==0)
{
delay(20);
while(P3_1==0);
delay(20);
num++;
if(num>=8){
num=0;
}
P2=~(0x01<<num);
}
if(P3_0==0)
{
delay(20);
while(P3_0==0);
delay(20);
if(num==0){
num=7;
}else{
num--;
}
P2=~(0x01<<num);
}
}
}
四.数码管
1.数码管介绍:
数码管:是一种简单、廉价的显示器,是由多个发光二极管封装在一起组成“8”字型的器件
2.数码管引脚定义:
51单片机数码管公共端共阴极连接 ,其对应的阳极也共同连接在一起,如下图所示:
3.静态数码管显示
想要控制某一个特定的数码管亮,到这时就需要用到段选和位选
位选:控制特定数码管是否亮
段选:控制数码管显示特定数字
位选:根据P2_2 ~4三个引脚代表三位的二进制数,来使二进制单片机数码管第几位亮,如:P2_4=0;P2_3=1;P2_2=1,则为第5根数码管亮。
段选:数码管中的LED都由P0口来控制,由于位选公共段是共阴极,这些LED引脚连接正极,因此要是P0口为高电平才能使LED发光,根据数码管那副图,寻找对应的LED灯。例如:想要显示数字6,则P0=0x7D。
unsigned char table []={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x3E,0x40};
void sum(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=table [Number];
}
3.动态数码管显示
如果想要多个数码管具体第几位显示什么数字,该怎么办呢?利用人眼视觉暂留和数码管显示的余晖让单片机不断很快地扫描所指定的数字。
此时只需在静态数码管的基础上消除拖影,动态数码管代码如下:
unsigned char table []={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x3E,0x40};
void sum(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=table [Number];
delay(1);
P0=0x00;//进行清零防止拖影
}
到此结束,感谢观看。