AutoLeaders–控制组——邱文硕 _______单片机(单片机简介,LDE灯与数码管)笔记总结
说明:ALN表示auto leaders note即“要点”
1. 单片机简介
单片机是什么?
-
简单来说就是一个可编程的芯片,它的特点可通过不同程序和不同的电路实现不同产品的功能,价格相对便宜,功耗也低,存储空间与运行能力较小,所以非常适合去做各种消费类、工业、医疗、航空等智能控制。这里只要有基本概念就行了,它就是一个大点的芯片,可以通过程序控制它就够了。
-
而实际上单片机由微处理器、存储器、输入/输出接口、定时器计数器和中断系统等部件组成
CPU:由运算和控制逻辑组成,同时还包括中断系统和部分外部特殊功能寄存器;
内部数据储存器(128B RAM):用以存放可以读写的数据,如运算的中间结果、最终结果以及欲显示的数据;
内部程序储存器(4KB ROM):用以存放程序、一些原始数据和表格;
ALN:RAM和ROM的区别:RAM是Random Access Memory,称作随机储存,掉电不会保存数据,而ROM是Read Only Memory在掉电的情况下,仍然能够保存原有的数据。这里可以类比一下手机的运存(运行内存),和储存空间。
定时/计数器:MCS—51共有两个16位的定时/计数器,以定时或计数功能,并以定时和计数结果对计算机进行控制;
可编程I/O口:四个8位并行I/O口,既可用作输入,也可用作输出;
T/C:两个定时/记数器,既可以工作在定时模式,也可以工作在记数模式;
-
功能实现:通过C语言/汇编语言的编写程序,再进行编译,仿真和调试,然后用编程器(烧录器)将程序写入单片机,进而控制芯片各引脚在不同时期输出不同电平(高电平和低电平),进而控制与单片机各个引脚相连的外围电路的电气状态
-
- 单片机的引线与引脚
1. 总线:总线(BUS)是计算机各部件之间传送信息的公共通道。微机中有内部总线和外部总线两类。内部总线是CPU内部之间的连线。外部总线是指CPU与其它部件之间的连线。 外部总线有三种: 数据总线DB(Data Bus), 地址总线 AB和控制总线。
2. 区分芯片引脚序号
电源和时钟引脚:Vcc(正极40脚)、Gnd(负极20脚)、XTAL1(19脚:片内振荡器反相放大器和时钟振荡电路输入端)、XTAL2(18脚:片内振荡器反相放大器的输出端)RST 等
*ALN:XTAL1(19脚)、XTAL2(18脚)是外接时钟引脚。XTAL1为片内震荡电路的输入端XTAL2为片内震荡电路的输出端。8051的时钟有两种方式,一种是片内时钟震荡方式,需在这两个引脚之间接石英晶体和震荡电容(一般取10p~30p),一种是外部时钟方式,即将XTAL1接地,外部时钟信号从XTAL2脚引入*
I/O口引脚:P0、P1、P2、P3,4组8位I/O口(每个口可独立控制)
P0口(39脚-32脚)---双向8位三态I/O口,无上拉电阻,为高阻状态,一般外接10KΩ的上拉电阻
P1口(1脚-8脚)---准双向8位I/O口,内带上拉电阻,无高阻状态,输入不能锁存,该口在作为输入使用前,要先向该口进行写1操作,然后单片机内部才可正确读出外部信号
P2口(21脚-28脚)---与P1口相似
P3口(10脚-17脚)---准双向8位I/O口,内带上拉电阻,第一功能与P1口相似,第二功能各引脚定义如下表,P3口的每一个引脚均可独立定义为第一功能的输入/输出或第二功能
- 二进制逻辑运算
与
必须都有,否则就没有
C语言中运算符为“&”
运算规则
0&0=0
0&1=1&0=0
1&1=1
运算符号:C语言中&表示“按位与”,变量之间按二进制位数对应关系一一进行与运算
或
只要其中之一有就有
C语言中运算符为“|”
运算规则
0|0=0
0|1=1|0=1
1|1=1
运算符号:C语言中|表示“按位或”,变量之间按二进制位数对应关系一一进行或运算
非
求反
C语言中运算符为!
运算规则
!0=1
!1=0
运算符号:C语言中表示“按位取反”,如01010101=(10101010);!表示对单一位进行运算
-
同或
- 必须相同,否则就没有
- 逻辑运算符为⊙
-
异或
- 必须不同,否则就没有
- 逻辑运算符为⊕
- C语言中有“按位异或”运算”^“
- 开发板介绍
独立按键
矩阵按键
一系列LED灯管组成的数字
点阵
复位按键,按动时程序从头执行
模数转换器,转换信息,调节LED灯的亮度
LED灯
蜂鸣器
红外接收设备
无线模块
- 位运算符
&按位与 |按位或 ^异或 ~取反 >>右移 <<左移
2.LED灯的应用
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GdwSumnd-1667668953089)(https://gitee.com/qiu-wenshuo/images/raw/master/image-20221105235739266.png)]
-
LED灯有两个长短不一的引脚,引脚较长的为正极,否则为负极,其中文名是发光二极管,具有单向导电性,所以利用电压方向可以控制LED灯的亮灭
-
在单片机开发板LED模块,位于寄存器P2口,CUP通过访问寄存器控制驱动器(硬件电路),通过驱动器给LED提供电压,控制LED灯的亮灭
-
由于一共有8个LED灯,所以需要有八位二进制数对每个分别控制。由于不支持二进制,(直接写会默认十进制)。要把二进制转化为十六进制,前面加上0x,具体转换方法请见附录。
ALN: P2是不能被识别为LED灯模块,需要提前加上一个头文件包含P2再应用#include <REGX52.H>
例如
#include <REGX52.H>
void main()
{
P2=0xfe;//1111 1110 使第一个LED灯亮起
}
这样就可以实现第一个灯的亮起
ALN:虽然上述代码可以实现目标功能,但是建议大家不要直接这样写,因为单片机在代码执行完会重复执行,为了避免错误,以后要在其中用while循环
如果让LED灯闪烁呢这里可以自己构造一个delay(xms)函数,为了其普适性,在stc-isp将其调为1ms,然后自己在函数输入值中调节时间,运用while循环将若干ms倒计时就能实现该过程
#include <REGX52.H>
#include <INTRINS.H>
void Delay(unsigned int xms)
{
unsigned char i, j;
while(xms)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
xms--;
}
}
void main()
{
while(1)
{
P2=0xFE;
Delay(500);
P2=0xFF;
Delay(500);
}
}
- 独立按键与LED
轻触按键:相当于是一种电子开关,按下时开关接通,松开时开关断开,实现原理是通过轻触按键内部的金属弹片受力弹动来实现接通和断开。
四个独立按键公共的一段都接到了电源的负极,另一端接到了L/O口上,分别连到P31、P30、P32、P33.
当按下时寄存器对应的值为1,否则为0。但是当按键时,由于机械触电的弹性作用,一个开关在闭合时不会马上稳定的接通,在断开时也不会一下子断开,所以开关闭合及断开会伴随一连串的抖动。
此时需要考虑到消抖,如何消抖呢,此时要用到delay函数和while循环,基本模型为:
if(P3_1/0/2/3==0)
{
delay(20); //待抖动殆尽
while(P3_1/0/2/3==0); //鉴别是否复位
delay(20); //再次等待抖动消失
}
3.数码管的应用
-
LED数码管:数码管是一种简单、廉价的显示器,是由多个发光二极管封装在一起组成的8字形器件,单片机开发板上一共有八位,每一位有一段只有一个出口。
-
引脚定义:阴极都连在了一个端口上,是共阴极连接,8个LED构成了一个完整的字形,当对数码管进行控制时,首先,需要定好位,即“位选”,由于每一位出口只有一个,所以通过确定那个出口来确定位;之后再选中位的LED,可以选定确定的多个。
-
通过上述就能知道,每一个数字的表示联系的LED组合是固定的,每一位对应的组合也是固定的,所以就直接能利用已经提前设置好的数组表示对应的数字。
ALN:数码管的消影:如果在程序中没有对每一次显示进行清零,将会导致显示的数字出现错乱,这是因为每次位选和段选之间几乎没有延迟,而且还没有对上次运行进行清零,就会导致运行时紊乱,出现重影,这时只需要将每次显示后进行delay1ms(作用是防止清零时间占比过大导致亮度过小,使其稳定显示),然后再令P0=0x00;进行清零
void Nixie(unsigned char Location,number)
{
unsigned char NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
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;
}
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;
}